Aula de PGI 15.4.2014 Exercícios que envolvem ciclos e funções Resumo da matéria: - Sintaxe da definição duma função C: tipovalorretorno nomedafuncao( tipo nomevar, tipo nomevar1 ){ int v; // Aqui consta -> sequência de instruções que a função realiza return v;//terá return sse a função retornar um valor v - Diagramas sintácticos do if e dos mecanismos de ciclos em C: Nota: Esta figura foi criada pelo prof. Pedro Pereira cc-isel Tabela esquemática do uso dos 3 mecanismos de repetição de controlo de fluxo: while, for(;;) e o do while Ei inicio de controle while while( Ea ) { Ei de controle while Ei expressão de controlo do Ea for( Ei; Ea; Ep ) { Ei inicio controle do while do{ Ei de controle do while while( Ea ); Ea expressão de avaliação que se relaciona com Ei Ep expressão do passo de incremento/decremento que controla Ea
1º Exercício - Analise o seguinte programa e reescreva o usando a definição de funções caso seja adequado e as suas chamadas. / nome : calcsqrt.c data : Mar 11, 2014 autor : mfc@isel.pt descricão: calcula a raiz quadrada de um numero real positivo maior ou igual a 1.0 com PRECISAO (0.00001). / #include <stdio.h> #include <stdlib.h> #include <math.h> //definir duas constantes modo anterior do C99 (ainda são validas) //#define MAX_REPETICOES 100 //definição de constante //#define PRECISAO 0.000001 //definição de constante //definição de duas constantes em C99 (definição a ser usada) const int MAX_REPETICOES=100; //MAX_REPETICOES de iteracoes const double PRECISAO=0.000001;//PRECISAO a 6 casas decimais int main(){ double num ; //numero a saber a raiz quadrada int raiz; //calcular a rais do nº num int res; do{ printf("\ndigite um numero real positivo: "); res=scanf("%lf",&num); if( res!=1 ) { printf("erro de leitura de valor real\n"); exit(0);//termina o programa se for executada while( num<1.0 );//aceita somente num >=1.0 double inf = 0.0; //inicia intervalo inicial de busca double sup = num; int i; //define e inicia o contador de controlo do for(;;;) for( i=0; (sup-inf)>precisao && i<max_repeticoes; ++i ) { raiz = 0.5 (inf + sup);//faz estimativa de raiz if( (raizraiz)>num ){ sup = raiz; //baixa limite superior else{ inf = raiz; //sobe limite inferior raiz = 0.5 (inf + sup); // estima a raiz printf("raiz: %lf +/- %lf",raiz,precisao); //Diga qual o significado do código da linha seguinte em comentário? //Faça a função com este código, e o 2 de pow(10,2) passe a ser um parâmetro //bem como o valor raiz. // raiz = (long)(raizpow(10,2))/pow(10,2); // printf("raiz: %.2lf +/- %lf",raiz,precisao); printf("\n"); return 0;
2º Exercício Ler do teclado um número inteiro positivo maior que 0 e menor que 4000 e apresentar no terminal a notação romana desse número. Use a decomposição do problema em problemas mais pequenos para construir um programa em C onde defina as funções e as chame. Exemplo ilustrativo 2014 => MMXIV A figura seguinte ilustra uma tabela resumo dos nº romanos. 3º Exercício Pretende-se desenhar para o terminal letras maiúsculas gigantes que sejam lineares (formato rectangular), O programa aceita as seguintes letras: A,C,E,F,H,I,L,O,P,T,U e, para tal, deve ler do teclado qual a letra que pretende desenhar e dois número inteiros positivos maiores que 4 e múltiplos de 5 em que o primeiro significa a altura da letra e o segundo significa a largura. O valor máximo do primeiro é 25 e o valor máximo do segundo é 60. As medidas internas de cada letra devem ser proporcionais às medidas lidas altura e comprimento. Elabore em C o programa, usando a definição de funções e a sua chamada para implementar este exercício. Vejamos os exemplos de letra E de 25 por 40 e da letra T de 25 por 40 (as outras dimensões são factores de escalas de 25 e de 40):
4º Exercício - Analise o seguinte programa e reescreva o usando a definição de funções caso seja adequado e as suas chamadas. / Name: lista2exer05lerseqletras.c Created on: Abril 8, 2014 Author: mfc@isel.pt Description: Resolução do 5ºexercício da 2ª lista de exercícios do 2s13.14 / #include <stdio.h> const int FACTOR=3; int main( void ) { //a variavel char pode e deve ser int, porque o valor retornado //pelo leitura quando o ficheiro termina é -1. //as funções de leitura podem ser: //c=getchar(), c=getc(stdin), c=fgetc(stdin), scanf("%d",&c); int c;//quando se lê com: c=getchar(); c=getc(stdin); c=fgetc(stdin); usa a definição int c; //usar char c; //quando se lê caracter através do scanf em int r=scanf("%c",&c); //o EOF r=-1; //char c; printf("digite uma linha de texto (sequencia de caracteres) termina com mudanã a de linha\n"); unsigned char contachar, contaa, contae, contai, contao, contau; contachar=contaa=contae=contai=contao=contau=0; int r=0; // while( (r=scanf("%c",&c))!=-1 ){ //r=scanf("%c",&c);//pode ler mais do que um caracter =>r=scanf("%c%c.%c",&c1,&c2,... &ck); while( (c=getchar())!=-1 ){ //c=getchar(); //estas 3 funções lêem um só caracter, o ficheiro é o stdin (teclado) //c=getc(stdin); //temos que escrever em argumento o nome do ficheiros - stdin //c=fgetc(stdin);//o fim-ficheiro do teclado é simulado com o digitar de duas teclas: ctrl d contachar++; switch( c ) { case 'A': case 'a' : contaa++; break; case 'E': case 'e' : contae++; break; case 'I': case 'i' : contai++; break; case 'O': case 'o' : contao++; break; case 'U': case 'u' : contau++; break; //encontrar qual o contador que tem maior valor int m=contaa; if( contae> m ) m=contae; if( contai> m ) m=contai; if( contao> m ) m=contao; if( contau> m ) m=contau; m = m + FACTOR; int i=0; for( ;i<contaa; ++i ) { if( i==0 ) printf("a, a "); if( contaa ) { for( i=0; i<(m-contaa); ++i ) { printf(" "); printf("(%d)\n",contaa); for( i=0; i<contae; ++i ) { if( i==0 ) printf("e, e "); if( contae ) { for( i=0; i<(m-contae); ++i ) { printf(" "); printf("(%d)\n",contae); for( i=0; i<contai; ++i ) { if( i==0 ) printf("i, i ");
if( contai ) { for( i=0; i<(m-contai); ++i ) { printf(" "); printf("(%d)\n",contai); for( i=0; i<contao; ++i ) { if( i==0 ) printf("o, o "); if( contao ) { for( i=0; i<(m-contao); ++i ) { printf(" "); printf("(%d)\n",contao); for( i=0; i<contau; ++i ) { if( i==0 ) printf("u, u "); if( contau ) { for( i=0; i<(m-contau); ++i ) { printf(" "); printf("(%d)\n",contau); printf("total de caractres lidos %d",contachar); printf("\n"); return 0;