UFMG - ICEx - DCC
DCC003 --Algoritmos e Estruturas de Dados
I -- AEDsI
Utilize o gabarito abaixo e escreva
programas variando os tipos (veja os tipos no material de variáveis) variando os
nomes e expressões e utilizando a letra de conversão adequada na função
printf(). Acrescente variáveis para poder criar expressões mais complexas.
Tente misturar os tipos e observe os erros e fatos “inesperados”.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
<tipo>
<nome>;
<nome>=<expressão>;
printf("%<letra de
conversão>\n", <nome>);
system("PAUSE");
return 0;
}
Um exemplo simples é o seguinte
programa:
#include <stdio.h>
#include <stdlib.h>
int main(int
argc, char *argv[]){
int a;
a=10%3;
printf("%d\n",
a);
system("PAUSE");
return 0;
}
O programador C pode usar as
seguintes letras:
|
d,i |
para converter de int para base 10 |
|
o |
para converter de int para base 8 |
|
x,X |
para converter de int para base
16, |
|
u |
para converter “unsigned” para
base 10 |
|
c |
para converter de int para 1
caractere |
|
s |
para converter “strings” |
|
f |
para converter de double para
mantissa.decimal |
|
e,E |
para converter de double para m.d
ou m.d Ex |
|
g,G |
seleciona (e,E) ou f |
Utilize o gabarito abaixo para escrever
programas que fazem uso do conceito de “ponteiro para <tipo>”, ou mais
especificamente fazem uso de variáveis do tipo “endereço de <tipo>.
#include <stdio.h>
#include <stdlib.h>
int main(int
argc, char *argv[]){
<tipoT> <nome>;
<tipoT>* <nomeE>;
<nome>=<expressão>;
<nomeE>= & <nome>;
printf("%<letra>
<letra>\n", <nome>, *<nomeE>);
system("PAUSE");
return 0;
}
Um exemplo simples é o seguinte
programa:
#include <stdio.h>
#include <stdlib.h>
int main(int
argc, char *argv[]){
int a;
int* ea;
a=10%3;
ea=&a;
printf("%d
%d\n", a, *ea);
system("PAUSE");
return 0;
}
Faça um desenho do modelo de
memória.
Agora faça novos programas
generalizando o programa acima:
#include <stdio.h>
#include <stdlib.h>
int main(int argc,
char *argv[]){
int a;
int* ea;
int** eea;
a=10%3;
ea=&a;
eea=&ea;
printf("%d %d %d\n", a, *ea,
**eea);
system("PAUSE");
return 0;
}
A partir do desenho do modelo de
memória tente entender por que não funciona o seguinte trecho:
int a;
int* ea;
int** eea;
a=10%3;
eea=&&ea;//erro
------
Escreva um programa que faça a troca
dos valores de duas variáveis.
Considere o seguinte trecho:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
int a=123;
int b=456;
printf("a=%d b=%d\n", a,b);
//troca
valores entre a e b
printf("a=%d b=%d\n", a,b);
system("PAUSE");
return 0;
}
O programa deve ser tal que a primera
escrita escreve 123 e 456, após a execução do trecho deve ser escrito 456 e
123.
----
Leia e tente entender os programas
que calculam os dígitos verificadores de CPF e de CNPJ. Faça programas para
calcular os dígitos verificadores do ISBN-10 do ISBN-13 (procure na Internet)
verifique seus programas com isbn’s a partir da Internet. Investigue outros
“números” e faça programas para gerar seus dígitos verificadores. Abaixo uma
explicação para o cálculo do dígito verificador do ISBN-10.
Em uma sequência de 10 caracteres
representando um ISBN-10, o caractere final (o caractere mais à direita) é um
"dígito" de verificação. Este caractere de verificação pode
corresponder a 11 valores (de 0 a 9 e o valor 10), quando o valor corresponde a
10 devemos utilizar o caractere 'X' (não foi escolhido o caractere 'A' que no
caso de dígitos hexadecimais tradicionalmente representa o valor dez, foi
escolhido o 'X' que corresponde ao dez na numeração romana). O método de
cálculo é como se segue. Considere um ISBN da forma ABCDEFGHI, calcule a soma
dos produtos I*2+H*3+G*4+F*5+E*6+D*7+C*8+B*9+A*10, ou seja cada dígito tera um
“peso” ou valor correspondente à sequência 2,3,4,5,6,7,8,9,.10. O
"caractere" verificador corresponde a 11 menos o resto da divisão por
11 desta soma de produtos, mas caso o resultado seja 11 deve ser considerado o
valor 0 e se o resultado for 10 deve ser
usado o caractere 'X'.
Considere o ISBN 0-13-110362-8 que
corresponde à segunda edição do livro "The C Programming Language".
O caractere final, ou “dígito
verificador” é o '8' (o caractere menos significativo ou mais à direita) e ele
foi calculado da seguinte maneira:
(i) calculou-se a soma dos produtos
dos demais dígitos com os pesos convencionais:
2*2+6*3+3*4+0*5+1*6+1*7+3*8+1*9+0*10=
80
(ii) Calculou-se o resto da divisão
desta soma de produtos por 11
80%11= (80-77)=3
(iii) calculou-se a diferença entre
11 e o resto da divisão por 11 calculado anteriormente
11-3=8
Ou seja o dígito verificador
corresponde a 8.
Para o ISBN 1-23-456789
a soma de produtos é
9*2+8*3+7*4+6*5+5*6+4*7+3*8+2*9+1*10=210
o resto da divisão desta soma por 11
é 210%11=1
em função de 11-1 ser 10 então o
dígito corresponde a ‘X’ (1-23-456789-X).
----
Observe o programa abaixo:
#include
<stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
printf("Este programa le dois
valores e\n"
"verifica qual e' o menor
valor\n\n");
printf("entre com primeiro
valor:");
int v1;
if(scanf("%d",&v1)!=1){
printf("problema... fim de
execucao;\n");
return 0;
};
printf("entre com segundo valor:");
int v2;
if(scanf("%d",&v2)!=1){
printf("problema... fim de
execucao;\n");
return 0;
};
if(v1<v2) printf("menor valor
e' %d;\n", v1);
else if(v2<v1) printf("menor
valor e' %d\n",v2);
else printf("valores(%d) iguais\n", v1);
system("PAUSE");
return 0;
}
(i)Modifique o
programa acima para que ele fique lendo pares de valores até que os dois
valores lidos sejam zero
(ii)Baseado no programa acima faça
um programa que lê três valores e escreve qual é o menor valor. Se não existir
um menor valor o programa escreve que os três valores são iguais. Se dois
valores são iguais mas menores que o outro valor o programa escreve quais são
estes dois valores. As mensagens são:
(1)
o menor valor e’ %d (2) dois valores
iguais (%d) menores que o outro (3) tres valores (%d) iguais