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,
x corresponde ao uso das letras abcdef e
X corresponde ao uso das letras ABCDEF

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
tenta manter 1 digito para mantissa (normalizar)

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