Prévia do material em texto
- 2 -
++++++++++++++++++++++++++++++++++++++++++++ ÍNDICEÍNDICEÍNDICEÍNDICE ++++++++++++++++++++++++++++++++++++++++++++
���� Módulo I – Lógica de Programação
Capítulo 1 Histórico 3
Capítulo 2 Objetivos 3
Capítulo 3 Ambiente 4
Capítulo 4 Bibliotecas 5
Capítulo 5 Tipos de Dados 6
Capítulo 6 Documentação 7
Capítulo 7 A Função Principal - main() 8
Capítulo 8 Delimitadores de Bloco 8
Capítulo 9 Variáveis 9
Capítulo 10 Funções de Saída 10
Capítulo 11 Funções de Entrada 11
Capítulo 12 Estruturas de Decisões 16
12.1 - Seqüências Simples 16
12.2 - Seqüências Alternativas 17
12.2.1 - Seqüências Alternativas Simples - if 17
12.2.2 - Seqüências Alternativas Compostas - if...else 18
12.2.3 - Seqüências Alternativas com Múltiplas Condições 19
12.2.4 - Estrutura Caso - case 20
Capítulo 13 Laços de Repetição - Iterações 23
13.1 - Iteração Enquanto - while 24
13.2 - Iteração Repita – do while 28
13.3 - Iteração Para - for 31
Capítulo 14 Estruturas Homogêneas 34
14.1 - Matrizes com Uma Dimensão (Vetores) 34
14.2 - Matrizes com Duas dimensões 37
Capítulo 15 Estruturas Heterogêneas 42
15.1 – Registros - struct 42
Capítulo 16 Procedimentos e Funções 48
���� Módulo II – Estruturas de Dados
Capítulo 1 Cadeia de Caracteres 51
Capítulo 2 Listas Lineares 53
Capítulo 3 Filas 57
Capítulo 4 Pilhas 62
Capítulo 5 Deques 68
Capítulo 6 Recursividade 74
Capítulo 7 Árvores 77
���� Módulo III – Arquivos
Capítulo 1 Arquivo Texto 83
Capítulo 2 Arquivo Binário 86
���� Anexo I – Projetos
Capítulo 1 Criptografia Simétrica 90
Capítulo 2 Criptografia Assimétrica 97
Capítulo 3 Agenda 115
Capítulo 4 Locadora 123
Capítulo 5 Controle de Estoque 130
���� Anexo II – Exercícios Resolvidos
- 3 -
++++++++++++++++++++++++++++++++++++++++++++ MÓDULO IMÓDULO IMÓDULO IMÓDULO I ++++++++++++++++++++++++++++++++++++++++++++
LÓGICA DE PROGRAMAÇÃOLÓGICA DE PROGRAMAÇÃOLÓGICA DE PROGRAMAÇÃOLÓGICA DE PROGRAMAÇÃO
I I I I ���� HISTÓRICO HISTÓRICO HISTÓRICO HISTÓRICO
A Linguagem C foi desenvolvida no início dos anos 70, em 1972, por Dennis M. Ritchie. Sua
primeira implementação foi feita num PDP-11 com sistema UNIX, tendo sido, em seguida, utilizada para
rescrever o UNIX.
O desenvolvimento da linguagem C foi fortemente influenciado pela linguagem B, desenvolvida por
Ken Tompson que, por sua vez, teve suas origens em uma linguagem relativamente antiga, BCPL,
desenvolvida por Martin Richards.
Embora muitas características de "C" sejam comuns com BCPL, "C" não é um dialeto desta última
linguagem.
II II II II ���� OBJETIVOS OBJETIVOS OBJETIVOS OBJETIVOS
C é uma linguagem de propósito geral. Mesmo tendo sido criada com o objetivo de ser uma
linguagem de programação de sistemas operacionais e utilitários, pelas suas facilidades de acesso a nível
de máquina e eficiência do código gerado, "C" também é bastante útil para escrever um grande número de
aplicações numéricas, de processamento de texto e de programas para banco de dados.
Este livro aborda os conceitos básicos da Linguagem, tratando o programa em C++ em módulos,
desde uma aplicação simples como uma soma de dois números até uma aplicação complexa na realização
de um sistema de criptografia assimétrica.
O foco principal deste documento são alunos universitários, e para isso o livro aborda a ementa de
duas (ou três) disciplinas básicas do curso de Ciência da Computação: Algoritmos, Linguagem de
Programação e ainda Estrutura de Dados.
Em Estrutura de Dados são apresentadas as principais estruturas como: Cadeia de Caracteres,
Listas, Filas, Pilhas, Deques e ainda Árvores, com o intuito de preparar o aluno para uma outra disciplina da
grade de Ciência da Computação: grafos.
O livro fecha com quatro projetos práticos:
criptografia simétrica - criação e editão de arquivos texto com técnica criptográfica sem
senha privada,
criptografia assimétrica - incluindo senha privada além da senha pública já presente no
projeto anterior),
agenda - com as principais funções de uma agenda telefônica básica e
locadora - com variações para Cd, VHS e DVD permitindo inclusão, alteração, exclusão,
consulta, listagem, relatório, etc.
- 4 -
III III III III ���� O AMBIENTE O AMBIENTE O AMBIENTE O AMBIENTE DevDevDevDev C C C C++++++++
O ambiente Dev C++ integra os recursos de um compilador com um editor de textos, através da
seleção de opções em um ambiente windows com menus e ferramentas específicas para a linguagem.
Figura 1 – Ambiente Dev C++
À medida que os recursos da linguagem forem utilizados, e os recursos da plataforma DEV C++
forem necessários, estes serão citados e explicados paulatinamente.
Boa parte das funções e comandos usados neste livro, com foco na plataforma DEV C++, também
são compatíveis com outros compiladores da linguagem C, como o Turbo C++ da Borland, que até pouco
tempo atrás ainda era o compilador mais usado nas universidades com o foco acadêmico e introdutório nas
linguagens de programação.
- 5 -
IIIIV V V V ���� BIBLIOTECAS BIBLIOTECAS BIBLIOTECAS BIBLIOTECAS
A linguagem C é por natureza própria uma linguagem estruturada. A maior parte de seus recursos é
conseguida via utilização de funções. Assim sendo, a linguagem possui uma coleção de bibliotecas que
podem ser usadas a qualquer momento.
Uma biblioteca é o conjunto de rotinas prontas para serem usadas pelo programador. Abaixo, são
apresentadas algumas das bibliotecas existentes na Linguagem C e sua rápida descrição:
stdio.h
Esta biblioteca é a mais utilizada na programação em C, pois é a biblioteca padrão (std) de entrada
(i) e saída (o) de dados. É nela que estão todas as funções de entrada e saída de dados da linguagem,
como: scanf(), printf(), getchar(), puts(), gets() entre outras que serão apresentadas nos próximos capítulos.
conio.h
Esta biblioteca possui as rotinas de console de entrada e saída no Ms-DOS, e ainda as funções de
ambiente clrscr(), gotoxy(), getche() entre outras. No DEV C++ algumas destas funções estão alocadas em
uma variação da biblioteca conio, chamada conio.c
math.h
Esta biblioteca possui as rotinas do pacote matemático.
dos.h
Esta biblioteca possui as rotinas de tratamento do Ms-DOS e dos processadores da família Intel: x86.
Alguns compiladores tem dificuldade em trabalhar com recursos do DOS, impossibilitando o uso desta
biblioteca.
graphic.h
Esta biblioteca possui as rotinas do pacote gráfico
string.h
Esta biblioteca possui as rotinas de tratamento de memória e strings.
Etc...
Para poder fazer uso deste recurso é necessário o uso de uma diretiva (#include), que deve ser
colocada antes da declaração da função main(). Desta forma, sua sintaxe corresponde a:
#instrução <biblioteca>
Onde instrução é uma palavra reservada (include entre outras) e biblioteca é uma ou mais das
bibliotecas citadas acima.
Uma diretiva caracteriza-se na linguagem C, por ser uma instrução precedida do caractere tralha "#",
que deverá ser sempre escrito na primeira coluna. A instrução, após o símbolo tralha, é uma palavra
reserva do pré-processador.
O pré-processador é um programa que checa o programa-fonte escrito em linguagem C e efetua no
programa-fonte, modificações. O pré-processador recebe este nome pelo fato de ser o primeiro programa a
ser executado em um processo de compilação, fazendo com que o programa-fonte seja alterado, na forma
de texto, antes deser propriamente compilado.
Uma biblioteca poderá ser escrita como: #include <stdio.h> ou #include “stdio.h” substituindo os
sinais de menor (<) e maior (>) por aspas (“) e vice-versa.
- 6 -
V V V V ����TIPOTIPOTIPOTIPOS DE DADOSS DE DADOSS DE DADOSS DE DADOS
Para se desenvolver um programa que seja executável dentro de um computador, é necessário ter
em mente que o trabalho de gerenciamento de dados ocorre em três níveis:
1. A entrada dos dados;
2. O processamento dos dados;
3. A saída de dados.
O objetivo principal de qualquer computador é a manipulação de dados, que são representados por
elementos em estado primário.
Ao agregar valores à esses dados, são criadas as informações, que ao serem estruturadas de
forma organizada e com algum significado, tem por objetivo gerar algum conhecimento.
� Os computadores servem para armazenar informações e programas para sua manipulação.
Sendo assim, um programador consciente não pode ignorar a importância dos dados e
como eles devem ser estruturados.
� Como exemplo padrão da estruturação de dados e informações pode ser citada a lista
telefônica , que por ser ordenada alfabeticamente, torna razoavelmente simples e rápido o
acesso a um determinado número de telefone de um assinante.
Os dados então são representados pelas informações a serem processadas por um computador. A
linguagem C fornece ao programador um conjunto de tipos de dados predefinidos, podendo ser dos tipos:
numéricos, caracteres e lógicos (“camuflados” por 0 e 1).
5.1. Tipos de dados inteiros
São caracterizados tipos inteiros os dados numéricos positivos ou negativos, excluindo-se destes
qualquer número fracionário. Em C, este tipo de dado pode ser referenciado por um dos seguintes
identificadores:
int de -32.768 a 32.767
long de -2.147.483.648 até 2.147.483.647
unsigned int de 0 até 65.535
5.2 Tipos de dados reais
São caracterizados tipos reais os dados numéricos positivos, negativos e números fracionários e
também os inteiros. Em C, este tipo de dado pode ser referenciado por um dos seguintes identificadores:
float de 3.4 E -38 até 3.4 E+38
double de 1.7 E -308 até 1.7 E+308
Este tipo de dado real permite trabalhar com uma representação de valores em ponto flutuante que
consiste em uma mantissa (parte fracionária).
5.3 Tipos de dados caracteres
São caracterizadas tipos caracteres as seqüências contendo letras, números e símbolos especiais.
Uma seqüência de caracteres deve ser representada na linguagem C entre aspas ( " " ). Este tipo de dado
é referenciado pelo identificador char, podendo armazenar de 0 até 255 caracteres.
5.4 Tipos de dados lógicos
Na linguagem C, não existe um tipo de dado lógico ou booleano propriamente dito, ou seja, não
existirão os valores lógicos Falso ou Verdadeiro para um determinado tipo de dado. Nesta linguagem,
qualquer valor igual a zero 0, é considerado um valor lógico falso, e qualquer valor diferente de zero (que
será representado pelo número 1 inteiro) será considerado um valor lógico verdadeiro.
- 7 -
VI VI VI VI ����DOCUMENTAÇÃODOCUMENTAÇÃODOCUMENTAÇÃODOCUMENTAÇÃO
Desenvolvendo CDesenvolvendo CDesenvolvendo CDesenvolvendo Comentáriosomentáriosomentáriosomentários
O uso de comentários é de extrema importância para o programador, pois tem a finalidade de
documentar o programa, deixando-o mais claro e fácil de ser compreendido, alterado ou corrigido.
Existem dois tipos de comentários:
� comentário do prólogo e
� comentários intercalares
6.1 Comentário do Prólogo
É colocado antes da lógica de programação e é constituído por quatro etapas:
1ª- Definição do programa
Ex: // Programa Soma entre 2 números
2ª- Nome do autor e datas de criação e última alteração do programa
Ex: // Fulano de Tal em: 04/04/1989; Ultima Alteração: 12/03/2008
3ª- Declarações das variáveis novas ou desconhecidas usadas no programa
Ex: // N1 e N2 = Números digitados pelo usuário; S = Soma encontrada
4ª- Funcionalidade do Programa
Ex: // O usuário digita 2 números e tem como resposta a soma entre eles.
6.2 Comentários Intercalares
Servem para comentar, de maneira breve, funções ou comandos novos ou desconhecidos para o
programador.
Obs. 1: A especificação de comentários em Linguagem C++ é identificada pelo uso de duas barras em
seqüência: //
Obs. 2: Quando em um comentário são utilizadas mais de uma linha, também é possível delimitá-lo com o
uso de /* no inicio da primeira linha e */ no final da última linha.
/* Programa Soma entre 2 números
Fulano de Tal em: 04/04/1989; Ultima Alteração: 03/03/2008
N1 e N2 = Números digitados pelo usuário; S = Soma encontrada
O usuário digita 2 números e tem como resposta a soma entre eles. */
- 8 -
VII VII VII VII ����A FUNÇÃO PRINCIPAL A FUNÇÃO PRINCIPAL A FUNÇÃO PRINCIPAL A FUNÇÃO PRINCIPAL
Todo e qualquer programa em C é constituído de no mínimo uma função, tendo assim a
possibilidade de se construir programas modulares ou estruturados.
main( ) Primeira, e principal função do C.
A função main( ) é a principal instrução a ser considerada em um programa escrito na linguagem C,
ou seja, esta função deverá estar presente em algum lugar do programa, pois é ela que marca o ponto de
inicialização do processo de execução do programa. É apresentado a seguir, o modelo da forma geral de
escrita de um programa em C, com a definição e comentário de cada um dos elementos básicos do
programa.
[<definições de pré-processamento>]
[<declaração das variáveis globais>]
main()
{
/*
Este trecho é reservado para o corpo da função, com a declaração de suas variáveis locais, seus
comandos e funções de trabalho.
* /
}
Toda informação situada entre [ ] indica informações que poderão ou não estar presentes em um
programa. Já qualquer informação entre < > caracteriza-se por ser obrigatória. Os símbolos ( ) indicam
início e fim da rotina.
Todas as informações escritas entre os delimitadores /* e */ são comentários para documentação
do programa e não são compiladas quando da execução do programa pelo compilador.
Normalmente, um programa em C é iniciado com as definições de pré-processamento e com a
declaração das variáveis globais, lembrando que estas variáveis poderão ser usadas em qualquer parte do
programa, seguidas da declaração de todas as funções a serem utilizadas no programa.
As funções em C são formadas inicialmente pela declaração de seu tipo, informação esta opcional,
e de seu nome seguida da lista de parâmetros entre parênteses a ser utilizada pela mesma. A lista de
parâmetro poderá estar vazia, sendo que a finalidade de um parâmetro é servir como um ponto de
comunicação bidirecional entre as várias funções de um programa.
VIVIVIVIIIIII I I I ����DELIMITADORES DE BLOCODELIMITADORES DE BLOCODELIMITADORES DE BLOCODELIMITADORES DE BLOCO
Delimitam toda a lógica de programação escrita pelo programador.
São representados (em C++) por { e } conforme observado na sintaxe abaixo:
/* ...Comentário do Prólogo... */
Bibliotecas;
main()
{
- - - - - - - - -
- - - - - - - - -
- - - - - - - - -
}
- 9 -
IIIIXXXX ����VARIÁVEIS VARIÁVEIS VARIÁVEIS VARIÁVEIS
Variável, no sentido de programação, é uma região previamente identificada e que tem por
finalidade armazenar as informações (dados) de um programa temporariamente. Uma variável armazena
apenas um valor por vez. Sendo considerado como valor o conteúdo de uma variável, desta forma, um
valor está relacionado ao tipo de dado de uma variável, podendo ser numérico, lógico ou caractere.
O nome de uma variável é utilizado para sua identificação e posterior uso dentro de um programa,
sendo assim é necessário se estabelecer algumas regras de utilização das mesmas:
� Nomes de uma variávelpoderão ser atribuídos com um ou mais caracteres;
� O primeiro caractere do nome de uma variável não poderá ser em hipótese alguma um número, sempre
deverá ser uma letra;
� O nome de uma variável não poderá possuir espaços em branco;
� Não poderá ser nome de uma variável uma palavra reservada a uma instrução ou identificador de uma
linguagem de programação;
� Não poderão ser utilizados outros caracteres a não ser letras e números, com exceção do caractere
underscore "_", que poderá ser utilizado para simular a separação entre duas palavras, como:
MEDIA_ESCOLAR.
Na linguagem C, os 32 primeiros caracteres de um nome de variável são significativos, porém, se o
sistema operacional em uso é o MS-DOS, somente serão considerados os primeiros 8 caracteres. Este
fator limita um pouco o uso das variáveis.
� Outro detalhe a ser considerado na linguagem C é o fato de haver diferença entre caracteres
maiúsculos e minúsculos. Sendo assim as variáveis: NOME, nome e Nome, são diferentes.
Todo dado a ser armazenado na memória de um computador através de uma variável utilizando-se a
linguagem C deve ser previamente declarado, ou seja, primeiro é necessário saber qual o seu tipo para
depois fazer o seu armazenamento. Estando armazenado o dado, este poderá ser utilizado e manipulado a
qualquer momento, durante a execução do programa.
Pelo fato de a linguagem C obrigar o programador a trabalhar de forma estruturada e ser baseada no
uso de funções, as variáveis podem assumir dois estados de comportamento (global e local).
Uma variável é considerada Global quando é declarada no inicio de um programa escrito em C,
precisamente antes da função main ( ), que será estuda a seguir, podendo este tipo de variável ser
utilizado por qualquer parte do programa.
Uma variável é considerada Local quando é declarada apenas dentro de uma função e é somente
válida dentro do limite de abrangência da referida função. Desta forma, as demais rotinas não poderão
fazer uso daquelas variáveis como Global, pois não visualizam a existência das mesmas.
Todo programa tem a obrigatoriedade de declarar (antes da lógica) todas as variáveis que serão
utilizadas, pois estas só poderão receber valores após tal declaração, que ocorre de acordo com a seguinte
sintaxe:
tipo_de_dado NOME_DA_VARIAVEL ;
Ex: int IDADE;
float N1 , N2 , S ;
- 10 -
9.1 Constantes
Tem-se como definição de constante tudo aquilo que é fixo ou estável, e existirão vários momentos
em que este conceito deverá estar em uso. Ao operar com variáveis correspondentes a valores constantes
ou fórmulas, deve-se utilizar o símbolo “=“ que significa uma atribuição. Por exemplo, o valor 4.12 da
fórmula a seguir é uma constante e está sendo atribuído à variável INSS:
INSS = SAL * 4.12.
9.2 Operadores Aritméticos
Tanto variáveis como constantes poderão ser utilizadas na elaboração de cálculos matemáticos
com a utilização de operadores aritméticos. Os operadores aritméticos são classificados em duas
categorias, sendo binários ou unários. São binários quando atuam em operações de: exponenciação,
multiplicação, divisão, adição e subtração. São unários quando atuam na inversão de um valor atribuindo a
este o sinal positivo ou negativo.
X X X X ����FUNÇÕES DE SAÍDAFUNÇÕES DE SAÍDAFUNÇÕES DE SAÍDAFUNÇÕES DE SAÍDA
São responsáveis pela saída de dados, ou seja: apresentação destes valores em qualquer
programa, sendo obrigatório o uso dos parênteses para delimitar os dados apresentados.
A primeira função de saída apresentada é a printf( ) que possibilita efetuar a saída de informações
no vídeo, de acordo com a sintaxe:
printf ("expressão de controle", lista de argumentos);
A expressão de controle se caracteriza por conter códigos de formatação para o tipo de dado a ser
processado, precedidos pelo sinal de percentagem %.
Veja a seguir, a tabela com os códigos de formatação para a função printf( ).
%c Permite que seja efetuada a escrita de apenas um caractere
%d Permite que seja efetuada a escrita de números inteiros decimais
%e Permite que seja efetuada a escrita de números em notação científica
%f Permite que seja efetuada a escrita de números reais (ponto flutuante)
%g Permite que seja efetuada a escrita de %e ou %f no formato mais curto
%o Permite que seja efetuada a escrita de números octais
%s Permite que seja efetuada a escrita de uma série de caracteres
%u Permite que seja efetuada a escrita de um número decimal sem sinal
%x Permite que seja efetuada a escrita de um número hexadecimal
- 11 -
A função printf ( ) pode usar além da expressão de controle e da lista de argumentos um conjunto de
códigos especiais através do símbolo “\” com finalidade de efeito visual conforme apresentado abaixo:
printf (“Clube do Remo \n Campeão Brasileiro Série C 2005”);
O resultado desta operação na tela do computador seria:
Clube do Remo
Campeão Brasileiro Série C 2005
A utilização destes códigos especiais tem a finalidade de auxiliar o programador na utilização de
recursos não disponíveis no teclado. Estes códigos são apresentados a seguir:
\n Cria uma linha nova a partir do ponto que é indicado
\t Cria um espaço de tabulação do ponto que é indicado
\b Executa um retrocesso de espaço do ponto que é indicado
\” Apresenta o símbolo de aspas no ponto que é indicado
\\ Apresenta o símbolo de barra no ponto que é indicado
\f Adiciona um salto de página de formulário (impressora)
\0 Gera um nulo
XI XI XI XI ����FUNÇÕES DE ENTRADA FUNÇÕES DE ENTRADA FUNÇÕES DE ENTRADA FUNÇÕES DE ENTRADA
São responsáveis pela inserção de dados em um programa, ou seja, tudo que tiver de ser digitado
pelo usuário deverá usar uma função de entrada.
Também é obrigatório o uso dos parênteses para delimitar os dados digitados e obedece a seguinte
sintaxe:
A primeira função de saída apresentada é a função scanf( ) , que possibilita efetuar entrada de
dados via teclado.
A sintaxe desta função se caracteriza por ser uma expressão de controle seguida de uma lista de
argumentos separados por virgula, sendo que seus argumentos são endereços de variáveis.
scanf ("expressão de controle", lista de argumentos);
A expressão de controle se caracteriza por conter códigos de formatação para o tipo de dado a ser
processado, precedidos pelo sinal de percentagem %.
Veja a seguir, a tabela com os códigos de formatação para a função scanf( ).
%c Permite que seja efetuada a leitura de apenas um caractere
%d Permite que seja efetuada a leitura de números inteiros decimais
%e Permite que seja efetuada a leitura de números em notação científica
%f Permite que seja efetuada a leitura de números reais (ponto flutuante)
%l Permite que seja efetuada a leitura de um número inteiro longo
%o Permite que seja efetuada a leitura de números octais
%s Permite que seja efetuada a leitura de uma série de caracteres
%u Permite que seja efetuada a leitura de um número decimal sem sinal
%x Permite que seja efetuada a leitura de um número hexadecimal
- 12 -
A lista de argumentos se caracteriza por ser a indicação dos endereços das variáveis em uso,
através do operador de endereço &, que possibilita retomar o conteúdo da variável. Caso não seja usado o
operador de endereço &, será retornado o endereço de memória em que se encontra a variável.
O Primeiro Programa em C
Para colocar em prática o que foi explicado até este momento, considere o seguinte exemplo:
/* Programa Nome
Autor: Fulano de Tal Dt_Cri: 22/08/1986 Dt_Ult_Alt: 12/03/2008
Sem Variáveis
O usuário simplesmente é apresentado ao autor do programa */
#include <stdio.h>
#include <conio.h>
main ( ) // Primeira função do programa em C
{ // Corresponde ao "Inicio" do Algoritmo
printf ( "Programa desenvolvidopor \n Fulano de Tal" );
// Corresponde ao "escreva" do algoritmo
getch ( ); // Espera ser pressionada qualquer tecla p/ continuar
} // Corresponde ao "fim" do algoritmo
Edite o programa acima, compile-o e verifique a funcionalidade de seu arquivo executável.
Considere agora o seguinte exemplo de algoritmo: "Deverá ser desenvolvido um programa que
efetue a leitura de dois valores numéricos. Faça a operação de adição entre os dois valores e apresente o
resultado obtido".
Com relação ao problema da leitura dos dois valores (que não conhecemos e também não
precisamos conhecer, pois utilizaremos duas variáveis para trabalhar estas incógnitas N1 e N2) e a sua
respectiva adição (conseqüência dos valores informados, a qual também é uma incógnita e dependendo
dos valores fornecidos, utilizaremos para esta a variável S).
Assim sendo, o programa em questão deverá obedecer a seguinte ordenação:
Algoritmo Literal:
1. Ler um valor para a variável N1;
2. Ler outro valor para a variável N2;
3. Efetuar a adição das variáveis N1 e N2, implicando o seu resultado na variável S;
4. Apresentar o valor da variável S após a operação de soma dos dois valores fornecidos.
Observe que temos neste exemplo, as três fases de trabalho de um programa: a fase de entrada
retratada nos passos 1 e 2, o processamento retratado no passo 3 e por fim a saída retratada no passo 4.
Completada a fase de interpretação do problema e da definição das variáveis a serem utilizadas,
através de um algoritmo, passa-se para a fase de diagramação.
Tendo estabelecido os passos anteriores, será efetuada a codificação do programa. Desta forma,
são utilizadas no exemplo, três variáveis: N1, N2 e S (que neste caso estão no estado de variáveis locais),
sendo que estas deverão ser declaradas segundo o seu tipo, no caso como inteiras.
/* Programa Soma entre 2 números
Fulano de Tal em: 04/04/1989; Ultima Alteração: 03/03/2008
N1 e N2 = Números digitados pelo usuário; S = Soma encontrada
O usuário digita 2 números e tem como resposta a soma entre eles. */
- 13 -
main( )
{
int N1;
int N2;
int S;
Tendo relacionado as variáveis que serão utilizadas no programa, bem como os seus respectivos
tipos, passa-se para a fase de montagem do programa propriamente dito.
As variáveis poderiam ser também relacionadas em uma única linha:
int N1, N2, S;
Observe que o bloco de instruções entre “{“ e “}” está deslocado um pouco para a direita. Este estilo
de escrita deve ser obedecido, para facilitar a leitura de um bloco de programa, recebendo o nome de
identação.
Apesar de a informação escrita entre os delimitadores /* e */ não ser processada, é adequado
sempre identificar um programa com um nome que deve vir no comentário de prólogo.
scanf ("%d", &N1);
scanf ("%d", &N2);
S = N1 + N2;
printf ("%d", S);
}
Após a leitura dos valores para as variáveis N1 e N2 com a função scanf ( ), estes serão adicionados e
implicados na variável S, a qual será apresentada com o valor da adição processada através da função
printf ( ).
Note que as instruções utilizadas dentro da função main( ) são precedidas de ponto e virgula, indicando
desta forma o fim da instrução naquela linha.
A seguir, é apresentado o programa completo:
/* Programa Soma entre 2 números
Fulano de Tal em: 04/04/1989; Ultima Alteração: 03/03/2008
N1 e N2 = Números digitados pelo usuário; S = Soma encontrada
O usuário digita 2 números e tem como resposta a soma entre eles. */
#include <stdio.h>
#include <conio.h>
main ( ) // Primeira função do programa em C
{ // Corresponde ao "Inicio" do Algoritmo
int N1,N2,S; // Declaração das variáveis como inteiras
printf ("Informe 1º numero: "); // Corresponde ao "escreva" do Algoritmo
scanf ("%d", &N1); // Corresponde ao "leia" do Algoritmo
printf ("Informe 2º numero: ");
scanf ("%d", &N2);
S = N1 + N2;
printf ("\n A Soma é igual a %d", S);
getch ( ); // Espera ser press. qq tecla p/ prosseguir
}
- 14 -
Edite o programa acima, compile-o e verifique a funcionalidade de seu arquivo executável.
Como terceiro exemplo, desenvolva um programa que efetue o cálculo do salário liquido de um
profissional que trabalhe por hora.
Para fazer este programa você deverá possuir alguns dados, tais como: valor da hora de trabalho,
número de horas trabalhadas no mês e o percentual de desconto do INSS.
O programa em questão deverá apresentar o valor do salário bruto, o valor descontado e o valor do
salário liquido.
Algoritmo Literal
1. Estabelecer a leitura da variável HT (horas trabalhadas no mês);
2. Estabelecer a leitura da variável VH (valor hora trabalhada);
3. Estabelecer a leitura da variável PD (percentual de desconto);
4. Calcular o salário bruto (SB), sendo este a multiplicação das variáveis HT e VH;
5. Calcular o total de desconto (TD) com base no valor de PD dividido por 100;
6. Calcular o salário liquido (SL), subtraindo o desconto do salário bruto;
7. Apresentar os valores dos salários bruto e liquido: SB, TD e SL.
A seguir, é apresentado o programa completo:
/* Programa Calculo de Salário
Fulano de Tal em: 05/04/1989; Ultima Alteração: 03/03/2008
HT horas trabalhadas no mês, VH valor da hora trabalhada , PD percentual de desconto ,
SB Salário Bruto, D Desconto e SL Salário liquido
O usuário digita HT, VH e PD e tem SB, TD e SL. */
include <stdio.h>
include <conio.h>
main( )
{
float HT, VH, PD, D, SB, SL;
printf ("Informe numero de horas trabalhadas no mês: ");
scanf ("%f", &HT);
printf ("Informe valor da hora trabalhada: ");
scanf ("%f", &VH);
printf ("Informe percentual de desconto: ");
scanf ("%f", &PD);
SB = HT * VH;
D = (PD/100) * SB;
SL = SB - D;
printf ("Salário Bruto............: %7.2f \ n ”, SB);
printf ("Desconto..................: %7.2f \ n ”, D);
printf ("Salário liquido..........: %7.2f \ n ”, SL);
getch( );
}
Note que no exemplo de cálculo de salários estão sendo colocados junto ao código da expressão de
controle dois valores separados por ponto: %7.2f. O valor numérico 7 indica que será estabelecido um
campo para a parte do valor inteiro com a capacidade de apresentar tabulados valores até 9999, pois o
valor 2 depois do ponto indica que serão utilizadas apenas duas casas decimais para valores com ponto
flutuante, utilizando três espaços dos sete espaços separados.
- 15 -
ExercícioExercícioExercícioExercícioSSSS
1) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para encontrar a média
escolar de uma disciplina que trabalha com a seguinte fórmula: duas provas valendo 10 pontos sendo que
a primeira tem peso 4 e a segunda tem peso 6. O usuário deverá digitar somente as 2 notas e deverá ser
apresentada à ele a média encontrada.
2) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para encontrar o delta de
uma equação do 2º grau. A fórmula geral de equações do 2º grau é a seguinte: Ax2 + Bx + C = 0 e a do
Delta é: B2 - 4AC . O usuário deverá digitar os coeficientes A, B e C respectivamente e lhe será
apresentado o valor do delta.
3) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para que um usuário,
informando a distância entre dois pontos e o tempo gasto no percurso, tenha como resposta a velocidade
obtida no trajeto. Lembre-se que V = S/T. Adotar as unidades: km para a distância e hora para o tempo.
4) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para efetuar o cálculo da
quantidade de litros de combustível gastas em uma viagem, utilizando-se um automóvel que faz 12 Km por
litro. Para obter o cálculo, o usuário deverá fornecer o tempo gasto na viagem e a velocidade média durantea mesma. Desta forma, será possível obter a distância percorrida com a fórmula DISTANCIA = TEMPO *
VELOCIDADE. Tendo o valor da distância, basta calcular a quantidade de litros de combustível utilizada na
viagem com a fórmula: LITROS_USADOS = DISTANCIA / 12. O programa deverá apresentar os valores da
velocidade média, tempo gasto, a distância percorrida e a quantidade de litros utilizada na viagem.
5) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para ler uma temperatura
em graus Centígrados e apresentá-la convertida em graus Fahrenheit. A fórmula de conversão é: F = (9 * C
+ 160) / 5, onde F é a temperatura em Fahrenheit e C é a temperatura em Centígrados.
6) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para ler uma temperatura
em graus Fahrenheit e apresentá-la convertida em graus Centígrados. A fórmula de conversão é: C = (F -
32) * 5/9, onde F é a temperatura em Fahrenheit e C é a temperatura em Centígrados.
7) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para calcular e apresentar o
valor do volume de uma lata de óleo, utilizando a fórmula: VOLUME = 3.14159 * R2 * ALTURA.
- 16 -
XIIXIIXIIXII ���� ESTRUTURASESTRUTURASESTRUTURASESTRUTURAS DE DECISÕESDE DECISÕESDE DECISÕESDE DECISÕES
12.1 - Seqüência Simples:
É considerada linguagem em Seqüência Simples, todo programa que contém comandos escritos e
executados de forma linear, ou seja: de cima para baixo, sem desvios, de acordo com a seguinte sintaxe:
/* ...Comentário do Prólogo... */
bibliotecas;
main()
{
Ação 1;
Ação 2;
Ação N;
}
Ex.:
/* Programa Soma entre 2 números reais
Fulano de Tal em: 04/04/1989; Ultima Alteração: 02/04/2008
N1 e N2 = Números digitados pelo usuário; S = Soma encontrada
O usuário digita 2 números e tem como resposta a soma entre eles. */
#include <stdio.h>
#include <conio.h>
main ( )
{
float N1,N2,S;
printf ("Informe 1º numero: "); scanf ("%f", &N1);
printf ("Informe 2º numero: "); scanf ("%f", &N2);
S = N1 + N2;
printf ("\n A Soma é igual a %f", S);
getch ( );
}
12.2 - Seqüências Alternativas
12.2.1 - Seqüências Alternativas Simples: if
São estruturas compostas por desvios em sua formação, ou seja: não são executadas
necessariamente de maneira linear, pois existem blocos de instruções que podem ser saltados (ignorados)
dentro do corpo do programa.
Neste tipo de estrutura uma condição é analisada e caso o valor lógico desta condição seja
verdadeiro, um determinado bloco de ações (B) é executado. Caso o valor lógico da condição seja falso,
este bloco de ações (B) é ignorado, podendo ocorrer então um desvio na seqüência de comandos.
A sintaxe das estruturas com alternativa simples é a seguinte:
/* ...Comentário do Prólogo... */
bibliotecas;
main()
{
Ações A;
if (CONDIÇÃO)
{
Ações B;
}
Ações C;
}
- 17 -
Obs.1: Utiliza-se { e } para delimitar blocos internos de um desvio com mais de um comando em
sua formação.
Obs.2: O uso dos parênteses ( ) é obrigatório para delimitar as condições.
Obs.2: Ao utilizar estruturas alternativas, é aconselhável o uso da identação. Entende-se por
identação, como sendo a organização estética dos blocos de comandos ou ações existentes no programa.
Para exemplificar a estrutura, considere o seguinte problema: "Ler dois valores numéricos, e mostra-
los em ordem crescente”. Ou seja, poderá haver uma troca entre variáveis.
Algoritmo
1. Conhecer dois valores inteiros e incógnitos ( estabelecer variáveis A e B );
2. Verificar se o valor de A é maior que de B;
a. Se for verdadeiro, efetuar a troca (*) de valores entre as variáveis;
b. Se for falso, pedir para executar o que esta estabelecido no passo 3;
3. Apresentar os valores das duas variáveis
(*) Para efetuar a troca, foi necessário usar uma terceira variável, no caso, X (por exemplo), de forma
que X seja igual ao valor de A, liberando A para receber o valor de B deixando B livre para receber o valor
que está em X, que anteriormente constava o conteúdo de A.
Programa
/* Programa Ordenação entre 2 números inteiros
Fulano de Tal em: 04/04/1989; Ultima Alteração: 02/04/2008
A e B = Números digitados pelo usuário; X = Variável auxiliar
O usuário digita 2 números e tem como resposta ambos ordenados. */
#include <stdio.h>
#include <conio.h>
main( )
{
int A, B, X;
printf ("Informe um valor para a variável A:”); scanf (“%d”, &A);
printf ("Informe um valor para a variável B:”); scanf (“%d”, &B);
if (A > B)
{
X = A;
A = B;
B = X;
}
printf("\n Os valores ordenados são: %d e %d", A, B);
getch( );
}
Note a utilização das chaves { e } após a utilização da instrução if. Isto se fez necessário, pois a
troca de valores é conseguida com a execução de três operações, sendo que estas três operações devem
acontecer quando a condição for Verdadeira. Sendo a condição Falsa, serão apresentados os valores como
entrados, uma vez que já estão em ordem.
Observe a linha:
printf ("\n Os valores ordenados são: %d e %d", A, B);
note que a colocação do código %d dentro da mensagem indica o local de posicionamento do valor
da variável.
- 18 -
Operadores Relacionais
No exemplo anterior, foi utilizado o sinal de > (maior que) para verificar o estado da variável quanto
ao seu valor, ou seja, a sua condição. Sendo assim, uma condição também poderá ser verificada como:
diferente, igual, menor que, maior ou igual a que e menor ou igual a que. Estas verificações são efetuadas
com a utilização dos chamados operadores relacionais, conforme tabela abaixo:
== Igual
!= Diferente
> Maior
< Menor
>= Maior ou Igual
<= Menor ou Igual
Obs.
Ao fazer uso do operador relacional "= =" que representa o valor de igualdade de uma comparação
entre dois elementos, deve-se tomar o cuidado para não confundi-lo com o sinal "=", que na linguagem C é
utilizado como símbolo de atribuição. Este erro é comum para quem utiliza outras linguagens de
programação como Pascal, Visual Basic, Delphi, Quick Basic, pois a segunda forma é usada tanto para
atribuição como para comparação.
12.2.2 - Seqüências Alternativas Compostas: if ... else
São estruturas compostas por desvios múltiplos em sua formação, onde um bloco de ações B é
executado em caso de condição verdadeira e um bloco de ações C é executado em caso de condição falsa.
A estrutura de formação para as seqüências alternativas compostas utiliza a seguinte sintaxe:
/* ...Comentário do Prólogo... */
bibliotecas;
main()
{
Ações A;
if (CONDIÇÃO)
{
Ações B;
}
else
{
Ações C;
}
Ações D;
}
Para um exemplo da utilização desta estrutura considere o seguinte problema:
"Ler dois valores numéricos, efetuar a adição. Caso o valor somado seja maior ou igual a 10, este
deverá ser apresentado somando-se a ele mais 5. Caso o valor somado não seja maior ou igual a 10, este
deverá ser apresentado subtraindo-se 7".
Algoritmo
1. Conhecer dois valores ( variáveis A e B );
2. Efetuar a soma dos valores A e B e implicar o valor da soma em X;
3. Verificar se X é maior ou igual 10, caso sim mostre X+5, senão mostre X-7.
- 19 -
Programa
/* Adiciona Números */
#include <stdio.h>
#include <conio.h>
main( )
{
int A, B, X;
printf ("Informe um valor para a variável A: "); scanf ("%d", &A);
printf ("Informe um valor para a variável B: "); scanf ("%d", &B);
X = A + B;
printf ("\n O resultado eqüivale a: ");
if (X >= 10)
printf ("%d", X+5);
else
printf ("%d", X-7);
getch( );
}
Observe que após a definição dos tipos de variáveis, é solicitada a leitura dos valores para as
variáveis A e B, depois estes valores são implicados na variável X, que possui o resultadoda adição dos
dois valores. É apresentada então a mensagem O resultado eqüivale a:, que não posicionará o cursor na
próxima linha, desta forma qualquer que seja o resultado avaliado pela condição, será apresentado ao lado
direito da mensagem. Em seguida a esta linha é verificado no programa, a condição que permitirá escrever
o resultado da soma adicionado de 5, caso esta seja maior ou igual a 10. Não sendo, o programa
apresentará o resultado subtraindo 7.
Operadores ou Conectivos Lógicos
Existem ocasiões onde é necessário trabalhar com o relacionamento de duas ou mais condições ao
mesmo tempo na mesma instrução if, efetuando desta forma testes múltiplos. Para estes casos é
necessário trabalhar com a utilização dos operadores lógicos, também conhecidos como operadores
booleanos.
Já foi comentado anteriormente que a linguagem C não faz uso de valores lógicos, tais como:
Verdadeiro ou Falso, pelo fato de estes dois valores não existirem. Em uma expressão condicional ou no
uso de operadores lógicos, será considerado como valor Verdadeiro o resultado da expressão que for não-
zero (que será considerado para efeito de avaliação lógica o valor numérico um: 1). Sendo o resultado da
expressão zero, esta será considerada como valor Falso.
Os 3 operadores lógicos utilizados comumente na Linguagem C são: E, OU e NÃO. Em alguns
casos, o uso de operadores lógicos evita a utilização de muitas instruções if encadeadas.
Operador Lógico E: &&
O operador do tipo && é utilizado quando dois ou mais relacionamentos lógicos de uma
determinada condição necessitam ser verdadeiros. Abaixo é apresentada a tabela verdade para este tipo
de operador:
Condição 1 Condição 2 Resultado .
0 (Falsa) 0 (Falsa) 0 (Falso)
1 (Verdadeira) 0 (Falsa) 0 (Falso)
0 (Falsa) 1 (Verdadeira) 0 (Falso)
1 (Verdadeira) 1 (Verdadeira) 1 (Verdadeiro)
O operador && faz com que somente seja executada uma determinada operação se todas as
condições mencionadas forem simultaneamente verdadeiras, gerando assim um resultado lógico
verdadeiro.
- 20 -
Operador Lógico OU: ||
O operador do tipo || é utilizado quando pelo menos um dos relacionamentos lógicos (quando
houver mais de um relacionamento) de uma condição necessita ser verdadeiro. Abaixo é apresentada a
tabela verdade para este tipo de operador:
Condição 1 Condição 2 Resultado .
0 (Falsa) 0 (Falsa) 0 (Falso)
1 (Verdadeira) 0 (Falsa) 1 (Verdadeiro)
0 (Falsa) 1 (Verdadeira) 1 (Verdadeiro)
1 (Verdadeira) 1 (Verdadeira) 1 (Verdadeiro)
O operador | | faz com que seja executada uma determinada operação, se pelo menos uma das
condições mencionadas gerar um resultado lógico verdadeiro.
Operador Lógico NÃO: !
O operador do tipo ! é utilizado quando se necessita estabelecer que uma determinada condição
deve não ser verdadeira ou deve não ser falsa. O operador ! se caracteriza por inverter o estado lógico de
uma condição. Abaixo é apresentada a tabela verdade para este tipo de operador:
Condição Resultado .
1 (Verdadeira) 0 (Falso)
0 (Falso) 1 (Verdadeira)
O operador ! faz com que seja executada uma determinada operação, invertendo o resultado lógico
da condição.
12.2.3 - Seqüências Alternativas com Múltiplas Condições
Esta estrutura é composta por múltiplas condições, onde cada uma pode conter um valor lógico
diferente. Tais condições são analisadas individualmente e a elas são atribuídos valores lógicos individuais,
que passam a ser operados com as tabelas verdade, encontrando assim um único valor lógico
correspondente ao conjunto de condições citadas na operação.
A estrutura de seqüências alternativas com múltiplas condições deve respeitar a seguinte sintaxe:
/* ...Comentário do Prólogo... */
bibliotecas;
main()
{
Ações A;
if (CONDIÇÃO1 conectivológico CONDIÇÃO2 conectivológico CONDIÇÃON)
{
Ações B;
}
else
{
Ações C;
}
Ações D;
}
Para demonstrar a utilização de operadores lógicos, considere o seguinte problema (clássico):
"Ler três valores para os lados de um triângulo, considerando lados como: A, B e C.
Verificar se os lados fornecidos formam realmente um triângulo.
Se for esta condição verdadeira, deverá ser indicado qual tipo de triângulo foi formado: isósceles,
escaleno ou equilátero".
- 21 -
Algoritmo
Forma-se um triângulo quando A<B+C, quando B<A+C e quando C<A+B. Tendo certeza de que os
valores informados para os três lados formam um triângulo, serão então analisados os valores para se
estabelecer qual tipo de triângulo será formado: isósceles, escaleno ou equilátero.
Um triângulo é equilátero quando possui todos os lados iguais, sendo A==B e B==C;
é isósceles quando possui dois lados iguais, sendo A==B ou A==C ou B==C;
é escaleno quando possui todos os lados diferentes, sendo A!=B e B!=C e A!=C
1. Ler três valores para os lados de um triângulo: A, B e Q
2. Verificar se cada lado é menor que a soma dos outros dois lados
a. Se sim, saber se A= =B e se B= =C, sendo verdade o triângulo é equilátero
b. Se não, verificar A= =B ou se A= =C ou se B= =C, sendo verdade o triângulo é
isósceles, caso contrário o triângulo será escaleno;
3. Caso os lados fornecidos não caracterizem um triângulo, avisar a ocorrência.
Programa
/* Programa Tipo de Triângulo */
#include<stdio.h>
#include<conio.h>
main( )
{
float A, B, C;
printf("\t Programa Tipo de Triangulo \n\n");
printf("\n Informe o lado A: "); scanf("%f", &A);
printf("\n Informe o lado B: "); scanf("%f", &B);
printf("\n Informe o lado C: "); scanf("%f", &C);
printf("\n");
if (A<B+C && B<A+C && C<A+B)
{
if (A==B && B== C)
printf("Triangulo Equilatero \n");
else
{
if (A==B || A==C || C==B)
printf("Triangulo Isosceles \n");
else
printf("Triangulo Escaleno \n");
}
}
else
printf("Os valores fornecidos nao formam um triangulo \n”);
getch( );
}
O exemplo demonstra através da utilização dos operadores lógicos, a capacidade de um programa
definir se determinados valores fornecidos formam realmente um triângulo, e se a condição for verdadeira,
este programa indica o tipo de triângulo formado.
Se forem fornecidos respectivamente os valores 8, 2 e 3 para os lados A, B e C, será apresentada a
mensagem: "Os valores fornecidos não formam um triângulo", pois a primeira condição da instrução if
(A<B+C && B<A+C && C<A+B) resulta o valor lógico falso, uma vez que 8 é maior que a soma de 2 com 3.
Caso sejam fornecidos os valores 8, 8 e 2, a primeira instrução if será verdadeira, indicando que os
lados fornecidos formam um triângulo. Apesar de o lado A ser igual ao lado B, mas este não ser igual ao
lado C, o triângulo formado não é do tipo equilátero, desta forma a segunda instrução if tem seu resultado
lógico como falso, sobrando a verificação da condição para a terceira instrução if que indica o triângulo
como sendo do tipo isósceles, pois o lado A é igual ao lado B.
- 22 -
COMANDOS ESPECIAIS DE REFINAMENTO
A seguir são apresentados alguns comandos de controle de ambiente de tela que a linguagem C
oferece ao seu programador.
Para usá-los deve-se acrescentar a biblioteca conio.h no início do programa.
No Dev C++, além da biblioteca conio.h ainda podem ser necessárias as bibliotecas conio.c e/ou
conio2.h, caso estas estejam instaladas no pacote do compilador.
textcolor ();
� Usado para adotar cores em fontes no C ou para fazê-las piscar.
Ex.: textcolor (RED); // A cor do texto fica vermelha.
textbackground();
� Usado para adotar cor de fundo nas fontes do C.
Ex.: textbackground (BLUE); // A cor do texto fica azul.
getche();
� Tem a finalidade de interromper momentaneamente a execução de um programa em C.
clrscr();
� Tem a função de limpar a tela, posicionando o cursor no canto superior esquerdoda tela.
gotoxy(col,lin);
� Tem a finalidade de direcionar uma instrução para uma determinada coluna e linha da tela.
Ex.: gotoxy (30,10); // Posiciona a próxima instrução na coluna 30 e na linha 10 da tela.
Obs. Para utilizar alguns destes comandos deve-se acrescentar a letra c no início da função que se deseja
usar. Por exemplo:
textcolor (RED);
cprintf (“Esta mensagem aparecerá com a cor vermelha na tela”);
O compilador C também utiliza um vasto conjunto de funções aritméticas que facilitam o acesso aos
cálculos matemáticos mais complexos. Para utilizar essas funções, deve-se declarar um outro arquivo
cabeçalho com a biblioteca math.h.
A seguir são apresentadas algumas destas funções:
cos (x) � retorna o co-seno da variável x.
sin (x) � retorna o seno da variável x.
exp (x) � retorna o valor de e elevado a x.
log (x) � calcula o logaritmo natural de x.
sqrt(x) � calcula a raiz quadrada do valor x.
Etc...
- 23 -
ExercícioExercícioExercícioExercíciossss
1) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para que um usuário,
informando a distância entre dois pontos e o tempo gasto no percurso, tenha como resposta a velocidade
obtida no trajeto. Lembre-se que V = S/T. Adotar as unidades: km para a distância e hora para o tempo. O
diferencial deste exercício, é que deverá ser retornando um aviso de multa caso a velocidade tenha
ultrapassado o limite de 110km/h e uma mensagem de boa conduta em caso contrário.
2) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para ler um número
inteiro positivo e saber se este número é par ou ímpar. O resultado deve ser apresentado ao usuário do
programa.
3) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para Efetuar a leitura de
três valores (variáveis A, B e C) e efetuar o cálculo da equação de segundo grau, apresentando as duas
raízes, se para os valores informados for possível efetuar o referido cálculo.
4) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para ler duas notas
escolares de um aluno e imprimir uma mensagem dizendo que o aluno foi aprovado se o valor da média
escolar (média simples) for maior ou igual a 7. Se o valor da média for menor que 7, solicitar que seja
informada uma nota de exame. Some então esta nota de exame com o valor da média anterior e encontre a
nova média. Se esta nova média for maior ou igual a 5, apresentar uma mensagem dizendo que o aluno foi
aprovado, caso contrário: reprovado. Apresentar junto com as mensagens o valor da média do aluno para
qualquer condição.
5) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para efetuar o controle de
entrada de um cinema a partir da informação do valor do ingresso e ainda a idade do cliente. Se a idade
for >= 65 ou a idade for < 12 o cliente paga apenas meia entrada, caso contrário paga inteira.
6) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para que a partir da leitura
de 3 valores, A, B e C, saber se estes valores formam ou não um triângulo. O resultado da pesquisa deve
ser informado ao usuário do programa e caso os valores formem um triângulo, deverá ser mostrado ao
usuário o tipo do triângulo formado.
7) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para que a partir da
informação da base e altura de um triângulo, seja encontrada e apresentada a área do mesmo,
( A = ( B * H ) / 2 ). Refine o seu algoritmo, dando respostas específicas caso a base ou a altura sejam
informadas como negativas ou zero.
- 24 -
XIXIXIXIIIIII I I I ���� LaçosLaçosLaçosLaços DE RepetiçõesDE RepetiçõesDE RepetiçõesDE Repetições
((((ITERAÇÕES ITERAÇÕES ITERAÇÕES ITERAÇÕES –––– L L L Loopingsoopingsoopingsoopings ) ) ) )
Existem sistemas que tem necessidade de repetir um determinado trecho do programa algumas
vezes. Isto pode ser conseguido de duas formas: a primeira, de forma “braçal”, com muito Crtl+C Ctrl+V, é
escrito o mesmo trecho tantas vezes quanto necessário, um tanto trabalhoso e “sem classe” e a segunda
forma, muito mais inteligente, utilizando o conceito de looping, que são conhecidos também por: laços,
iterações ou repetições.
Supondo um programa que deveria executar um determinado trecho de instruções por quatro
vezes. Com o conhecimento adquirido até este momento você só poderia optar pela primeira forma,
escrevendo o mesmo tantas vezes quanto for necessário, no caso quatro vezes.
Por exemplo, imagine um programa que peça a leitura de dois valores para as variáveis A e B
respectivamente. Efetue a adição de um com o outro, implicando o resultado na variável de resposta R e
em seguida apresente o valor do resultado obtido, repetindo esta seqüência por quatro vezes.
/* Programa soma de dois números 4 vezes sem looping
Autor: Fulano de tal Data: 04/04/1974
Var: A e B para os números somados e R para o resultado a soma.
Funcionalidade: o usuário informa 2 números e tem a soma entre eles por 4 vezes consecutivas
*/
#include <stdio.h>
#include <conio.h>
main ( )
{
int A, B, R;
printf (" \n\n Programa soma de 2 números por 4 vezes \n\n ");
printf (" Entre com um valor para A: "); scanf("%d", &A);
printf (" Entre com um valor para B: "); scanf("%d", &B);
R = A + B;
printf (" O resultado da soma é: %d \n\n\n ", R);
printf (" Entre com um valor para A: "); scanf("%d", &A);
printf (" Entre com um valor para B: "); scanf("%d", &B);
R = A + B;
printf (" O resultado da soma é: %d \n\n\n ", R);
printf (" Entre com um valor para A: "); scanf("%d", &A);
printf (" Entre com um valor para B: "); scanf("%d", &B);
R = A + B;
printf (" O resultado da soma é: %d \n\n\n ", R);
printf (" Entre com um valor para A: "); scanf("%d", &A);
printf (" Entre com um valor para B: "); scanf("%d", &B);
R = A + B;
printf (" O resultado da soma é: %d \n\n\n ", R);
getch();
}
A vantagem em se utilizar looping é que o programa passa a ter um tamanho menor, podendo sua
amplitude de processamento ser aumentada sem se alterar o tamanho do código de programação. Desta
forma, podem-se determinar repetições com números variados de vezes; como veremos a seguir.
- 25 -
13.1 Iteração Enquanto - Looping com condição no início: while
Esta estrutura caracteriza-se por efetuar um teste lógico no inicio de um looping, verificando se é
permitido executar o trecho de instruções subordinado a este.
A estrutura while tem o seu funcionamento controlado por condição. Desta forma, poderá executar
um determinado conjunto de instruções enquanto a condição verificada permanecer Verdadeira. No
momento em que esta condição se torna Falsa, o processamento da rotina é desviado para fora do looping.
Sendo a condição Falsa logo no inicio do looping, as instruções contidas no bloco de ações são ignoradas.
Caso seja necessário executar mais de uma instrução para uma condição verdadeira dentro de um looping,
estas deverão estar mencionadas dentro de um bloco definido com { e }. Desta forma, a instrução while
deverá ser escrita respeitando a seguinte sintaxe:
while (condição verdadeira)
{
<Bloco de Ações>;
}
1º - Exemplo
Como exemplo, considere o problema anterior, onde é necessário executar quatro vezes a
solicitação de dois números para o cálculo da adição. Neste caso, será necessário definir um contador para
controlar a execução do programa, e a cada vez que for executado o trecho desejado do programa, este
contador deverá ser incrementado de mais 1. Observe abaixo os detalhes para a solução deste problema:
Algoritmo Literal
1. Criar uma variável para servir como contador com valor inicial 1;
2. Enquanto o valor do contador for menor ou igual a 4, processar os passos 3, 4 e 5;
3. Ler os dois valores;
4. Efetuar o cálculo, implicandoo resultado em R;
5. Apresentar o valor calculado contido na variável R;
6. Acrescentar o contador com mais 1 unidade;
7. Quando o contador for maior que 4, encerrar o processamento.
Programa
/* Programa soma de dois números 4 vezes com looping while
Autor: Fulano de tal Data: 04/04/1974
Var: A e B para os números somados; R para o resultado e CONTADOR para contar os 4 loopings
Funcionalidade: o usuário informa 2 números e tem a soma entre eles por 4 vezes consecutivas
*/
#include <stdio.h>
#include<conio.h>
main( )
{
int A, B, R, CONTADOR;
printf ("\n\n Programa soma de 2 números por 4 vezes \n\n ");
CONTADOR=1;
while (CONTADOR <= 4)
{
printf (" \n Entre com um valor para A: "); scanf("%d", &A);
printf (" \n Entre com um valor para B: "); scanf("%d", &B);
R = A + B;
printf (" \n O resultado da soma é: %d \n\n ", R);
CONTADOR = CONTADOR + 1;
}
getch( );
}
- 26 -
Além da utilização das variáveis A, B e R, foi necessário criar uma terceira variável, chamada no
caso de CONTADOR para controlar a contagem do número de vezes que o trecho de programa é
executado.
Assim que o programa é inicializado, a variável contador é atribuída com o valor 1 (CONTADOR =1).
Em seguida a instrução while (CONTADOR <= 4) efetua a checagem da condição estabelecida, verificando
que a condição é verdadeira, pois o valor da variável CONTADOR que neste momento é 1, é realmente
menor que 4 e enquanto for, deverá processar o looping. Desta forma, é iniciada a execução da rotina de
instruções contidas no looping delimitado com a instrução while.
Depois de efetuar a solicitação dos valores, ter processado a operação de adição e exibido o
resultado, o programa encontra a linha com a instrução CONTADOR = CONTADOR + 1, indicando o
acréscimo de 1 na variável contador. Observe que a variável CONTADOR possui neste momento o valor 1
e somado a mais 1 esta passa a ter o valor 2, ou seja, CONTADOR = 1 + 1, resultando em CONTADOR =2.
Estando a variável CONTADOR com o valor 2, o processamento do programa volta para a instrução
while (CONTADOR <= 5), que verifica a condição da variável. Sendo esta condição Verdadeira, será
executada novamente a mesma rotina de instruções. Quando o processamento do programa chegar na
instrução CONTADOR = CONTADOR + 1, fará com que a variável CONTADOR passe a possuir o valor 3.
Desta forma o programa processará novamente a rotina de instruções, passando o valor de CONTADOR
para 4, que será verificado, e sendo menor ou igual a 4, será executada mais uma vez a mesma rotina de
instruções. Em seguida o valor da variável CONTADOR passa a ser 5, que resultará para a instrução while
uma condição falsa e por conseguinte desviará o processamento para a primeira instrução encontrada após
o bloco definido entre { e }, no caso para o getch() e em seguida para o fim do programa.
O uso de contadores na linguagem C também pode ser escrito de outras formas. No programa
anterior, por ex., a linha CONTADOR = CONTADOR + 1 poderia ter sido escrita como: CONTADOR += 1.
Imagine agora uma outra situação, onde o usuário deseja executar a rotina do programa várias
vezes, mas não sabe quantas vezes ao certo deverá executar o trecho de programa. Neste caso, não seria
conveniente manter um contador para controlar o looping, seria melhor que o programa fizesse ao usuário
uma pergunta, solicitando se o mesmo deseja ou não continuar executando o programa. Veja o exemplo:
/* Programa soma de dois números indeterminadas vezes com looping while
Autor: Fulano de tal Data: 04/04/1974
Var: A e B para os números somados; R para o resultado e RESP para determinar o número de loopings
Funcionalidade: o usuário informa 2 números e tem a soma entre eles por n vezes consecutivas
*/
#include <stdio.h>
#include <conio.h>
main()
{
int A, B, R;
char RESP = 's';
printf ("\n\n Programa soma de 2 números por indeterminadas vezes \n ");
while (RESP == 's')
{
printf (" \n\n Entre com um valor para A: "); scanf("%d", &A);
printf (" \n Entre com um valor para B: "); scanf("%d", &B);
R = A + B;
printf (" \n O resultado da soma é: %d \n\n ", R);
printf (" \n Deseja continuar? - Tecle (s) ou (n): ”);
RESP = getche();
}
}
- 27 -
No exemplo, o contador foi substituído pela variável RESP, que enquanto tiver o seu valor igual a 's',
executará o bloco de instruções subordinado a while. Neste caso, o número de vezes que a rotina se
repetirá será controlado pelo usuário e dependerá da informação fornecida para a variável RESP. Observe
no programa anterior, o uso de apóstrofos na string da condição ao invés de aspas. Na linguagem C,
somente são colocadas strings entre aspas quando são usadas com a função printf(), no caso de uma
condição, deve-se fazer uso de apóstrofos.
Observe que para a entrada da resposta não foi utilizada a função scanf(), sendo usada a função
getche() que permite que seja feita a leitura de um caractere do teclado sem que se pressione a tecla
<ENTER>.
Outro detalhe a ser observado na sintaxe da linguagem C é o fato de permitir simplificações na forma
de escrita. No programa anterior, é iniciada a variável RESP como sendo do tipo string (char) e antes de
iniciar o looping esta variável é atribuída com o valor 's' para dar início ao processamento do looping.
Perceba que após a inicialização da variável com o seu tipo, está sendo atribuído simultaneamente o
valor da variável RESP = 's': char RESP = 's'.
ExercícioExercícioExercícioExercíciossss
1) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para escrever na tela de um
computador 20 vezes a frase: “Eu serei aprovado”.
2) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para escrever na tela de um
computador todos os números inteiros entre 33 e 50.
3) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para escrever na tela de um
computador todos os números inteiros e pares entre 44 e 74.
4) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para escrever na tela de um
computador indeterminadas vezes a frase: “Remo Campeão” enquanto o usuário do programa assim
desejar. Confirme a vontade do usuário com a variável RESP sendo ou não igual a ‘s’. Use o comando:
RESP = getche();
5) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para ler a matrícula (RA) de
um aluno e enquanto esta matrícula for diferente de 0 (zero), cadastrar 2 notas e encontrar a média entre
elas de acordo com a seguinte fórmula: M = (N1+N2)/2. Apresentar a média encontrada e ainda: se essa
média for maior ou igual a 5, comunicar que o aluno está aprovado, senão comunicar que este aluno está
reprovado.
6) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para controlar a entrada em
uma boate com capacidade para até 300 pessoas. É proibida a entrada de menores de 18 anos e o
programa é encerrado quando o usuário informa 0 (zero) para a idade de um cliente. Deve ser solicitada a
idade de cada cliente da boate e se esta idade for menor que 18 anos, deve ser apresentada uma
mensagem de “entrada proibida” para o cliente, porém, se a idade for maior ou igual a 18, o cliente entra na
boate e é apresentado para o usuário do programa o número de clientes que estão naquele momento
dentro da boate.
7) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para efetuar a contagem
regressiva de um lançamento de um foguete. O tempo da contagem é de 8 segundos. Utilize o comando
_sleep(1000) , que faz parte da biblioteca <stdlib.h> , para que cada laço demore um segundo para ser
executado. Informe ao usuário, segundo a segundo, o tempo restante para o lançamento do foguete,
Quando o foguete for lançado o usuário deve ser informado que o lançamento foi executado. Tente
representar o foguete “decolando”com o uso do comando gotoxy().