Você está na página 1de 46

PROGRAMAÇÃO DE SOFTWARE

BÁSICO

ARA0363 – 1003
Prof: Maximiano Correia Martins, D.Sc

Aula 2
Plano de Aula: 2ª Aula de Programação de software básico

• Entrada e saída
• Estruturas condicionais
• Estruturas de repetição ou iteração
• Introdução às estruturas de dados
Entrada e Saída

Para um programa de
computador é fundamental a interação
com dispositivos de entrada e de saída,
sendo o teclado como dispositivo de
entrada e o monitor como dispositivo
de saída a configuração mais comum.
Função printf
Uma função é um conjunto de comandos agrupados em um bloco, que recebe
um nome e através deste pode ser chamado, permitindo o reaproveitamento de
código já construído.
A função printf() é parte de um conjunto de funções pré-definidas armazenadas
em uma biblioteca padrão de rotinas da linguagem C.
Ela permite apresentar na tela os valores de qualquer tipo de dado. Para tanto,
printf() utiliza o mecanismo de formatação, que permite traduzir a
representação interna de variáveis para a representação ASCII que pode ser
apresentada na tela.
A função permite realizar a impressão de textos no monitor, ou seja, é
responsável pela saída de informações, utilizando a sintaxe:
printf("formato", argumentos);
Função printf()
printf("formato", argumentos);
O primeiro argumento da função é obrigatório, ou seja, no mínimo
deve-se informar um texto para ser impresso.
Os próximos argumentos são opcionais, pois nem sempre é necessário
apresentar uma informação em conjunto do texto.
O uso da função com mais de um argumento requer também o uso de
formatadores de tipo, conforme a tabela a seguir.
TABELA : Formatadores de tipo
Formatadores de tipo
• %c
imprime o conteúdo da variável com representação ASCII;
• %d
imprime o conteúdo da variável com representação decimal com sinal;
• %u
imprime o conteúdo da variável com representação decimal sem sinal;
• %o
imprime o conteúdo da variável com representação octal sem sinal;
• %x
imprime o conteúdo da variável com representação hexadecimal sem sinal.
Formatadores de tipo
Para converter variáveis em ponto flutuante, as seqüências são:

