Faz um programa que escreve no ecrã uma tabela de conversão de graus Celcius para Fahrenheit. A tabela deve apresentar os graus Celcius de 0 a 40 com intervalos de 2 em 2.
#include <stdio.h> main() { double c, f; printf("Celcius Fahrenheit\n"); c = 0; while( c <= 40 ) { f = 9.0/5.0 * c + 32; printf(" %5.1lf %5.1lf\n", c, f ); c = c + 2; } }
Modifica o programa que calcula a área do círculo de modo a que o programa funcione ininterruptamente até o utilizador introduzir o valor zero para o raio. Nessa altura, o programa deve dizer que a área é zero, e terminar com um "Até logo".
#include <stdio.h> #define PI 3.14159 main() { double area, raio; do { printf("Introduz o raio: "); scanf("%lf", &raio); if( raio < 0 ) printf("Esse raio é inválido\n"); else { area = PI * raio * raio; printf("A área é %lf\n", area ); } } while( raio != 0 ); printf("Até logo.\n"); }
Faz um programa que vai pedindo números ao utilizador até que este introduza o número -1. O computador deve dizer a média dos números introduzidos (excluindo o -1).
#include <stdio.h> main() { double x, soma; int n; n = 0; soma = 0; printf("Introduz uma série de números e termina com -1\n"); scanf("%lf", &x ); if( x == -1 ) printf("Média indefinida\n"); else { do { soma = soma + x; n++; scanf("%lf", &x ); } while ( x != -1 ); printf("A média é %lf\n", soma/n); } }
Modifica o programa anterior, de modo a dar o mínimo, máximo e média.
#include <stdio.h> main() { double x, soma, min, max; int n; n = 0; soma = 0; printf("Introduz uma série de números e termina com -1\n"); scanf("%lf", &x ); if( x == -1 ) printf("Média, máximo e mínimo indefinidos\n"); else { max = x; min = x; do { soma = soma + x; if( x < min ) min = x; if( x > max ) max = x; n++; scanf("%lf", &x ); } while ( x != -1 ); printf("O mínimo é %lf\n", min ); printf("O máximo é %lf\n", max ); printf("A média é %lf\n", soma/n); } }
Faz um programa para ver se um número é primo ou não (um número só é primo se apenas for divisível por 1 e por si próprio).
Vamos resolver o programa de 4 maneiras diferentes (nota: a definição de número primo é aquela que foi dada no enunciado, mas só é válida para os números Naturais maiores ou iguais a 2. Por outras palavras, o número 1 não é primo. Peço desculpa por não ter referido isto no enunciado).
Solução 1:
#include <stdio.h> main() { int i, n; int primo; /* a variável primo só vai assumir os valores 0 e 1 */ /* 0 significa que n não é primo */ /* 1 significa que n é primo */ printf("Introduz um número: \n"); scanf("%d", &n ); if( n <= 1 ) printf("%d não é primo\n", n ); else { i = 2; primo = 1; /* vamos assumir que n é primo */ while( i < n ) { if( n % i == 0 ) /* afinal não é primo */ primo = 0; i++; } if( primo == 1 ) printf("%d é primo\n", n ); else printf("%d não é primo\n", n ); } }
Solução 2: tem a vantagem de abandonar o ciclo while assim que houver uma divisão que dê resto 0.
#include <stdio.h> main() { int i, n; int primo; /* a variável primo só vai assumir os valores 0 e 1 */ /* 0 significa que n não é primo */ /* 1 significa que n é primo */ printf("Introduz um número: \n"); scanf("%d", &n ); if( n <= 1 ) printf("%d não é primo\n", n ); else { i = 2; primo = 1; /* vamos assumir que n é primo */ while( (i < n) && (primo == 1) ) { if( n % i == 0 ) /* afinal não é primo */ primo = 0; i++; } if( primo == 1 ) printf("%d é primo\n", n ); else printf("%d não é primo\n", n ); } }
Solução 3: a mesma coisa que a solução anterior, mas utiliza um break para abandonar o ciclo.
#include <stdio.h> main() { int i, n; printf("Introduz um número: \n"); scanf("%d", &n ); if( n <= 1 ) printf("%d não é primo\n", n ); else { i = 2; while( i < n ) { if( n % i == 0 ) /* não é primo */ break; i++; } if( i == n ) printf("%d é primo\n", n ); else printf("%d não é primo\n", n ); } }
Solução 4: para ver se um número n é primo, não é necessário fazer as divisões todas desde 2 até n-1. Basta fazer as divisões desde 2 até sqrt(n). Porquê?
#include <stdio.h> #include <math.h> main() { int i, n, raiz; printf("Introduz um número: \n"); scanf("%d", &n ); if( n <= 1 ) printf("%d não é primo\n", n ); else { raiz = (int) sqrt(n); i = 2; while( i <= raiz ) { if( n % i == 0 ) /* não é primo */ break; i++; } if( i > raiz ) printf("%d é primo\n", n ); else printf("%d não é primo\n", n ); } }
Faz um programa para calcular o factorial de um número.
Tenta fazer três versões deste programa, uma usando a instrução FOR, outra utilizando a instrução WHILE e uma terceira com a instrução DO... WHILE.
Versão 1. Com a instrução for:
#include <stdio.h> main() { int factorial,n,i; printf("Diz um numero: "); scanf("%d",&n); factorial=1; for (i=n; i>1; i--) factorial=factorial*i; printf("O factorial de %d e %d",n,factorial); }
Versão 2. Com a instrução while:
#include <stdio.h> main() { int factorial,n,i; printf("Diz um numero: "); scanf("%d",&n); factorial=1; i=n; while (i>1) { factorial=factorial*i; i--; } printf("O factorial de %d e %d",n,factorial); }
Versão 3. Com a instrução do ... while:
#include <stdio.h> main() { int factorial,n,i; printf("Diz um numero: "); scanf("%d",&n); factorial=1; i=n; do { factorial=factorial*i; i--; } while (i>1); printf("O factorial de %d e %d",n,factorial); }
Faz um programa que calcula todos os divisores de um número.
Resolução
#include <stdio.h> main() { int n, i; printf("Introduz um número:\n"); scanf("%d", &n ); printf("Os divisores de %d são ", n ); i = 1; while( i <= n ) { if( n % i == 0 ) printf("%d ", i ); i++; } printf("\n"); }
Também podiam ter feito assim:
#include <stdio.h> main() { int n, i; printf("Introduz um número:\n"); scanf("%d", &n ); printf("Os divisores de %d são ", n ); for( i = 1; i <= n; i++ ) if( n % i == 0 ) printf("%d ", i ); printf("\n"); }
NOTA: Em ambos os casos, o ciclo pode ir só até n/2.
Faz um programa que escreve no ecrã os primeiros 20 números de Fibonacci.
Resolução
#include <stdio.h> #define N 20 main() { int i, fi, /* F(i) */ fi_1, /* F(i-1) */ fi_2; /* F(i-2) */ fi_1 = 1; fi_2 = 1; printf("1\n"); printf("1\n"); for( i = 3; i <= N; i++ ) { fi = fi_1 + fi_2; /* F(i) = F(i-1) + F(i-2) */ printf("%d\n", fi ); fi_2 = fi_1; fi_1 = fi; } }
Faz um programa que pede um valor decimal inteiro positivo e o converte para binário.
Resolução
#include <stdio.h> main() { int dec, pot10; unsigned long nbin; printf("Introduza um valor decimal: "); scanf("%d",&dec); pot10=1; nbin=0; while (dec > 0) { nbin = nbin + pot10 * (dec % 2); dec = dec / 2; pot10 = pot10 * 10; } printf("O valor em binario: %ld\n",nbin); }
Altera o programa do exercício 9 de forma a que converta o número de decimal para qualquer outra base.
Resolução
#include <stdio.h> main() { int dec, pot10, base; unsigned long nconv; printf("Introduza um valor decimal: "); scanf("%d",&dec); printf("Introduza a base de conversao: "); scanf("%d",&base); pot10=1; nconv=0; while (dec > 0) { nconv = nconv + pot10 * (dec % base); dec = dec / base; pot10 = pot10 * 10; } printf("O valor na base %d: %ld\n",base,nconv); }
A resolução apresentada funciona correctamente apenas para bases de conversão menores ou iguais a 10.
Porque não funciona correctamente para bases superiores? Pensa sobre o assunto.