Instituto Tecnológico de Aeronáutica CES-10 - INTRODUÇÃO À COMPUTAÇÃO ROTEIRO PARA AULAS PRÁTICAS Professor Fábio Carneiro Mokarzel Departamento de Engenharia de Software Divisão de Ciência da Computação Capítulo 1: Comandos Simples e Repetições Programa 1.1: Comando de saída de resultados #include void main ( ) { printf ("Ola pessoal"); } Programa 1.2: Dois resultados na mesma linha #include void main ( ) { printf ("Ola pessoal"); printf ("Ola pessoal"); } Programa 1.3: Dois resultados em linhas distintas #include void main ( ) { printf ("Ola pessoal\n"); printf ("Ola pessoal"); } Programa 1.4: Repetições de um comando: falta declarar variável #include void main ( ) { i = 1; while (i <= 5) { printf ("Ola pessoal"); i = i + 1; } } Programa 1.5: Declaração de variável #include void main ( ) { int i; i = 1; while (i <= 5) { printf ("Ola pessoal"); i = i + 1; } } Ficou tudo emendado Programa 1.6: Escrita dos resultado em linhas distintas #include void main ( ) { int i; i = 1; while (i <= 5) { printf ("Ola pessoal\n"); i = i + 1; } } Só serve para escrever 5 vezes. Programa 1.7: Alteração do número de repetições #include void main ( ) { int i, n; n = 10; i = 1; while (i <= n) { printf ("Ola pessoal\n"); i = i + 1; } } Só vale para n = 10; se o operador puder entrar com o número... Programa 1.8: Leitura do número de repetições #include void main ( ) { int i, n; scanf ("%d", &n); i = 1; while (i <= n) { printf ("Ola pessoal\n"); i = i + 1; } } O operador não sabe o porque o computador está esperando. Programa 1.9: Programa amigável #include void main ( ) { int i, n; printf ("Entre com o numero de repeticoes: "); scanf ("%d", &n); i = 1; while (i <= n) { printf ("Ola pessoal\n"); i = i + 1; } } No comando printf, tudo o que está entre “aspas” é impresso. Às vezes, é desejável variar o conteúdo das mensagens de um mesmo comando. Programa 1.10: Escrita do valor de variáveis #include void main ( ) { int n; float preco; printf ("Numero de cadernos: "); scanf ("%d", &n); printf ("Preco do caderno: "); scanf ("%f", &preco); printf ("O preco de %d cadernos eh %g", n, n*preco); } Programa 1.11: Programa anterior com repetições #include void main ( ) { int aluno, n_alunos, n_cadernos; float preco; printf ("Digite o numero de alunos: "); scanf ("%d", &n_alunos); printf ("\n"); aluno = 1; while (aluno <= n_alunos) { printf ("Aluno %d: \n\n\tPreco do caderno: ", aluno); scanf ("%f", &preco); printf ("\tNumero de cadernos: "); scanf ("%d", &n_cadernos); printf ("\tAluno %d: %d cadernos a R$%g cada; gasto total: R$%g\n\n", aluno, n_cadernos, preco, n_cadernos*preco); aluno = aluno + 1; } } Programa 1.12: Numeração de linhas #include void main ( ) { int i, n; printf ("Entre com o numero de repeticoes: "); scanf ("%d", &n); i = 1; while (i <= n) { printf ("%d Ola pessoal\n", i); i = i + 1; } } Quando n ³ 10, há um desalinhamento Programa 1.13: Ajuste do alinhamento #include void main ( ) { int i, n; printf ("Entre com o numero de repeticoes: "); scanf ("%d", &n); i = 1; while (i <= n) { printf ("%4d Ola pessoal\n", i); i = i + 1; } } Programa 1.14: Formato de tabela #include void main ( ) { int i, n; printf ("Entre com o numero de repeticoes: "); scanf ("%d", &n); printf ("\n i mensagem\n"); printf ("---------------------\n"); i = 1; while (i <= n) { printf ("%4d Ola pessoal\n", i); i = i + 1; } } Programa 1.15: Tabelas numéricas inteiras #include void main ( ) { int x, n; printf ("Entre com o limite superior da tabela: "); scanf ("%d", &n); printf ("\n x x ** 2\n"); printf ("---------------------\n"); x = 1; while (x <= n) { printf ("%4d%10d\n", x, x*x); x = x + 1; } } Programa 1.16: Tabelas numéricas reais #include #include void main ( ) { int x, n; printf ("Entre com o limite superior da tabela: "); scanf ("%d", &n); printf ("\n x log10(x)\n"); printf ("---------------------\n"); x = 1; while (x <= n) { printf ("%4d%15.6f\n", x, log10(x)); x = x + 1; } } · Colocar também um limite inferior. · Fazer tabela para o seno (sin (argumento): o argumento deve estar em radianos, mas x, no programa deve estar em graus). · Fazer tabela para seno, cosseno, tangente e log10. Programa 1.16: Variáveis do tipo caractere #include #include void main () { char c; printf ("Aperte uma tecla: "); c = getche(); printf ("\ndecimal = %d, caractere = %c", c, c); printf ("\nFim"); } Capítulo 2: Comandos Condicionais e de Seleção Programa 2.1: Comandos condicionais #include #include void main ( ) { char chovera; printf ("Choverah amanha? (s/n): "); chovera = getche ( ); if (chovera == 's' || chovera == 'S') printf ("\n\nRetire seu guarda-chuva do descanso!!"); else printf ("\n\nDeixe seu guarda-chuva descansar!!"); } Programa 2.2: Comandos condicionais dentro de repetições #include #include void main ( ) { char testar; int n; printf ("Testar se um numero eh divisivel por 7? (s/n): "); testar = getche ( ); while (testar == 's' || testar == 'S') { printf ("\n\n\tDigite o numero: "); scanf ("%d", &n); if (n % 7 == 0) printf ("\t%d eh divisivel por 7", n); else printf ("\t%d nao eh divisivel por 7", n); printf ("\n\nTestar se um numero eh divisivel por 7? (s/n): "); testar = getche ( ); } } O único divisor é 7; que tal estender isso para qualquer inteiro? Programa 2.3: Programa anterior para vários dividendos e divisores #include #include void main ( ) { char testar; int dvdo, dsor; printf ("Testar divisibilidade? (s/n): "); testar = getche ( ); while (testar == 's' || testar == 'S') { printf ("\n\n\tDigite dividendo e o divisor: "); scanf ("%d%d", &dvdo, &dsor); if (dvdo % dsor == 0) printf ("\t%d eh divisivel por %d", dvdo, dsor); else printf ("\t%d nao eh divisivel por %d", dvdo, dsor); printf ("\n\nTestar divisibilidade? (s/n): "); testar = getche ( ); } } Programa 2.4: Somatórias diversas Versão 1: · Escrever um programa amigável em C para inicialmente ler um número inteiro e positivo digitado e guardá-lo na variável n. · Em seguida, o programa deve ler n números inteiros positivos; caso algum desses números lidos não seja positivo, o programa deve emitir uma mensagem de erro e solicitar nova digitação desse numero. · Exemplo: para pedir dados e emitir mensagens, o programa poderá apresentar a seguinte tela: Digite a quantidade de numeros inteiros positivos: 4 Digite o 1.o numero (positivo): 23 Digite o 2.o numero (positivo): -12 Foi digitado um numero não positivo Digite o 2.o numero (positivo): -34 Foi digitado um numero nao positivo Digite o 2.o numero (positivo): 39 Digite o 3.o numero (positivo): 82 Digite o 4.o numero (positivo): -5 Foi digitado um numero não positivo Digite o 4.o numero (positivo): 5 · Contabilizar e imprimir a soma total dos números positivos lidos. · Para cada número positivo lido, notificar o caso dele ser múltiplo de 7. · Para cada número positivo lido, notificar o caso dele ser quadrado perfeito. · Contabilizar e imprimir a soma dos múltiplos de 7 e a soma dos quadrados perfeitos dentre os números positivos lidos. · Encontrar e imprimir o maior dentre os quadrados perfeitos considerados. · Encontrar e imprimir o menor dentre os múltiplos de 7 considerados. Versão 2: · Escrever um programa amigável em C para inicialmente ler um número inteiro e positivo digitado e guardá-lo na variável n. · Em seguida, o programa deve ler n números inteiros quaisquer e realizar com eles as seguintes tarefas - Contabilizar e imprimir a soma total dos números lidos; - Contabilizar e imprimir a soma dos números lidos que são múltiplos de 3; - Contabilizar e imprimir a média aritmética dos números positivos lidos; - Para cada número positivo lido, notificar o caso dele ser quadrado perfeito; - Encontrar e imprimir o maior e o menor em valores relativos dentre todos os números lidos; - Para cada número positivo lido, notificar o caso dele ser potência de 2. Programa 2.5: Raizes reais de equação do 2o grau #include #include void main() { float a, b, c, delta, x, x1, x2; printf ("SOLUCAO DE EQUACAO DO 2.o GRAU"); printf ("\n\n\tEntre com os coeficientes da equacao: "); scanf("%f%f%f", &a, &b, &c); delta = pow(b,2) - 4*a*c; if (delta >= 0) { x1 = (-b + sqrt(delta)) / (2*a); x2 = (-b - sqrt(delta)) / (2*a); printf("\n\tx1 = %f e x2 = %f", x1, x2); } else printf("\n\tnao ha raizes reais"); } Mudemos o formato de impressao para “%g” Vamos exibir a equação antes dos resultados: Programa 2.6: Melhoramentos na saída do programa anterior #include #include void main() { float a, b, c, delta, x, x1, x2; printf ("SOLUCAO DE EQUACAO DO 2.o GRAU"); printf ("\n\n\tEntre com os coeficientes da equacao: "); scanf("%f%f%f", &a, &b, &c); printf ("\n\tRaizes da equacao (%g)x**2+(%g)x+(%g)=0:", a, b, c); delta = pow(b,2) - 4*a*c; if (delta >= 0) { x1 = (-b + sqrt(delta)) / (2*a); x2 = (-b - sqrt(delta)) / (2*a); printf("\n\n\t\tx1 = %g e x2 = %g", x1, x2); } else printf("\n\n\t\tnao ha raizes reais"); } Vamos calcular as raízes complexas: Programa 2.7: Raizes complexas de equação do 2o grau #include #include void main() { float a, b, c, delta, x, x1, x2, real, imag; printf ("SOLUCAO DE EQUACAO DO 2.o GRAU"); printf ("\n\n\tEntre com os coeficientes da equacao: "); scanf("%f%f%f", &a, &b, &c); printf ("\n\tRaizes da equacao (%g)x**2+(%g)x+(%g)=0:", a, b, c); delta = pow(b,2) - 4*a*c; if (delta >= 0) { x1 = (-b + sqrt(delta)) / (2*a); x2 = (-b - sqrt(delta)) / (2*a); printf("\n\n\t\tx1 = %g e x2 = %g", x1, x2); } else { real = -b / (2*a); imag = sqrt(-delta) / (2*a); printf ("\n\n\t\tx1 = (%g)+i(%g) e x2 = (%g)-i(%g)", real, imag, real, imag); } } Agora vamos resolver várias equações: Programa 2.8: Solução de várias equações do 2o grau #include #include #include void main() { float a, b, c, delta, x, x1, x2, real, imag; char resolver; printf ("SOLUCAO DE EQUACOES DO 2.o GRAU"); printf ("\n\nDeseja resolver uma equacao? (s/n): "); resolver = getche ( ); while (resolver == 's' || resolver == 'S') { printf ("\n\n\tEntre com os coeficientes da equacao: "); scanf("%f%f%f", &a, &b, &c); printf("\n\tRaizes da equacao (%g)x**2+ (%g)x + (%g ) = 0:", a, b, c); delta = pow(b,2) - 4*a*c; if (delta >= 0) { x1 = (-b + sqrt(delta)) / (2*a); x2 = (-b - sqrt(delta)) / (2*a); printf("\n\n\t\tx1 = %g e x2 = %g", x1, x2); } else { real = -b / (2*a); imag = sqrt(-delta) / (2*a); printf ("\n\n\t\tx1 = (%g)+i(%g) e x2 = (%g)-i(%g)", real, imag, real, imag); } printf ("\n\nDeseja resolver uma equacao? (s/n): "); resolver = getche ( ); } · Programa 2.9: programa em C para o cálculo da soma da PA #include void main () { int r, n, i; long a1, aq, soma; printf ("Progressao aritmetica\n\n"); printf (" Primeiro termo: "); scanf ("%ld", &a1); printf (" Razao: "); scanf ("%d", &r); printf (" Numero de termos: "); scanf ("%d", &n); soma = 0; aq = a1; i = 1; while (i<=n) { soma = soma + aq; aq = aq + r; i = i + 1; } printf ("\nSOMA DOS TERMOS: %ld", soma); } · Usar comando for no lugar do while · Colocar mais comandos nas inicializações e nas atualizações. · Programa 2.10: Cálculo do MDC de vários pares de números #include #include #include void main ( ) { int a, b, aux; char c; do { printf ("Calculo de MDC ? (s/n) "); do c = getche ( ); while (c != 's' && c != 'n'); if (c == 's') { printf ("Par de numeros:"); scanf("%d%d",&a,&b); a = abs(a); b = abs(b); while (b>0) { aux = a; a = b; b = aux % b; } printf ("MDC: %d\n\n", a); } } while (c == 's'); } · Obs: O trecho marcado poderia ser substituído por: printf ("Par de numeros:"); scanf ("%d%d",&a,&b); for (a = abs(a), b = abs(b); b>0; b = aux % b) { aux = a; a = b; } ou simplesmente por: for (printf ("Par de numeros:"), scanf ("%d%d",&a,&b), a = abs(a), b = abs(b); b>0; aux = a, a = b, b = aux % b); · Programa 2.11: Comando de seleção “Switch-Case” #include #include void main ( ) { char c; int n; do { printf ("Vamos levantar o astral? (s/n): "); do c = getche ( ); while (c != 's' && c != 'n'); if (c == 's') { printf ("\n\nDigite um numero de 1 a 7: "); scanf ("%d", &n); printf ("\n\t"); switch (n) { case 1: printf ("Voce eh inteligente"); break; case 2: printf ("Voce eh campeao"); break; case 3: printf ("Voce estah com tudo"); break; case 4: printf ("Seu destino eh vencer"); break; case 5: printf ("Tudo coopera para seu sucesso"); break; case 6: printf ("A vida sorri para voce"); break; case 7: printf ("Nada pode impedir sua vitoria"); break; default: printf ("O numero deve ser de 1 a 7"); } printf ("\n\n"); } } while (c == 's'); } · Programa 2.12: Mudança da base 2 para a base 10 Escrever na Linguagem C um programa amigável para: · Ler várias seqüências de caracteres imprimíveis não brancos encerradas por enter; · Para cada seqüência: a) Encará-la como sendo um número inteiro escrito na base 2; b) Verificar se a seqüência está correta; c) se estiver correta, encontrar e escrever um inteiro cujo valor seja aquele correspondente ao referido número, só que na base 10. · Programa 2.13: Mudança de uma base em [2 .. 9] para a base 10 Escrever na Linguagem C um programa amigável para: · Ler várias duplas, cada uma composta de um inteiro pertencente ao intervalo [2, 9] e de uma seqüência de caracteres imprimíveis não brancos encerrada por enter; · Para cada dupla: a) encarar a seqüência de caracteres como sendo um número inteiro escrito na base dada pelo referido inteiro; b) verificar se a seqüência de caracteres está correta; c) se estiver correta, encontrar e escrever um inteiro cujo valor seja aquele correspondente ao referido número, só que na base 10. Exercício: Análise das palavras de várias frases · Programa 2.14: Digitação e leitura de várias frases #include #include void main ( ) { char c, c1; do { printf ("Analisar frase? (s/n): "); do c = getche ( ); while (c != 's' && c != 'n'); if (c == 's') { printf ("\n\n\tDigite a frase:\n\n"); /* Analise da frase */ do { scanf ("%c", &c1); printf("%c", c1); } while (c1 != '\n'); printf ("\n\tFrase analisada\n\n"); } } while (c == 's'); } Definições: · Frase: cadeia de caracteres imprimíveis contendo um enter no final e só no final. · Conjunto: seqüência de caracteres não brancos, dentro de uma frase. · Subconjunto de um dado conjunto: conjunto contido nesse dado conjunto. · Subconjunto próprio de um dado conjunto: subconjunto desse dado conjunto diferente do mesmo. · Conjunto máximo: conjunto que não é subconjunto próprio de nenhum outro conjunto · Exemplo: Seja a frase: 17439&() abcd 1234 HJK757 enter - 1234, bcd, abc, abcd, &, 39&(, ... são conjuntos; - JK75 e HJK757 são subconjuntos do conjunto HJK757; - HJK757 não é subconjunto próprio dele mesmo, portanto é um conjunto máximo; - A referida frase apresenta 4 conjuntos máximos. · Programa 2.15: Escrever cada conjunto máximo numa linha distinta /* Analise da frase */ do { /* Pular brancos */ if (c1 != '\n') { /* Ler e escrever o conjunto maximo */ /* Pular para o inicio da proxima linha */ } } while (c1 != '\n'); · Programa 2.16: Escrever os conjuntos máximos, contando e escrevendo sua quantidade c_conjmax = 0; printf ("\n\n\tDigite a frase:\n\n"); /* Analise da frase */ do { /* Pular brancos */ do scanf ("%c", &c1); while (c1 == ' '); if (c_conjmax == 0) printf ("\n"); if (c1 != '\n') { /* Ler e escrever o conjunto maximo */ c_conjmax ++; do {printf("%c", c1); scanf ("%c", &c1);} while (c1 != ' ' && c1 != '\n'); /* Pular para o inicio da proxima linha */ printf ("\n"); } } while (c1 != '\n'); /* Escrever a quantidade de conjuntos maximos */ printf ("\n\t%d Conjuntos maximos\n\n", c_conjmax); Definição: · Palavra: conjunto máximo contendo só letras. · Programa 2.17: Verificar se cada conjunto máximo é uma palavra, escrevendo ao seu lado em caso positivo e contando o número de palavras · Exemplo: O programa poderá apresentar a seguinte tela: Analisar frase? (s/n): s Digite a frase: wretCFG 12345 HUYTTVcc 4563()$ asde2hhhh 1111xxxx wretCFG: eh palavra | 12345: HUYTTVcc: eh palavra | 4563()$: asde2hhhh: 1111xxxx: 6 Conjuntos Maximos e 2 Palavras Analisar frase? (s/n): n Orientação: · Usar um contador de palavras e uma variável lógica que diga se é ou não palavra; · No início da leitura do conjunto máximo, tornar essa variável igual a TRUE. · Ao encontrar no conjunto máximo um caractere que não seja letra, tornar essa variável igual a FALSE.