• %f
imprime o conteúdo da variável com representação com ponto decimal;
• %e
imprime o conteúdo da variável com representação em notação científica
(exponencial);
• %g
formato geral, escolhe a representação mais curta entre %f e %e.
Exemplo 1:
#include<stdio.h>
int main (void)
{
float a=15.333;
printf(“Valor de a = %e", a);
return 0;
}

O que será impresso??? R: 1.533300e+001


Exemplo 2:
#include<stdio.h>
int main (void)
{
int a=15;
printf("Valor de a = %x", a);
return 0;
}
R:f
Exemplo 3:
#include<stdio.h>
int main (void)
{
float total = 4 + 5.7;
printf("Total: %g", total);

R: 9,7
Função scanf
Similar à função printf(), a função scanf() também suporta uma
quantidade "n" de argumentos e permite que os dados digitados pelo
usuário sejam armazenados nas variáveis do programa.

Exemplo:
int mat;
scanf("%d", &mat);
Função scanf
int mat;
scanf("%d", &mat );
printf(“mat= %d” , mat );

Na linha 2 foi realizado o acionamento da função scanf().


No primeiro argumento foi informado o formato entre aspas, "%d", conforme apresentado para o tipo de
dado inteiro.
E o segundo argumento é o caractere ‘&’ acompanhado do nome da variável. A partir do segundo
argumento deve-se informar o endereço de memória no qual o dado será armazenado, por isso, foi utilizado
o caractere & acompanhado do nome da variável.
Exercício1:
• Construa um programa em C que calcule a média aritmética de duas
notas digitadas via teclado;
• Dica use scanf e printf;
Exercício2:
Companhia de Viagem: Construa um programa para criar um registro para armazenar todos os
dados de uma passagem de ônibus, efetuar a leitura das informações de uma passagem e
apresentar os dados lidos.

Dados da passagem:
int numero;
char origem;
char destino;
char data;
char horário;
int poltrona;
int plataforma;
Solução Exercício 1
#include<stdio.h>
int main (void)
{
float nota1,nota2,media;
printf(" digite a nota1 \n" );
scanf("%f",&nota1);
printf(" digite a nota2 \n" );
scanf("%f",&nota2);
media=(nota1+nota2)/2;
printf("Media: %f", media );

}
#include <stdio.h>
#include <stdlib.h>

/*Criar um registro para armazenar todos os dados de uma


passagem de ônibus, efetuar a leitura das informações de uma passagem e printf ("\nDigite a data da viagem: ");
apresentar os dados lidos.*/ scanf("%c",&passagem.data);
printf ("\nDigite o horario: ");
int main(int argc, char *argv[]) scanf("%c",&passagem.horario);
{
int escolha; printf ("\nDigite o numero da poltrona: ");
struct registro { scanf("%d",&passagem.poltrona);
int numero;
char origem; printf ("\nDigite a distancia: ");
char destino; scanf("%f",&passagem.distancia);
char data;
char horario; printf ("\nDigite o numero da plataforma: ");
int poltrona; scanf("%d",&passagem.plataforma);
float distancia;
int plataforma; break;
};
struct registro passagem; default:("opcao invalida");
break;
do { }
printf ("Selecione 1 para cadastrar passagem ou digite 0 para }
sair\n\n");
scanf("%d",&escolha);
switch (escolha){ while (escolha!=0);
case 1:printf ("\nDigite o numero da passagem: ");
scanf("%d",&passagem.numero); printf ("%s",&passagem);

printf ("\nDigite a origem: ");


scanf("%c",&passagem.origem); system("PAUSE");
return 0;
printf ("\nDigite o destino: "); }
scanf("%c",&passagem.destino);
Estruturas condicionais
Grande parte das vezes os problemas dão origem a programas que necessitam
possuir variados fluxos ou caminhos.

Para que as instruções em um programa tomem um caminho diferente, é


necessário que haja uma instrução responsável pela decisão de qual caminho
tomar.

Exemplos:
• If-else
• Switch
if-else
A cláusula if-else permite estabelecer um controle de fluxo no programa de forma que o
mesmo, possa escolher quando executar um determinado bloco de instruções ou não, ou
ainda, optar por executar um bloco de instruções em vez de outro.

A estrutura de decisão if-else permite também o uso de condições aninhadas (encaixadas)


que são úteis quando é necessário tomar uma decisão dentro de outra.

Exemplo de uso:

Programa em C que receba um número inteiro e verifique se este número é maior que 10.
Em caso afirmativo o programa deverá imprimir a mensagem: "Numero maior que 10".
if-else
#include <stdio.h>
#include <stdlib.h>
int main() {
int num;
printf("Informe o numero: ");
scanf("%d", &num);

if (num > 10)


printf(" Numero maior que 10");
}
if (num==10)
{
printf ("\n\nVoce acertou!\n");
printf ("O numero e igual a 10.\n");
} IFs aninhados
else O if aninhado é simplesmente um
{
if dentro da declarção de um outro
if (num>10)
if externo.
{
printf ("O numero e maior que 10.");
}
else
{
printf ("O numero e menor que 10.");
}
}
return(0);
Operadores Condicionais
Cláusula switch
Switch é um comando com possibilidades mais simplificadas que o if-else, desta forma,
permite apenas a comparação de igualdade com variáveis do tipo int, char e long.

O switch é vantajoso quando é necessário fazer muitas comparações, pois irá oferecer maior
agilidade na implementação.

A cláusula break é responsável pela parada na execução das instruções, pois caso não seja
colocada, as validações presentes no switch continuarão a ser executadas, mesmo que um
case já tenha resultado em verdadeiro.
switch (expressao) { switch ( valor )
case constante1: {
case 1 :
instrucoes1;
printf ("Domingo\n");
break; break;
case constante2:
instrucoes2; case 2 :
printf ("Segunda\n");
break;
break;
... ...
default: default :
printf ("Valor invalido!\n");
instrucoes;
}
}
Estruturas de repetição ou iteração
Estruturas de repetição permitem que um conjunto de instruções seja repetido até que se faça a
condição desejada.

Exemplos:

• Cláusula for

• Cláusula while
Cláusula for
A cláusula for é muito útil quando se deseja repetir uma ou várias
instruções por um número n de vezes.
Embora, o for possibilite variações, o formato de uso mais comum é
utilizar uma variável que é incrementada e verificada a cada iteração,
assim quando a variável atinge um determinado valor o laço se encerra.
Sintaxe:
for (inicialização; condição de laco ou parada; incremento) {
instrucao01;
instrucao02;
...
instrucaoN;
}
Cláusula while
Diferente do for, o while geralmente é empregado quando não se pode
determinar com certeza quantas vezes um bloco de comandos será
executado.
A condição do while é definida de forma muito similar à definição da
condição no if.
A diferença é que no if o objetivo é desviar o caminho de execução
para um fluxo de instruções ou outro, no while o objetivo será manter a
execução de um bloco de instruções em execução, assim como no for.
Sintaxe:

while (condicao de laco ou parada) {


instrucao01;
instrucao02;
...
instrucaoN;
}
Introdução às estruturas de dados
Em todos os programas são manipulados dados. Por isso é conveniente que esses dados
sejam armazenados de forma que sua utilização se torne mais fácil e eficiente. É daí que
surge o estudo das Estruturas de Dados.
O segredo de muitos programas rápidos está na maneira como seus dados são
organizados durante o processamento, ou seja, na estrutura de dados empregada pelo
programa.

EXEMPLOS:
Vetores ou arrays
Matrizes
Ponteiros
Vetores ou arrays
Vetor é um tipo de estrutura de dados que pode armazenar uma coleção sequencial e de tamanho fixo
de elementos do mesmo tipo. Um vetor é usado para armazenar uma coleção de dados, mas
geralmente é mais útil pensar em um vetor como uma coleção de variáveis do mesmo tipo.
Exemplo de declaração: int numero[100];
Em vez de declarar variáveis individuais, como numero0, numero1, ... e numero99, você declara uma
variável tipo vetor e usa numero[0], numero[1] e ..., numero[99] para representar variáveis individuais.
Um elemento específico em um vetor é acessado por um índice.
Todas os vetores consistem em locais de memória contínuos. O endereço mais baixo corresponde ao
primeiro elemento e o endereço mais alto ao último elemento.
Exercício de exemplo:
• Construa um programa em C que armazena 15 números inteiros
fornecidos pelo usuário em um vetor NUM e imprime uma lista dos
números lidos.
#include <stdio.h>
#include <stdlib.h>

int main() {
int i, NUM[15];

//lendo os valores
for (i=0; i<15; i++) {
printf("Informe um numero: \n");
scanf("%d", &NUM[i]);
}
//imprimindo os valores
for (i=0; i<15; i++) {
printf("Numero: %d \n", NUM[i]);
}
}
Matrizes
Uma matriz, ou vetor bidimensional é, em essência, uma lista de
vetores unidimensionais. Para declarar uma matriz de tamanho x linhas
e y colunas pode-se escrever algo da seguinte maneira.

tipo matrizNome [x][y];

Onde tipo pode ser qualquer tipo de dados válido em C e matrizNome


será um identificador C válido.
1 0 0
0 1 0
0 0 1
Ponteiros
Os ponteiros são recursos poderosos de programação C e (C ++) que o diferencia de outras
linguagens de programação populares, como Java e Python.
Ponteiros são usados no programa em C para acessar a memória e manipular o endereço. Em C,
pode-se criar uma variável especial que armazena o endereço (em vez do valor). É essa variável que
é chamada de variável de ponteiro, ou simplesmente um ponteiro.
Para declarar um ponteiro:
TipodeDado *nome_variavel_ponteiro;
int *p;
A declaração acima define p como variável ponteiro do tipo int.
Sintaxe de declaração de ponteiro
tipo *nome_ponteiro;
Onde temos:
tipo : é o tipo de dado da variável cujo endereço o ponteiro armazena.
*nome_ponteiro : O nome da variável ponteiro.
O asterisco * neste tipo de declaração determina que a variável será um ponteiro.
Exemplo de declaração de ponteiro:
int *ptr;
Por que usar ponteiros?
Ponteiros são muito úteis quando uma variável tem que ser acessada em diferentes partes
de um programa.
Neste caso, o código pode ter vários ponteiros espalhados por diversas partes do
programa, “apontando” para a variável que contém o dado desejado.
Caso este dado seja alterado, não há problema algum, pois todas as partes do programa
tem um ponteiro que aponta para o endereço onde reside o dado atualizado.
Existem várias situações onde ponteiros são úteis, por exemplo:

• Alocação dinâmica de memória


• Manipulação de arrays.
• Para retornar mais de um valor em uma função.
• Referência para listas, pilhas, árvores e grafos.
Operador (&) e operador (*)
O operador & é chamado de operador de referência. Fornece o endereço de
uma variável.
Da mesma forma, existe outro operador que obtém o valor do endereço, ele
é chamado de operador de remoção de referência *.
Nota: O sinal * ao declarar um ponteiro não é um operador de referência.
É apenas uma notação semelhante que cria um ponteiro.
Exemplo:
int *pc, c;
Alocação Estática de memória
Na alocação estática de memória, os tipos de dados tem tamanho predefinido.
Neste caso, o compilador vai alocar de forma automática o espaço de memória
necessário.
Sendo assim, dizemos que a alocação estática é feita em tempo de compilação.
Este tipo de alocação tende a desperdiçar recursos, já que nem sempre é possível
determinar previamente qual é o espaço necessário para armazenar as
informações.
Quando não se conhece o espaço total necessário, a tendência é o programador
exagerar pois é melhor superdimensionar do que faltar espaço.
Alocação dinâmica de memória
Na alocação dinâmica podemos alocar espaços durante a execução de
um programa, ou seja, a alocação dinâmica é feita em tempo de
execução.
Isto é bem interessante do ponto de vista do programador, pois
permite que o espaço em memória seja alocado apenas quando
necessário.
Além disso, a alocação dinâmica permite aumentar ou até diminuir a
quantidade de memória alocada.
Alocação dinâmica de memória
Um vetor é uma coleção de números fixos de valores de um único tipo. Ou seja, você precisa
declarar o tamanho de um vetor antes de poder usá-lo. Às vezes, o tamanho do vetor pode ser
insuficiente. Para resolver esse problema, pode-se alocar memória manualmente durante o tempo
de execução. Isso é conhecido como alocação dinâmica de memória na programação C.

malloc()

O nome "malloc" significa alocação de memória.

A função malloc aloca um espaço de memória e retorna um ponteiro do tipo void para o início do
espaço de memória alocado.
Sintaxe de malloc()
ptr = (tipo *) malloc (tamanho do byte)

Exemplo:

ptr = (int *) malloc (100 * sizeof (int));

Considerando que o tamanho de int é de 4 bytes, essa instrução aloca 400 bytes de memória. E, o
ponteiro ptr contém o endereço do primeiro byte na memória alocada.
Sizeof

A função sizeof determina o número de bytes para um determinado


tipo de dados.

É interessante notar que o número de bytes reservados pode variar de


acordo com o compilador utilizado.
Exemplo:

x = sizeof(int); //retorna 4 no gcc


free()
A memória alocada dinamicamente criada com malloc() não é liberada
por conta própria.
Deve-se usar explicitamente free() para liberar o espaço.

Sintaxe de free()
free(ptr);

Esta declaração libera o espaço alocado na memória apontada por ptr.


Exemplo: O Vetor Dinâmico
Se o programador define tipo e o número de elementos do vetor ele está
utilizando alocação estática.
Uma alternativa interessante é declarar um vetor como ponteiro, a fim de
utilizar alocação dinâmica.
Para isso deve-se usar a função malloc vista anteriormente.
Porém, esta função necessita saber a quantidade de bytes que devem ser
reservados.
Para fazer esse cálculo usamos o comando sizeof.

VEJAMOS o exemplo de alocação dinâmica:


http://linguagemc.com.br/alocacao-dinamica-de-memoria-em-c/

Você também pode gostar