CAPTULO I
INTRODUO
Objetivos
-1-
Departamento de Informtica
A seqncia descrita acima pode ser completada com vrias observaes. Por exemplo:
O que fazer se o macaco no estiver no porta-malas?
O que fazer se o estepe tambm estiver vazio?
Deve-se sempre puxar o freio de mo antes de executar estas operaes.
Por outro lado, algumas aes devem ser levadas a cabo aps executar a troca do pneu. Por
exemplo:
Limpar as mos;
Consertar o pneu furado;
Se o responsvel pela construo do algoritmo tiver que se preocupar com todas as possibilidades
do ambiente de execuo do mesmo, e alm disso, com todas as necessidades de tratamento psexecuo , nenhum algoritmo ser completo. Sempre alguma condio poder ser esquecida.
Assim, antes de se construir um algoritmo, deve-se especificar as condies de inicio (dados de
entrada) e as de trmino (dados de sada). No caso acima, teremos:
Condio de entrada: um carro com todos os equipamentos de segurana em
condies, parado e freado, com um pneu furado.
Condio de sada: um carro parado, freado, com todos os equipamentos de
segurana em condies, exceto pelo pneu estepe vazio, com todos os pneus OK.
Alm disso, algum pode argumentar que as aes no esto suficientemente detalhadas para
compreenso. Para uma pessoa acostumada a trocar pneus furados as explicaes so suficientes,
mas ser que um selvagem do deserto Kalahari, que nuca viu um carro antes, saber utilizar
corretamente um macaco para elev-lo?
Assim, a funo levantar o carro seria melhor descrita como:
Empunhe o cabo da manivela do macaco; comece a girar a manivela no sentido
horrio, mantendo este movimento at que o pneu do carro esteja suspenso a pelo
menos 10 cm do cho; solte a manivela.
Boa parte dos problemas tratados no computados resolvida por seqncia de instrues
(algoritmos) compostas por um agrupamento de atividades por si s complexas. Da mesma forma
que foi necessrio detalhar o uso do macaco para o selvagem, tambm estas atividades complexas
devem ser detalhadas at a um nvel em que o computador seja capaz de reconhec-las e executlas.
Devido velocidade com que o computador processa cada uma destas instrues simplificadas,
no h problema em descrever e tratar uma atividade complexa atravs de milhares de outras
atividades bsicas.
Para os seres humanos, contudo, difcil memorizar e detalhar milhares de instrues,
associando-as atividade original. Para facilitar esta tarefa, utilizam-se duas ferramentas:
Tcnica de Refinamentos Sucessivos;
Representao de Algoritmos.
-2-
Departamento de Informtica
-3-
Departamento de Informtica
Se espreguiar;
Ficar de p.
Processamento-componente Tomar Caf
Sentar mesa;
Pr caf na xcara;
Pr margarina no po;
Comer o po e tomar o caf;
Comer uma fruta.
-4-
Departamento de Informtica
Departamento de Informtica
Alm disso, toda receita vem com muitos comentrios relativos a detalhes que poderiam passar
despercebidos e estragar o resultado final. Os comentrios servem para chamar a ateno do cozinheiro
e explicar melhor o porque de cada passo.
Da mesma forma um bom programa ter 4 partes:
1. Cabealho: com o nome do programa;
2. Dicionrio de Dados: definindo os dados de entrada, de sada e outros que sejam necessrios ao
longo do processamento do programa;
3. Corpo: definindo o tratamento dado aos dados no programa;
4. Comentrios: esclarecendo aspectos pouco claros do programa em suas diversas partes
(Cabealho, Dicionrio de Dados e Corpo).
Alm disso, a forma como as linhas do programa esto dispostas fisicamente, identao, deve ser feita
de maneira a tornar a listagem do programa o mais clara quanto possvel, permitindo assim uma boa
legibilidade do programa.
Para que um programa apresente uma boa esttica deve-se seguir regras bsicas, como:
Coloque cada comando em uma linha separada;
Insira uma linha em branco antes de cada seo do programa e sempre que apropriado em
uma seqncia de comandos para destacar blocos de comandos;
Mantenha-se fiel a identao dos comandos de modo a enfatizar a relao entre palavras
reservadas e comandos que compreendem estruturas de controle, sees de programas, etc.
-6-
Departamento de Informtica
CAPTULO II
A SOLUO DE UM PROBLEMA ATRAVS DO COMPUTADOR
I.1 O que um Algoritmo
Quando se deseja resolver um problema com auxlio do computados, necessrio a execuo de uma
srie de etapas, elaboradas e executadas passo a passo na forma de algoritmos.
O algoritmo descrito em portugus, o que permite ao programados pensar no problema a ser
resolvido, e no na mquina ou linguagem de programao que sero usadas. Esta preocupao fica
para uma etapa posterior.
I.2 A Programao Estruturada
A programao estruturada consiste em uma metodologia de projeto de programa com objetivo de
reduzir a complexidade dos grandes sistemas de software. Assim essa metodologia se prope a:
Facilitar a escrita dos programas;
-7-
Departamento de Informtica
Permite a diviso de tarefas em equipes, onde cada mdula pode ser elaborado por um
programa diferente;
Facilita o teste, pois cada mdula pode ser testado individualmente e depois incorporado ao
conjunto;
Permite o uso do mesmo mdula vrias vezes.
TERCEIRO NVEL
Elaborao do programa usando dentro de cada mdulo um numero limitado de estruturas bsicas de
fluxo de controle, isto , instrues.
Os mdulos so construdos por programas. No programa, cada um de seus passos pertence a uma das
trs estruturas bsicas:
Operao elementar;
-8-
Departamento de Informtica
CAPTULO III
CONSTRUO DE PROGRAMAS EM C
Objetivos
III.1 Introduo
Nos captulos anteriores mostraram-se diversos algoritmos, com suas operaes mais simples sendo
executadas por seres humanos (algoritmo Troca de Pneu). Tambm se discutiram as vantagens e
objetivos das Tcnicas de Programao Estruturada (Refinamentos Sucessivos, Modularizao,
Documentao, etc).
Nesse captulo sero descritas as operaes bsicas que o computador pode executar. Estas operaes
sero utilizadas para construir algoritmos progressivamente mais complexos.
Um fator a observar que os computadores reais, na verdade, executam um conjunto ainda mais
reduzido de operaes, chamadas operaes de mquina, e que definem a Linguagem de Mquina.
As operaes descritas aqui referem-se ao que se convenciona chamar de Linguagens de Alto
Nvel. Estas so mais prximas de linguagem humana. Para traduzir um programa escrito em
linguagem de alto nvel para linguagem de mquina utilizam-se outros programas denominados de
compiladores.
Uma vez construdo um algoritmo, o mesmo pode ser traduzido para uma linguagem de programao
de alto nvel (PACAL, COBOL, FORTRAN, C, MODULA, etc). Este ltimo programa ento
traduzido pelo compilados para linguagem de mquina, que pode ser executada pelo computador.
IDENFIFICAO DO
DO PROBLEMA
PROBLEMA
IDENFIFICAO
|
CONSTRUO DE ALGORITMO
|
TRADUO PARA UM
LINGUAGEM DE ALTO NVEL
|
COMPILAO
-9-
Departamento de Informtica
As operaes bsicas executadas em Linguagem de Alto Nvel so feitas sobre tipos bsicos de dados.
Antes de se aprender as operaes necessrio, portanto, conhecer esses tipos bsicos de dados.
III.2 Identificadores
Em geral, uma linguagem de Alto Nvel possui dois tipos de elementos: os elementos definidos pela
linguagem (palavras reservadas, etc) e os elementos definidos pelo programador (identificadores,
comentrios, etc).
Um identificador um smbolo que pode representar uma varivel, uma constante, um tipo, um nome
de programa ou subprograma ou rtulo.
formado por uma seqncia de caracteres alfanumricos (letras e dgitos), sendo que o primeiro deve
ser obrigatoriamente alfabtico.
A escolha de nomes de identificadores importante para a qualidade do programa. Um nome de
identificador deve ser significativo, isto , deve esclarecer a funo que o elemento identificado exerce
dentro do programa. Deste modo, o programa se torna fcil de ler, compreender e alterar.
Neste texto ser adotado como regra na escrita: a) nome de identificados comeados com letra
maiscula e demais caracteres minsculos; b) nomes compostos de identificadores com a primeira letra
de cada parte maiscula, e c) palavra com letras maisculas. Apesar do compilador na fazer distino
entre letras maisculas e minsculas.
III.3 Tipo de Dados
As linguagens de alto nvel permitem ao programador definir tipos de dados bastantes complexos,
como vetores, matrizes, filas e pilhas. Todavia, todos esses tipos so compostos por outros tipos
menores, com caractersticas definidas pela prpria linguagem. So os tipos bsicos de dados.
Os dados em um algoritmo/programa podem ser de dois tipos: constantes ou variveis.
Constantes so valores que parecem em meio ao programa e que no tm seu valor alterado durante a
execuo do mesmo. Um exemplo tpico o do nmero (PI).
Variveis so elementos (posio de memria da mquina) que recebem o valor de uma varivel ou de
uma expresso, podendo este valor ser alterado durante a execuo do programa. Uma varivel pode
ser imaginada como uma posio da mquina, identificada pelo nome da varivel.
Exemplo:
Soma = 0; significa que uma posio de memria da mquina, identificada pelo nome Soma, recebe
o valor 0.
III.3.1 Tipo Bsicos de Dados
No C, so adotados quatro tipos bsicos de dados, isto , so quatro os tipos primitivos de dados que
podem ser usados. Esses tipos podem criar outros tipos chamados de tipos construdos, que sero
vistos posteriormente.
1. TIPO INTEIRO (int)
Designa um intervalo (dependente do compilador e da mquina) dos nmeros inteiros (negativo,
positivo ou nulo). Possui como operaes associadas:
Soma: +
- 10 -
Departamento de Informtica
Multiplicao: *
Subtrao: Diviso inteira: /
2. TIPO PONTO FLUTUANTE (float)
Designa um intervalo dos nmeros racionais (a preciso e o intervalo so dependentes da mquina e do
compilador). Possui como operaes associadas:
Soma: +
Multiplicao: *
Subtrao: Diviso: /
3. TIPO CARACTER (char)
Designa qualquer caracter (letras, nmeros e caracteres especiais como *, &, $, etc). Existem operaes
especiais associadas manipulao de caracteres, mas no sero abordadas neste momento.
4. TIPO BOOLEANO (int)
Na linguagem C, o tipo INT usado tambm como expresso booleana. Para isso, o zero interpretado
como falso e os outros nmeros como verdadeiro.
III.4 Definio das Variveis de um Programa
Quando se escreve um programa, necessrio definir o tipo de todas as variveis que sero usadas.
Essa definio de tipo feita atravs de uma Declarao de Variveis, onde so especificados os
valores que podem ser atribudos a cada uma das variveis (se valores inteiros, reais, etc). Em C,
quando um computador est executando um programa e encontra uma varivel qualquer, se esta no
tiver tido o seu nome e tipo declarado anteriormente, ser emitida uma mensagem de erro, abortando a
execuo. Assim, toda varivel deve ser declarada antes de ser utilizada.
A declarao de variveis e constantes segue a seguinte estrutura:
#define <identificador> <valor>
<tipo> <identificador>;
Exemplo:
#define pi 3, 1415926
#define NotaMaxima 10
int soma, cont1, cont2, matriculaAluno;
float mediaAluno, notaProva1, notaProva2;
EXERCCIO
Assinale os identificadores vlidos:
( )Valor
( )Salrio-Liquido
( )SalarioLiquido
( )X2
( )NotaAluno
( )3X3
( )AH!!
( )xy
- 11 -
Departamento de Informtica
( )X234
III.5 Operaes Elementares
As operaes elementares so os comandos de atribuies, clculos de expresses, e operaes de
entrada e sada. Essas operaes so chamadas de elementares por na alterarem o fluxo normal da
execuo do programa, ou seja, aps a execuo de uma operao elementar, a prxima instruo a ser
executada a seguinte do programa.
Toda instruo possui uma parte sinttica (diz respeito forma como a instruo escrita) e uma parte
semntica (diz respeito ao que a instruo faz).
III.5.1 Comando de Atribuio
O comando de atribuio a maneira de se especificar que a uma determinada varivel ser atribudo
(fornecido) um certo valor. Este comando. Em C, indicado pelo smbolo de atribuio =.
Forma geral do comando de atribuio:
<varivel> = <valor>;
O tipo dos dados esquerda e direita do comando de atribuio deve ser compatvel. A nica exceo
ocorre para casos em que um valor inteiro atribudo a uma varivel do tipo real.
III.5.2 Clculo de Expresso
As variveis e constantes podem ser combinadas com os operadores associados a cada tipo de dados,
gerando expresses. o valor calculado das expresses que atribudo varivel ao lado esquerdo do
comando de atribuio.
III.5.3 Expresso Aritmtica
A expresso aritmtica aquela cujos operadores e/ou variveis de tipo numrico.
A notao a mesma das operaes matemticas, com as seguintes excees:
No permitido omitir o operador de multiplicao:
A*C diferente de AC
Nas operaes aritmticas, as operaes guardam sempre uma relao de prioridade, que
:
Prioridade
Operao
1
Multiplicao, diviso
2
Adio, subtrao
Para se obter uma seqncia de clculos diferente, vrios nveis de parnteses podem ser usados para
quebrar as prioridades definidas. No permitido o uso de colchetes e chaves, uma vez que estes
smbolos sero utilizados com outras finalidades.
Funes Pr-definidas
Alm das operaes bsicas citadas podem-se usar nas expresses aritmticas algumas funes bastante
comuns na matemtica, definidos dentro da linguagem.
Nome da funo
abs
abs
sin
Tipo do Argumento
int
float
int/float
Tipo de Retorno
int
float
float
- 12 -
Departamento de Informtica
cos
atan
log
exp
sqrt
floor
ceil
int/float
int/float
int/float
int/float
int/float
float
float
float
float
float
float
float
int
int
Exemplos:
ABS o valor absoluto (mdulo) de um nmero. Exemplos:
abs(-4) = 4
SQRT raiz quadrada. Exemplos:
sqrt(4) = 2
FLOOR o maior inteiro no maior que o nmero de entrada. Exemplo:
floor(10.9) = 10
CEIL o menor nmero no menor que o nmero de entrada. Exemplo:
ceil(9.9) = 10
SIN, COS e ATAN so as funes trigonomtricas seno, coseno e arco-tangente
respectivamente.
Os ngulos so sempre dados em radianos.
LOG e EXP so o logaritmo neperiano e exponencial respectivamente.
Exerccio
Calcule o valor das seguintes expresses aritmticas, considerando os seguintes valores:
A = 10
B=3
X = 2.5
Y = 1.2
a)X/2
b)ceil(X-Y)
c)EXP(Y*(B+2)-6)
d)floor(2.9+ceil(0.3+Y)*2+A)
III.5.2.2 Expresso Relacional
Trabalha com operadores relacionais e formada por trs partes: uma expresso (da esquerda), um
operador relacional e outra expresso (da direita). Note-se que uma varivel ou constante isolada pode
ser entendida como uma expresso.
So exemplos de operadores relacionais:
== igual a;
- 13 -
Departamento de Informtica
!= diferente de.
As expresses relacionais tm como resultados finais valores do tipo inteiro (0 para falso e 1 para
verdadeiro).
As variveis do tipo CHAR tambm podem ser comparadas entre si, obedecendo ordenao do
padro ASCII.
III.5.2.3 Expresso Lgica
comum nos programas surgirem situaes em que a execuo de uma ao, ou seqncia de
subaes, est sujeita a uma certa condio. Esta representada no texto do programa por meio de uma
expresso lgica.
Denomina-se de Expresso Lgica expresso cujos operadores so lgicos e cujos operandos so
expresses relacionais e/ou variveis do tipo inteiro.
Os operadores lgicos so:
&& (AND)
|| (OR)
! (NOT)
Os resultados obtidos das expresses lgicas tambm so valores do tipo inteiro (0 para falso e 1 para
verdadeiro).
Exemplos:
Se P e Q so operandos inteiras ento:
P
Q
P && Q
P || Q
!P
!(P && Q)
1
1
1
1
0
0
1
0
0
1
0
1
0
1
0
1
1
1
0
0
0
0
1
1
Exerccios
Dadas as variveis e seus valores:
A = 10
B=3
X = 3.5
L1 = 1
L2 = 0
Calcule o valor das seguintes expresses:
a)(A < B)
b)(X < A)
c)((X + A) < (B * Y))
d)((X < A) || (B > Y))
e)L1 && L2
f)L1 || L2
g)(L1 && (X < Y))
h)((! L2) || (! (X < (Y + 2))))
Y = 0.3
- 14 -
Departamento de Informtica
3
4
+, -, ||
==, !=, <, <=, >=, >
MEMRIA
X = ?, Y = ?, Z = ?, W = ?
X = 10, Y = 20, Z = 30, W = ?
X = 10, Y = 20, Z = 30, W = 40
10 20 30
40
Departamento de Informtica
A operao de sada de dados transfere para o mundo exterior um ou mais valores ou variveis
desejadas. Apresenta a seguinte forma geral:
printf(<formato1> <formato2> ... <formatoN>, var1, var2, ..., varN);
A tabela a seguir nos mostra alguns dos possveis formatos a serem usados:
Cdigo
Formato
%c
caracter
%d
Inteiros decimais com sinal
%i
Inteiros decimais com sinal
%e
Notao cientfica (e minsculo)
%E
Notao cientfica (E maiscula)
%f
Ponto flutuante decimal
%g
Usa %e ou %f, o que for mais curto
%G
Usa %G ou %F, o que for mais curto
%o
Octal sem sinal
%s
String de caracteres
%u
Inteiros decimais sem sinal
%x
Hexadecimal sem sinal (letras minsculas)
%X
Hexadecimal se sinal (letras maisculas)
%p
Apresenta um ponteiro
%n
O argumento associado um ponteiro para inteiro
no qual o nmero de caracteres escritos at esse
ponto colocado
%%
Escreve o smbolo %
Exemplo:
Tome o seguinte trecho do programa:
printf(Entre com dois numeros inteiros: );
scanf(%d %d, &num1, &num2);
printf(%d , num1);
printf(%d\n, num2); //o \n faz com que ele pule para a prxima linha
printf(Soma: %d, num1+num2);
printf(\n);
printf(Fim Programa);
Simulao da execuo:
TELA
Entre com dois nmeros inteiros:1 2
12
Soma: 3
Fim Programa
- 16 -
Departamento de Informtica
Departamento de Informtica
entender a funo de cada varivel e cada linha de cdigo daqui a um ano, as 21:00 horas de uma
sexta-feira de carnaval, quando este programa der um defeito e eu for o responsvel pela sua
correo?
Muitos programadores acostumados a restries de linguagens antigas tm o mau costuma de definir
nomes de variveis muito pequenos e pouco explicativos (uma ou duas letras), tambm s incluem
comentrios quando so diretamente obrigados pela sua chefia,e isto aps a escrita do seu programa,
quando j esqueceram boa parte das funes do programa e suas variveis.
A experincia demonstra que o tempo gasto em escrever nomes maiores e mais explicativos bem
menor que aquele gasto tentando lembrar a funo e o tipo de uma varivel de nome XY2 na milsima
primeira linha de cdigo, ou procurando a definio desta varivel na folha de nmero 257 em um
bloco de listagem com 500 pginas.
Na mesma linha de raciocnio, os comentrios podem e devem ser definidos durante a construo do
programa. Ao utilizar as tcnicas de programao estruturada, o programador ter todos os comentrios
apropriados a cada parte do programa antes de iniciar seu detalhamento final.
Comentrios no cabealho
- 18 -
Departamento de Informtica
- 19 -
Departamento de Informtica
Calcular a mdia final de um aluno do curso de programao a partir de suas trs notas parciais. Caso
sua nota final seja inferior (superior) a 6.0, imprima uma aviso de que o aluno foi reprovado
(aprovado).
Algoritmo em portugus:
- 20 -
Departamento de Informtica
Departamento de Informtica
Note que este programa embora funcione no eficiente, pois caso o nmero n1 seja maior mais dois
teste so feitos desnecessariamente.
Um a segunda verso mais eficiente utilizando comandos de seleo aninhados dada no seguninte
exemplo:
main(){
/* Funcao: le tres nmeros e identificar o maior.
Entrada: tres numeros inteiros.
Saida: o maior dos tres numeros inteiros. */
int n1, n2, n3;
printf(Entre com os tres numeros: );
scanf(%d %d %d, &n1, &n2, &n3);
if (n1 > n2){
if (n1 > n3){
printf(O maior eh: %d., n1);
}
else {
printf(O maior eh: %d., n3);
}
}
else{
if (n2 > n3) {
printf(O maior eh: %d., n2);
}
else {
printf(O maior eh: %d., n3);
}
}
}
Comando Switch
Sua forma geral :
switch (expresso) {
case valor1: comando1
case valor2: comando2
.
.
.
case valorN: comandoN
default : comando
}
- 22 -
Departamento de Informtica
O comando switch permite que seja realizada uma entre as n seqncias de operaes, dependendo do
valor do seletor.
O valor do seletor o comparado com cada valor de seqncia de valores. Se algum dos valores
comparados for igual ao valor do seletor a seqncia de operaes a ele relacionada ser executada.
O caso intitulado default executado se nenhum outro for satisfeito. O default opcional.
Exemplo:
Ler uma vogal e exibir a vogal subseqente. Considere letras maisculas.
main(){
/* Funcao: ler uma vogal e exibir a vogal subsequente
Entrada: uma vogal
Saida: uma vogal subsequente */
char cor;
printf(Entre com uma vogal maiuscula: );
scanf(%c, &cor);
switch (cor) {
case A: cor = E;
case E: cor = I;
case I: cor = O;
case O: cor = U;
case U: cor = A;
}
printf(Vogal subsequente: %c, cor);
}
Exemplo:
Ler ms e ano e exibir o nmero de dias do ms / ano digitado.
main(){
int dia, mes, ano;
printf(Entre com o mes: );
scanf(%d, &mes);
scanf(%d, &ano);
switch (mes) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12: dia = 31;
case 4: case 6: case 9: case 11: dia = 30;
- 23 -
Departamento de Informtica
case 2: {
if (ano % 4 == 0){
dia = 29;
}
else {
dia = 28;
}
}
}
printf(O mes %d do ano %d possui %d dias., ms, ano, dia);
}
III.7.3 Estrutura de Repetio
Quando um conjunto de aes executado repetidas vezes, tem-se uma repetio.
A estrutura de repetio, assim como a estrutura de seleo, envolve sempre a avaliao de uma
condio. Existem trs tipos bsicos de repetio em C: while, do-while e for.
Comando while
Sua forma geral :
while(expresso)
comando
A estrutura while usada para repetir n vezes uma ou mais instrues, tendo como vantagem o fato
de no ser necessrio conhecer o valor de n (nmero de repeties).
Antes da seqncia ser executada, a condio avaliada. Se na primeira avaliao a condio for falsa
a seqncia de operaes no executada uma nica vez. Caso a condio seja verdadeira a seqncia
de operaes executada repetidamente at que a condio se torne falsa.
Logo, em algum momento esta condio deve ser modificada dentro do lao while, caso contrrio a
seqncia ser executada indefinidamente provocando um loop no programa.
Exemplo:
Dado um nmero externo, imprimir a tabuada desse nmero, de zero a nove:
main(){
int numero, multiplicador, produto;
scanf(%d, &numero);
multiplicador = 0;
while (multiplicador <= 9){
produto = numero * multiplicador;
printf(numero * multiplicador = %d, produto);
multiplicador = multiplicador + 1;
}
- 24 -
Departamento de Informtica
}
Neste exemplo o valor da varivel multiplicador modificado a cada iterao do lao while. A
seqncia de operaes do comando while executada at que o valor do multiplicador seja maior que
9, isto , a condio se torne falsa.
Comando do-while
Assim como o comando while, este comando usado quando no se conhece o nmero de vezes que
uma seqncia de comandos ser executada.
Sal forma geral :
do
comando
while (expresso);
O do-while testa avalia a expresso no final, depois de fazer cada passagem pelo corpo do lao, por
tanto o corpo executado ao menos suma vez.
Exemplo:
1) Dada a srie 2, 3, 4, 9, 16, 29, 54, 99... onde cada elemento a partir do quarto a soma dos trs
termos que lhe antecedem, faa um programa que leia trs termos iniciais quaisquer, e a partir da
obtenha e imprima mais 20 termos da referida srie.
main(){
int num1, num2, num3, num, n;
printf(Entre com os tres primeiros termos: );
scanf(%d %d %d, &num1, &num2, &num3);
printf(%d %d %d , num1, num2, num3);
n = 0;
do {
num = num1 + num2 + num3;
printf(%d , num);
num1 = num2;
num2 = num3;
num3 = num;
n = n + 1;
} while (n < 20);
}
2)
- 25 -
Departamento de Informtica
main(){
char resp;
do {
printf(deseja continuar? S/N \n);
resp = getchar();
} while ((resp != S) || (resp != N));
}
Neste exemplo novos caracteres so lidos at que seja teclado S ou N.
Comando for
O comando for til quando se deseja realizar uma seqncia de operaes um nmero fixo e
conhecido de vezes.
Apresenta-se da seguinte forma:
for (<inicializao>; <condio>; <incremento>)
comando
A inicializao so os comandos de atribuies feitas s variveis desejadas. A condio uma
expresso relacional que determina quando o lao acaba. O incremento define como as variveis de
controle variam com cada passo do lao.
No exemplos
for (i = 1; i <= 10; i++)
printf(%d \n, &i);
e
for (i = 10; i >= 1; i--)
printf(%d \n, &i);
Ocorrem 10 repeties. No primeiro for a varivel de controle recebe inicialmente o valor 1 e
incrementada automaticamente de 1 a cada repetio at que o primeiro valor acima de 10 seja obtido.
Isto ocorre porque antes da seqncia ser executada, o valor da <inicializao> atribudo varivel de
controle e a cada iterao seu valor comparado na <condio>, a seqncia de comando ser
executada se a varivel de controle satisfizer a <condio>. No segundo for a varivel decrementada
de 1.
A varivel de controle deve ser do tipo enumervel e deve ser declarada no dicionrio de dados.
Exemplos:
1)Ler 3 notas e imprimir a mdia.
#define numNotas 3
main(){
int i;
float nota, soma, media;
- 26 -
Departamento de Informtica
soma = 0;
for (i = 0; i < numNotas; i++){
printf(Entre com a nota: );
scanf(%f, ¬a);
soma = soma + nota;
}
media = soma / numNotas;
printf(A media eh: %f, media);
}
2)Ler n notas e imprimir a mdia
main(){
int n, i;
float nota, soma;
soma = 0;
printf(Entre com o numero de notas: );
scanf(%d, &n);
for (i = 0; i < n; i++){
printf(Entre com a nota: );
scanf(%d, ¬a);
soma = soma + nota;
}
if (n > 0){
printf(A media eh : %f, soma / n);
}
}
III.8 Um Algoritmo para a construo de Programas
Os estudos da psicologia sobre a memria humana apontam que uma pessoa com capacidade de
memorizao mediana consegue definir, de forma imediata, cerca de 8 fatos ao mesmo tempo, isto ,
apena 8 fatos ou valores podem ser recordados imediatamente se a pessoa for questionada sobre
eles.
Para poder recordar mais fatos simultaneamente, existem dois caminhos: 1) a pessoa deve decorar os
valores, de forma a acess-los de forma automtica; 2) deve ser dado um tempo para que a pessoa
consiga lembra o valor solicitado.
- 27 -
Departamento de Informtica
Na construo de programas, mesmo para a resoluo de programas simples como os estudantes aqui,
a quantidade de fatos a se recordar ultrapassa facilmente estes limites. Alm disso, geralmente no se
dispe de tempo para se decorar cada uma das entradas e / ou sadas do problema, suas variveis, a
estrutura do algoritmo (uso de repeties e selees), etc.
Um dos objetivos das tcnicas de programao estruturada permitir a pessoas normais o
desenvolvimento de programas (e, por conseguinte, de algoritmos) com boa produtividade. Como j foi
apontado anteriormente, duas ferramentas so fundamentais para este processo: as tcnicas de
refinamentos sucessivos e de representao de algoritmos.
Ao se desenvolver pequenos algoritmos, estas ferramentas podem ser dispensadas, porque a memria
capaz de tratar todos os elementos (variveis e estruturas de seleo e repetio, por exemplo)
programador sente dificuldades em trabalhar nesta maneira pouco metdica. A seguir, apresenta-se uma
estratgia ara auxiliar o desenvolvimento de programas;
Metodologia para o Desenvolvimento de Programas
1)Ler especificao do problema at o final, de forma a compreender de que se trata o assunto;
2)Ler novamente, tomando o cuidado de fazer e ressaltar os pontos fundamentais (entrada, sada,
restries e condies de parada);
3)Montar o cabealho do programa, inclusive (e principalmente!) os comentrios pertinentes: funo,
entrada, sada, restries e condies de parada.
4)Escrever em portugus, da forma que deseja, a seqncia de aes necessrias a obteno dos
resultados desejados. Importante: evite, neste momento, a utilizao de nomes de variveis. Utilize a
tcnica de refinamentos sucessivos para transformar procedimentos complexos em outros mais simples,
at obter um texto baseado apenas em aes simples, estruturas de seleo e repetio. Ao fim desse
passo, dever ser possvel visualizar as estruturas de repetio e seleo necessrias ao algoritmo final.
5)Monte o dicionrio de dados d programa, baseando-se no seguinte roteiro:
5.1)defina as constantes existentes no problema (ex: nmero de elementos de um conjunto,
valores mximos ou mnimos de algum dado, etc.);
5.2)defina as variveis necessrias para receber os valores de entrada (uma varivel para cada
dado de entrada). Estas entradas j esto disponveis nos comentrios do cabealho;
5.3)defina as variveis de sada necessrias para escrever os resultados desejados. Novamente,
os comentrios do cabealho serviro de base para este passo;
5.4)defina as variveis necessrias ao clculo (o algoritmo em portugus pode ser til para esta
tarefa). Por exemplo: para calcular a mdia de um conjunto de valores, necessita-se do valor acumulado
destes valores e do nmero de elementos do conjunto;
5.5)defina as variveis necessrias ao controle de fluxo de processamento do programa (o
algoritmo em portugus vai ajudar). Por exemplo: se o programa deve parar ao processar o centsimo
elemento de entrada, ento ser necessria uma varivel para controle do nmero de elementos
processados (um contador). As variveis de controle esto sempre associadas s condies testadas nas
estruturas de seleo e repetio do problema, portanto, utilize o algoritmo em portugus para auxiliar
tambm este passo.
6)Comece a traduzir o algoritmo em portugus escrito em 4 partes para o C, utilizando as constantes e
variveis descritas no dicionrio de dados montado no passo 5.
7)Verifique se todas as variveis foram devidamente inicializadas (veja observaes abaixo). Caso no
tenham sido, identifique o momento ideal de sua inicializao e inclua-a no algoritmo escrito no passo
6.
8)Verifique a correo do programa atravs de um ou mais testes de mesa (teste chins).
- 28 -
Departamento de Informtica
OBSERVAES:
RESISTA a tentao de saltar as fases desta metodologia. Criando o hbito de utiliz-la, voc
poder identificar adaptaes que se ajustem melhor a sua forma de trabalho, mas, ACREDITE, todos
os passos descritos acima so necessrios para a construo de um programa.
Sempre que identificar uma estrutura de repetio, haver uma ou mais variveis associadas
sua condio de parada. Verifique, ento, que: a)estas variveis tenham recebido um valor inicial antes
do inicio da repetio; b)em algum ponto da repetio o valor de pelo menos uma destas variveis
atualizado de maneira a tornar falsa a condio de continuidade da repetio.
Utilize nomes de variveis que descrevam a sua funo; nunca use a mesma varivel para
executar duas funes diferentes.
III.9 Programas Exemplos
A)Calcular as razes de uma equao do segundo grau, lidos os valores dos coeficientes A, B e C:
Algoritmo:
Leitura de valores
Calculo de delta
Se delta maior ou igual a zero: Calcular as razes reais
Seno: No h razes reais
Calcular as razes reais:
Se delta igual a zero: calcular raiz nica.
Se no: calcular razes distintas
main(){
/*Funcao: Calcular as razes reais de uma equao de segundo grau.
Entrada: os coeficientes A, B e C
Sada: as raizes reais da equao*/
float A, B, C, delta, raizDelta, raiz1, raiz2;
Scanf(%f %f %f, &A, &B, &C);
//calcular delta
delta = B * B - 4 * A * C;
if (delta >= 0){
if (delta == 0){
- 29 -
Departamento de Informtica
Departamento de Informtica
}
numero = numero + 2;
}
}
D)Calcular a soma de uma progresso aritmtica de 50 termos, sendo lidos o primeiro termo e a razo:
#define numTermos 50
main(){
/*Condio de parada: ter somado os 50 termos da PA*/
float primeiroTermo, razao, soma, termo;
int contaTermos;
scanf(%f %f, &primeiroTermo, razao);
contaTermos = 1;
termo = primeiroTermo;
soma = primeiroTermo;
do {
termo = termo + razao;
soma = soma + temo;
contaTermos = contaTermos + 1;
} while(contaTermos != 50);
}
E)Calcular o Maximo divisor comum entre dois nmeros:
O MDC de dois nmeros pode ser obtido escolhendo o maior deles e subtraindo-lhe o valor do menos.
Esta operao repetida at que os dois sejam iguais, cujo valor ser o MDC dos nmeros iniciais:
33 15
45 18
18 15
27 18
03 15
09 18
03 12
09 09
03 09
MDC = 09
03 06
03 03
MDC = 03
main(){
- 31 -
Departamento de Informtica
Departamento de Informtica
}
G)Clculo do maior nmero positivo sem saber quantos so previamente.
Dada uma quantidade indefinida de valores positivos a serem lidos, o programa a seguir determina qual
o maior deles.
#define delimitador -1
main(){
/*Restricao: os nmeros devem ser inteiros positivos
Parada: ao ser lido o valor -1*/
int numero, maior;
printf(Entre com o primeiro numero: \n);
printf(Digite -1 para encerrar a entrada de dados\n);
scanf(%d, &numero);
maior = numero;
while (numero != delimitador){
if (numero > maior){
maior = numero;
}
printf(Entre com o prximo numero: \n);
printf(Digite -1 para encerrar a entrada de dados.\n);
scanf(%d, &numero);
}
if (maior !=delimitador){
printf(O maior numero eh: %d, maior);
}
else {
printf(No foi lido nenhum numero positivo);
}
}
Lista de exerccios
1)Construa um programa que apresente os 100 primeiros nmeros mpares.
2)Construa um programa que calcule e apresente todos os divisores de um nmero lido.
3)Construa um programa que apresente os 200 primeiros nmeros primos.
- 33 -
Departamento de Informtica
4)Construa um programa que apresente os 100 primeiros nmeros de uma Progresso Geomtrica,
sendo lidos o primeiro termo e a razo.
5)Fazer um programa que calcule e escreva uma tabela de graus centgrados em funo de graus
farenheit que variam de 50 a 150 de 1 em 1.
6)Um comerciante deseja fazer o levantamento do lucro das mercadorias que ele comercializa. Para
isto, ele reuniu as seguintes informaes: nmero de mercadorias, preo de compra e preo de venda.
Fazer um programa que:
Determine e escreva quantas mercadorias proporcionam:
lucro < 10%
10% < lucro < 20%
lucro > 20%
Determine e escreva o valor total de compra e de venda de todas as mercadorias, assim
como o lucro total.
7)Suponha que a populao de um pas A seja de 9.000 habitantes com uma taxa anual de crescimento
de 3% e que a populao de um pas B seja, aproximadamente, de 20.000 de habitantes com uma taxa
anual de crescimento de 1,5%, fazer um programa que calcule e escreva nmero de anos necessrios
para que a populao de pas A ultrapasse ou se iguale populao do pas B, mantidas estas taxas de
crescimento.
8)Uma certa firma fez uma pesquisa de mercado para saber se as pessoas gostaram ou no de um novo
produto lanado no mercado. Para isso, obteve, para cada pessoa entrevistada, informaes a respeito
do sexo do entrevistado e sua resposta (S = Sim ou N = No). Sabe-se que foram entrevistados 2000
pessoa, fazer um programa que calcule e escreva:
O nmero de pessoas que responderam sim
9)O sistema de avaliao de uma determinada disciplina obedece aos seguintes critrios:
considerado aprovado o aluno que obtiver nota final superior ou igual a 60 e que tiver
comparecido a um mnimo de 40 aulas.
Fazer um programa que:
Calcula:
a) a nota final de cada aluno
b) a maior e a menor nota da turma
c) a nota mdia da turma
- 34 -
Departamento de Informtica
10)Escreva um programa que encontre o maior e o segundo maior nmero de uma srie de nmeros
lidos do teclado.
11)Faa um programa para ler uma seqncia de nmeros inteiros positivos (um por vez), e verificar se
eles so pares ou mpares.
12)Dada a srie de Fibonacci
S = 2 3 5 8 13 21 34 55 .....
Escreva um programa que gere essa srie at o n-simo termo (n ser lido).
Dica:
esta srie tal que cada nmero a partir do terceiro a soma dos dois anteriores.
13)Escreva um programa para ler 50 dados do tipo base e altura, que contm as medidas de diferentes
retngulos. Imprimir o permetro e a rea de cada retngulo.
14)Escreva um programa para calcular o calor de usando a frmula:
=
refazer essa parada!!!!!!
Escreva um programa para ler uma seqncia de 30 cdigos de vendedores de uma firma comercial,
juntamente com os respectivos totais de vendas dirias e verificar quantos deles esto na faixa
compreendida entre R$ 500,00 e R$ 1500,00. Imprimir uma lista listagem contendo todo os cdigos
dos vendedores situados no intervalo especificado, e a quantidade de vendedores neste intervalo.
16)Leia uma lista de dados contendo o nmero da conta e o saldo mdio dos correntistas de uma
caderneta de poupana. Imprimir uma listagem contendo o total de:
a)clientes bons: 500,00 <= SALDO MDIO => 1000,00
b)clientes razoveis: SALDO MDIO < 500,00
c)clientes prioritrios: SALDO MDIO > 1000,00
Imprima tambm a lista dos clientes prioritrios. O flag de sada para o comando de repetio ser
referente ao SALDO MDIO, sair quando este for igual a zero.
17)Um servio de correspondncia sentimental deseja obter informaes sobre seus clientes. Cada
cliente forneceu as seguintes informaes:
MATRICULA, SEXO (M ou F), IDADE, ALTURA (em m), PESO (em Kg), COR DOS OLHOS
(1-azul, 2-castanhos, 3-outros), COR DOS CABELOS (1-castanhos, 2-loiros, 3-outros).
Escrever um programa que leia estes dados e imprima as matrculas de:
- 35 -
Departamento de Informtica
a) todos os homens loiros de olhos azuis e altura maior que 1.75 m, pesando entre 75 Kg e 95
Kg.
b) Todas as mulheres de olhos castanhos, altura entre 1.65 m e 1.75 m, pesando menos de 60
Kg.
Utilizar um flag para indicar o final da entrada de dados.
18)Escreva um programa para ler uma seqncia de dados contendo a matrcula e a altura dos
funcionrios de uma empresa. Obter uma listagem para o Departamento de Educao Fsica e
Desportos contendo a matrcula e a medida de todos funcionrios altos (acima de 1.80 m). Imprimir a
altura mdia dos funcionrios e o total de:
- 36 -
Departamento de Informtica
- 37 -
Departamento de Informtica
CAPTULO IV
MODULARIZAO
Objetivos
- 38 -
Departamento de Informtica
Permitir a diviso de tarefas em uma equipe cada mdulo pode ser realizado por um
programador diferente.
- 39 -
Departamento de Informtica
<comandos>
}
A primeira linha dita declarao da funo, nela encontramos o tipo que a funo retorna, o nome
dela e a lista de argumentos. Aps a declarao, encontramos a lista de comandos entre as chaves.
O tipo de retorno serve para especificar qual o tipo de dados retornado pela funo, podendo ser do tipo
int, float, etc. Nos casos em que a funo no retorna nenhum tipo, devemos defini-la como void, ou
seja, sem retorno.
A lista de argumentos serve para dizer quais so os valores recebidos pela funo e seus respectivos
tipos.
IV.2.3 Onde colocar as Funes
As funes podem ser declaradas no mesmo arquivo da main ou num outro arquivo separado.
IV.2.3.1 Funes no mesmo arquivo
Quando uma funo declarada no mesmo arquivo existe a possibilidade dela ser declarada antes ou
depois da main.
IV.2.3.1.1 Funes no mesmo arquivo e antes da main
Quando as funes so declaradas antes da main no necessrio adicionar nenhuma outra instruo. A
sintaxe fica assim:
tipo nome_funcao(lista_de_argumentos){
comandos
//definio da funo
}
void main(){
.
.
.
- 40 -
Departamento de Informtica
variavel = nome_funcao(lista_de_argumentos);
.
.
.
//chamada da funo
}
IV.2.3.1.2 Funes no mesmo arquivo e depois da main
Quando a funo definida depois da main necessrio incluir um prottipo da funo chamada. Um
prottipo constitui-se do tipo de retorno da funo, do nome da funo e quantidade de argumentos
junto com seus tipo. A sintaxe dessa declarao a seguinte:
tipo nome_funcao(lista_de_argumentos);
void main(){
.
.
.
variavel = nome_funcao(lista_de_argumentos);
.
.
.
}
//chamada da funo
tipo nome_funcao(lista_de_argumentos){
comandos
//definio da funo
}
IV.2.3.2 Funes em arquivo separado
Nesse caso necessrio incluir o arquivo onde se encontra a funo ao arquivo onde ela est sendo
usada. Essa incluso feita atravs do comando #include que diz para o compilador na hora da
compilao que ele precisa fazer alguma(s) incluso(s).
Supondo que a funo esteja no arquivo funcoes.h, a sintaxe ficaria assim:
#include funcoes.h
main(){
.
.
.
variavel = nome_funcao(lista_de_argumentos);
.
.
.
}
IV.2.4 Hierarquia das funes
- 41 -
Departamento de Informtica
Quando uma funo chama a outra, dizemos que a funo que chama tem uma hierarquia superior a da
funo chamada.
As funes com hierarquia inferior devem ser declaradas antes das funes com hierarquia superior.
Isso deve ser feito para que ao se fazer a chamada de uma funo, ela j seja conhecida.
IV.2.5 Recurso
Funo recursiva uma funo que faz chamada a si mesma.
importante ressaltar que a cada nova chamada da funo recursiva um novo conjunto de variveis
criado.
Exemplo: um bom exemplo do uso de funo recursiva o clculo do fatorial de um numero.
int fatorial (int numero){
if (numero < 0){
return 0;
}
if (numero == 0){
return 1;
}
return (numero * (fatorial (numero-1)));
}
O primeiro if avalia se o nmero de entrada menor que zero, caso seja a funo retorna zero pois
no existe fatorial de nmero negativo. J quando o nmero igual a zero, o segundo if faz com que
a funo retorne um pois o fatorial de zero um. Para os nmeros maiores que zero, a funo retorna a
multiplicao do nmero pelo fatorial do seu antecessor. Repare que para esse ltimo caso, a recurso
ir terminar quando o antecessor do nmero for zero pois a chamada de fatorial(0) no chamar outra
vez a funo fatorial conforme visto anteriormente.
- 42 -
Departamento de Informtica
CAPTULO V
ESTRUTURAS
Objetivos
- 43 -
Departamento de Informtica
}
Outra forma de modificar os elementos da estrutura mostrada no prximo exemplo.
Exemplo: tomemos a estrutura data declarada anteriormente.
main(){
struct data nascimento;
printf(\nDigite o dia do seu nascimento: );
scanf (%d, &nascimento.dia); //observe que nascimento.dia indica que voc est
//armazenando o dado de entrada na varivel dia que est
//dentro da varivel aniversario, que por sua vez do tipo
// struct data.
printf(\nDigite o mes do seu nascimento: );
scanf (%d, &nascimento.mes);
printf(\nDigite o ano do seu nascimento: );
scanf (%d, &nascimento.ano);
printf(\nVoce nasceu no dia %d do mes %d do ano %d\n, nascimento.dia, nascimento.mes,
nascimento.ano);
}
V.4 O comando typedef
- 44 -
Departamento de Informtica
Esse comando bastante til para atribuirmos novos nomes a tipos de dados. Ele permite, por exemplo,
que voc atribua ao tipo int o nome tipoDeEntrada para designar que o tipo de entrada de uma
determinada funo ser o int.
A sintaxe desse comando muito simples e pode ser vista a seguir:
typedef tipo novo_nome;
No exemplo citado acima, a renomeao do tipo int ficaria assim:
typedef int tipoDeEntrada;
Assim, quando fizermos as declaraes
int entrada;
e
tipoDeEntrada entrada;
estamos declarando a mesma coisa.
Esse comando nos permite tambm renomear estruturas criadas por ns, para que a declarao de uma
varivel do tipo dessa estrutura seja menos trabalhosa.
Tomando como exemplo a estrutura declarada anteriormente para representar um ponto, poderamos
usar o typedef do seguinte modo:
typedef struct ponto {
int x;
int y;
} ponto;
Dessa forma uma varivel que antes era declara fazendo
struct ponto centro;
pode ser declarada usando
ponto centro;
Outra forma de se usar o typedef com estruturas fazer:
typedef struct ponto ponto;
struct ponto {
int x;
int y;
};
A declarao de uma varivel ficaria do mesmo jeito do caso anterior.
V.5 Estruturas e Funes
As estruturas so muito teis quando estamos trabalhando com funes pois elas podem agrupar dados
que sero passados como parmetro para as funes e permitem que uma funo retorne mais de um
valor.
V.5.1 Estruturas como parmetros
A passagem de estrutura como parmetro para funo muito utilizada pois permite que os dados com
caractersticas comuns cheguem agrupados e tambm por diminuir o nmero de parmetros da funo
facilitando o seu entendimento.
A declarao de uma funo que recebe uma estrutura como parmetro feita da mesma forma que a
de uma funo que recebe apenas tipos bsicos de dados como parmetro.
- 45 -
Departamento de Informtica
A seguir mostraremos um exemplo de uma funo que recebe uma varivel do tipo ponto declarado
anteriormente e retorna o quadrante ao qual ele pertence .
int qualQuadrante (ponto p){
/*A funo retorna 0 quando p for parte do limite de quadrantes, 1 quando p pertencer ao
1 quandrate, 2 quando pertencer ao 2 quadrante, 3 se pertencer ao 3 quadrante e 4
caso seja do 4 quadrante.*/
if (p.x == 0 || p.y == 0){
return 0;
}
if (p.x > 0){
if(p.y > 0){
return 1;
}
else {
return 4;
}
}
else {
if(p.y > 0){
return 2;
}
else {
return 3;
}
}
}
V.5.2 Estruturas como tipo de retorno
Estruturas so usadas com freqncia quando queremos que uma funo retorne mais do que valor.
Nesse caso precisamos declarar que o tipo de retorno da funo uma determinada estrutura.
Tome como exemplo uma funo que recebe trs nmeros inteiros distintos e retorna o maior e o
menor deles.
Para esse exemplo usaremos uma nova estrutura:
typedef struct maiorEmenor {
int maior;
int menor;
} mEm;
Agora vejamos como fica o prottipo dessa funo:
mEm maior_menor (int , int , int );
ou
struct maiorEmenor maior_menor(int , int , int );
Agora podemos definir a funo, ela fica assim:
- 46 -
Departamento de Informtica
- 47 -
Departamento de Informtica
Podemos definir um tipo abstrato de dados para representar os pontos do plano XY. Para isso considere
a estrutura denominada ponto.
typedef ponto {
int x;
int y;
} ponto;
Agora j sabemos como so os elementos bsicos desse tipo. O prximo passo implementar uma
funo que opere elementos desse tipo. Um exemplo de uma operao entre elementos desse tipo o
clculo da distncia entre dois pontos.
float distanciaPontos (ponto a, ponto b){
float distancia, deltaX, deltaY;
deltaX = a.x b.x;
deltaY = a.y b.y;
distancia = sqrt(deltaX*deltaX+deltaY*deltaY);
return distancia;
}
- 48 -
Departamento de Informtica
CAPTULO VI
VETORES
Objetivos
Introduzir a estrutura de dados vetor, explicar seu conceito e mostrar sua utilidade;
Apresentar as operaes bsicas sobre vetores.
1
5
2
15
3
6
4
3
5
2
6
12
- 49 -
Departamento de Informtica
Por exemplo, para calcular quais as notas dos alunos de uma turma so maiores que a mdia, seria
preciso ter-se uma idia de quantos alunos no mximo uma turma poderia possuir.
VI.3 Acesso aos elementos do vetor
Os elementos do vetor so acessados atravs da citao do nome da varivel (que indica qual vetor
estamos acessando) e de um ndice (que determina qual elemento queremos acessar). Este ndice no
pode ser um valor maior que o tamanho do vetor menos um nem tampouco um valor menor que zero.
A sintaxe de acesso a um vetor dada por:
nome_vetor[ndice]
Exemplo:
vetor[3] = 987;
vetor[indice+1] = vetor[3*2];
VI.4 Operaes bsicas sobre vetores
Em C no existem operaes pr-definidas para a manipulao de vetores como um todo. Por exemplo,
no permitido ler o contedo de um vetor inteiro com o comando scanf. As operaes s podem ser
feitas para cada elemento do vetor.
Portanto, as operaes bsicas de vetor devem ser simuladas atravs de subprogramas. A seguir sero
apresentadas uma srie de operaes bsicas para vetores.
Como sabemos, no parmetro associado por valor uma cpia do argumento e a duplicao de
estruturas do tipo vetor pode ocasionar problemas de memria e ineficincia do programa. A maneira
de resolver estes dois problemas forar a passagem do vetor por referncia, porm conceitualmente o
uso desse artifcio incorreto, devendo ser implementado somente aps ter sido testado e nunca
desacompanhado de um comentrio.
Voc ver nos procedimentos apresentados a seguir que um vetor apesar de no ser modificado no seu
interior ( um argumento de entrada) este passado por referncia, como por exemplo o procedimento
para escrita de um vetor.
VI.4.1 Leitura e Escrita
Um exemplo de uma funo que faz a leitura dos elementos de um vetor de inteiros.
void leitura_vetor (int vetor[], int tamanho){
int i;
for (i = 0; i < tamanho; i++){
scanf(%d, &vetor[i]);
}
}
Agora mostraremos uma funo que imprime os elementos de um vetor de inteiros.
void imprime_vetor (int vetor[], int tamanho){
int i;
- 50 -
Departamento de Informtica
Departamento de Informtica
}
VI.4.5 Pesquisa Binria
int pesquisa_binaria (int vetor[], int tamanho, int elemento){
/*Funcao: Percorrer o vetor ordenado (ordenado crescente), particionando-o ao meio e procurando
determinado elemento. Esta funcao retorna o valor -1 caso o elemento nao seja encontrado. Caso
contrario, retorna o ndice do vetor onde o elemento foi encontrado.*/
int inicio, fim, meio;
inicio = 0;
fim = tamanho 1;
while (inicio <= fim){
meio = (inicio + fim) / 2;
if (elemento < vetor[meio]){
fim = meio 1;
}
else {
if (elemento > vetor[meio]){
inicio = meio + 1;
}
else {
return meio;
//encontrou!!!
}
}
}
return -1;
}
VI.4.6 Insero em Posio Pr-determinada do Vetor
void insere (int vetor[], int elemento, int posio, int tamanho){
/*Funcao: inserir um novo elemento numa posicao pre-estabelecida.*/
int i;
if ((posicao < 0) || (posicao > tamanho-1)){
printf(\nEntrada de Dados Incorreta\n);
}
else {
for (i = tamanho 2; i > posicao 1; i--){
vetor[i + 1] = vetor[i];
}
vetor[posicao] = elemento;
}
- 52 -
Departamento de Informtica
}
VI.4.7 Excluso de Elementos de Vetor
void excluir (int vetor[], int elemento, int tamanho){
/*Funcao: Percorrer o vetor sequencialmente procurando o elemento. Caso encontre-o retira-lo. Caso
contrario, manter o vetor inalterado.*/
int i, posicao, encontrou;
encontrou = 0;
posicao = 0;
while ((posicao < tamanho) && (!encontrou)){
if (vetor[posicao] == elemento){
encontrou = 1;
for (i = posicao; i < tamanho 1; i++ ){
vetor[i] = vetor[i + 1];
}
}
posicao += 1;
}
}
VI.4.8 Ordenao pelo Mtodo do Menor
void ordenacao_menor (int vetor[], int tamanho){
int posicao, i, indice_menor, menor;
for (posicao = 0; posicao < tamanho 1; posicao++){
menor = vetor[posicao];
for (i = posicao + 1; i < tamanho; i++){
if (vetor[i] < menor){
menor = vetor[i];
indice_menor = i;
}
}
vetor[indice_menor] = vetor[posicao];
vetor[posicao] = menor;
}
}
VI.4.9 Ordenao pelo Mtodo da Bolha
void ordenacao_bolha (int vetor[], int tamanho) {
- 53 -
Departamento de Informtica
int a, b, t;
for (a = 1; a < tamanho; a++){
for (b = tamanho 1; b >= a; --b){
if (vetor[b - 1] > vetor[b]){
t = vetor[b 1];
vetor[b 1] = vetor[b];
vetor[b] = t;
}
}
}
}
VI.5 Exemplo de programa que utiliza vetores
A)Este programa l dois vetores de mesma dimenso, calcula a sua soma e seu produto escalar,
apresenta em seguida os resultados.
#define tamanho 100
void leitura_vetor_inteiros (int vetor[], int tamanho_vetor){
int i;
for (i = 0; i < tamanho_vetor; i++){
scanf (%d, vetor[i]);
}
}
void escrita_vetor_inteiros (int vetor[], int tamanho_vetor){
int i;
printf(\n);
for (i = 0; i < tamanho_vetor; i++){
printf(%d , vetor[i]);
}
printf(\n);
}
- 54 -
Departamento de Informtica
void soma_vetores_inteiros (int vetor1[], int vetor2[], int vetor_soma[], int tamanho_vetores){
int i;
for (i = 0; i < tamanho_vetores; i++){
vetor_soma[i] = vetor1[i] + vetor2[i];
}
}
int produto_escalar (int vetor1[], int vetor1[], int tamanho_vetores){
int i, prod_esc;
prod_esc = 0;
for (i = 0; i < tamanho_vetores; i++){
prod_esc = prod_esc + vetor1[i] * vetor2[i];
}
return prod_esc;
}
main(){
int vetor1[tamanho], vetor2[tamanho], vetor_soma[tamanho], prod_esc;
leitura_vetor_inteiros(vetor1, tamanho);
leitura_vetor_inteiros(vetor2, tamanho);
soma_vetores_inteiros (vetor1, vetor2, vetor_soma, tamanho);
escrita_vetor_inteiros (vetor_soma, tamanho);
prod_esc = produto_escalar (vetor1, vetor1, tamanho);
printf(\n%d\n, prod_esc);
}
- 55 -