Mudanças entre as edições de "PRG-2011"
(64 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 66: | Linha 66: | ||
|Ângelo|| || || || || || | |Ângelo|| || || || || || | ||
|- | |- | ||
− | |Beatriz || || || || || || | + | |Beatriz ||S || || || || || |
|- | |- | ||
− | |Bruno da Silva || || || || || || | + | |Bruno da Silva || S|| || || || || |
|- | |- | ||
− | |Bruno|| || || || || || | + | |Bruno|| S|| || || || || |
|- | |- | ||
− | |Caroline||S|| || || || || | + | |Caroline|| S || || || || || |
|- | |- | ||
|Danilo || || || || || || | |Danilo || || || || || || | ||
|- | |- | ||
− | |Dayze|| || || || || || | + | |Dayze|| S|| || || || || |
|- | |- | ||
− | |Fabiana || || || || || || | + | |Fabiana ||S || || || || || |
|- | |- | ||
|Felipe || || || || || || | |Felipe || || || || || || | ||
|- | |- | ||
− | |Gabriel|| || || || || || | + | |Gabriel||S || || || || || |
|- | |- | ||
|Grazielle|| || || || || || | |Grazielle|| || || || || || | ||
Linha 102: | Linha 102: | ||
== 23/06: Feriado == | == 23/06: Feriado == | ||
− | == 29/06: Aula | + | == 29/06: Aula 4 e 5 do Curso UFMG == |
− | + | -revisão comando for | |
− | == 6/07: | + | -comando while |
+ | |||
+ | -comando do | ||
+ | |||
+ | -comando switch | ||
+ | |||
+ | -revisão comandos break e continue; | ||
+ | |||
+ | EXERCÍCIOS | ||
+ | |||
+ | 1) Fazer um programa para computar o número de caracteres de uma cadeia (string) lida pelo teclado.Use o comando for; | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | |||
+ | #include <stdio.h> | ||
+ | |||
+ | void main () | ||
+ | |||
+ | { | ||
+ | |||
+ | char alfa[50]; | ||
+ | |||
+ | int i; | ||
+ | |||
+ | printf ("Entre com a cadeia: "); | ||
+ | |||
+ | scanf("%s",alfa); | ||
+ | |||
+ | for (i=0;alfa[i]!=0;i++) | ||
+ | |||
+ | ; | ||
+ | |||
+ | printf ("\nNumero de caracteres em %s = %d \n", alfa, i); | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 2) Repetir (1) com while; | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | void main () | ||
+ | { | ||
+ | char alfa[50]; | ||
+ | int i; | ||
+ | |||
+ | printf ("Entre com a cadeia: "); | ||
+ | scanf("%s",alfa); | ||
+ | i=0; | ||
+ | while (alfa[i]!=0) { | ||
+ | i++; | ||
+ | } | ||
+ | printf ("\nNumero de caracteres em %s = %d \n", alfa, i); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 3) Refazer o exercício 2 colocando a função que faz a computação do tamanho da cadeia em uma função; | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | int calc_tamanho(char cadeia[]) | ||
+ | { | ||
+ | int i=0; | ||
+ | while (cadeia[i]!=0) { | ||
+ | i++; | ||
+ | } | ||
+ | return i; | ||
+ | } | ||
+ | |||
+ | void main () | ||
+ | { | ||
+ | char alfa[50]; | ||
+ | int tamanho; | ||
+ | |||
+ | |||
+ | printf ("Entre com a cadeia: "); | ||
+ | scanf("%s",alfa); | ||
+ | tamanho = calc_tamanho(alfa); | ||
+ | printf ("\nNumero de caracteres em %s = %d \n", alfa, tamanho); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | 4) Fazer um programa para ler duas cadeias de caracteres (strings) e dizer qual delas possui mais caracter que a outra; | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | int calc_tamanho(char cadeia[]) | ||
+ | { | ||
+ | int i=0; | ||
+ | while (cadeia[i]!=0) { | ||
+ | i++; | ||
+ | } | ||
+ | return i; | ||
+ | } | ||
+ | |||
+ | void main () | ||
+ | { | ||
+ | char alfa[50],beta[50]; | ||
+ | int tam1,tam2; | ||
+ | |||
+ | /* Leitura dos dados */ | ||
+ | printf ("\nEntre com a cadeia alfa: "); | ||
+ | scanf("%s",alfa); | ||
+ | printf ("Entre com a cadeia beta: "); | ||
+ | scanf("%s",beta); | ||
+ | |||
+ | /* Computação dos tamanhos das cadeias */ | ||
+ | tam1=calc_tamanho(alfa); | ||
+ | tam2=calc_tamanho(beta); | ||
+ | |||
+ | /* Verificacão da cadeia maior */ | ||
+ | if (tam1>tam2) | ||
+ | printf ("alfa maior que beta\n"); | ||
+ | else | ||
+ | printf("beta maior que alfa\n"); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | 5) Refazer (4) colocando a comparação em uma função. | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | |||
+ | int calc_tamanho(char cadeia[]) | ||
+ | { | ||
+ | int i=0; | ||
+ | while (cadeia[i]!=0) { | ||
+ | i++; | ||
+ | } | ||
+ | return i; | ||
+ | } | ||
+ | |||
+ | int comparar_cadeias(char cadeia1[], char cadeia2[]) | ||
+ | { | ||
+ | int tam1,tam2, condicao_retorno; | ||
+ | |||
+ | tam1 = calc_tamanho(cadeia1); | ||
+ | tam2 = calc_tamanho(cadeia2); | ||
+ | if (tam1 == tam2) | ||
+ | condicao_retorno = 0; | ||
+ | else if (tam1>tam2) | ||
+ | condicao_retorno = 1; | ||
+ | else | ||
+ | condicao_retorno = -1; | ||
+ | |||
+ | return condicao_retorno; | ||
+ | |||
+ | } | ||
+ | |||
+ | void main () | ||
+ | { | ||
+ | char alfa[50],beta[50]; | ||
+ | int condicao; | ||
+ | |||
+ | /* Leitura dos dados */ | ||
+ | printf ("\nEntre com a cadeia alfa: "); | ||
+ | scanf("%s",alfa); | ||
+ | printf ("Entre com a cadeia beta: "); | ||
+ | scanf("%s",beta); | ||
+ | |||
+ | /*Comparar cadeias */ | ||
+ | condicao = comparar_cadeias(alfa,beta); | ||
+ | |||
+ | /* Mostrar resultado da comparacao */ | ||
+ | if (condicao==1) | ||
+ | printf("\nalfa MAIOR que beta\n"); | ||
+ | else if (condicao==0) | ||
+ | printf("\nCadeias de igual tamanho\n"); | ||
+ | else | ||
+ | printf("\nalfa MENOR que beta\n"); | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | == 30/06: Finalizando conteúdo - EXERCÍCIOS == | ||
+ | |||
+ | -Uso de biblioteca por exemplo: manipulação de strings | ||
+ | |||
+ | -Tipos construídos pelo usuário: struct | ||
+ | |||
+ | -O operador de endereços & | ||
+ | |||
+ | EXERCÍCIOS: | ||
+ | |||
+ | 1) Construir uma função que recebe dois parâmetros: um vetor de floats e o tamanho do vetor. | ||
+ | A função deve retornar a média dos valores deste vetor. O programa principal deve ler os elementos | ||
+ | do vetor até um número negativo apareça. Este é o final da entrada de dados. | ||
+ | A função deve ser chamada para | ||
+ | computar a média. | ||
+ | |||
+ | ESQUELETO DA SOLUÇÃO | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | float calcular_media_vetor(float vetor[], int tamanho) | ||
+ | { | ||
+ | float SomaAcumulada=0; | ||
+ | int i; | ||
+ | |||
+ | for(i=0;i<tamanho;i++) { | ||
+ | SomaAcumulada = SomaAcumulada + vetor[i]; | ||
+ | } | ||
+ | |||
+ | return (SomaAcumulada/tamanho); | ||
+ | } | ||
+ | |||
+ | void main() | ||
+ | { | ||
+ | float vetor_lido[50]; | ||
+ | float auxiliar; | ||
+ | float media; | ||
+ | int i,tamanho_vetor_lido; | ||
+ | |||
+ | |||
+ | /* Ler vetor */ | ||
+ | |||
+ | i = 0; | ||
+ | auxiliar = 0; | ||
+ | do { | ||
+ | printf("\nElemento[%d] = ",i); | ||
+ | scanf("%f",&auxiliar); | ||
+ | if (auxiliar < 0) | ||
+ | break; | ||
+ | else | ||
+ | vetor_lido[i++] = auxiliar; | ||
+ | } while(1); | ||
+ | |||
+ | tamanho_vetor_lido = i; | ||
+ | printf("\nFim da entrada de dados\n"); | ||
+ | |||
+ | /* Calcular media */ | ||
+ | |||
+ | media = calcular_media_vetor(vetor_lido,i); | ||
+ | |||
+ | /* Imprimir media */ | ||
+ | printf ("Media = %f\n",media); | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | 2) Repetir o exercício 1 descartando o menor e o maior número do vetor, para fins da computação da média. | ||
+ | |||
+ | 3) Traduzir o programa contador de moedas da wiki do Prof.Marcelo Sobral para o C: | ||
+ | |||
+ | '''Contador de moedas:''' faça um programa que leia valores de moedas e some as quantidades de tipos de moedas informadas. Por exemplo, se o usuário digitar 25, 50, 25, 5, 10, 5, o programa deve informar: 2 moedas de 5 centavos, 1 moeda de 10 centavos, 2 moedas de 25 centavos, 1 moeda de 50 centavos. São aceitos apenas valores de moedas de 1, 5, 10, 25 e 50 centavos. Seu programa deve ler 10 valores de moedas, e então apresentar o resultado. | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | inicio | ||
+ | inteiro m1, m5, m10, m25, m50 | ||
+ | inteiro moeda | ||
+ | inteiro n | ||
+ | |||
+ | enquanto n < 10 faz | ||
+ | escrever "Moeda: " | ||
+ | ler moeda | ||
+ | |||
+ | escolhe moeda | ||
+ | caso 1: | ||
+ | m1 <- m1 + 1 | ||
+ | caso 5: | ||
+ | m5 <- m5 + 1 | ||
+ | caso 10: | ||
+ | m10 <- m10 + 1 | ||
+ | caso 25: | ||
+ | m25 <- m25 + 1 | ||
+ | caso 50: | ||
+ | m50 <- m50 + 1 | ||
+ | defeito: | ||
+ | escrever "Valor invalido ...\n" | ||
+ | n <- n - 1 | ||
+ | fimescolhe | ||
+ | n <- n + 1 | ||
+ | fimenquanto | ||
+ | |||
+ | escrever "Moedas de 1 centavo: ", m1 | ||
+ | escrever "\nMoedas de 5 centavos: ", m5 | ||
+ | escrever "\nMoedas de 10 centavos: ", m10 | ||
+ | escrever "\nMoedas de 25 centavos: ", m25 | ||
+ | escrever "\nMoedas de 50 centavos: ", m50 | ||
+ | fim | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | SOLUÇÂO PROPOSTA: | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | int m1=0, | ||
+ | m5=0, | ||
+ | m10=0, | ||
+ | m25=0, | ||
+ | m50=0; | ||
+ | int moeda; | ||
+ | int n=0; | ||
+ | |||
+ | while (n++<10) { | ||
+ | printf("Moeda: "); | ||
+ | scanf("%d",&moeda); | ||
+ | switch (moeda){ | ||
+ | case 1: | ||
+ | m1 = m1++; | ||
+ | break; | ||
+ | case 5: | ||
+ | m5 = m5++; | ||
+ | break; | ||
+ | case 10: | ||
+ | m10 = m10++; | ||
+ | break; | ||
+ | case 25: | ||
+ | m25 = m25++; | ||
+ | break; | ||
+ | case 50: | ||
+ | m50 = m50++; | ||
+ | break; | ||
+ | default: | ||
+ | n--; | ||
+ | printf("Valor invalido...\n"); | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | printf("Moedas de 1 centavo:%d\n",m1); | ||
+ | printf("Moedas de 5 centavos:%d\n",m5); | ||
+ | printf("Moedas de 10 centavos:%d\n",m10); | ||
+ | printf("Moedas de 25 centavos:%d\n",m25); | ||
+ | printf("moedas de 50 centavos:%d\n",m50); | ||
+ | return(n++); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 4) Um número complexo possui uma parte imaginaria e uma parte real. Fazer um programa para ler dois números complexos e somá-los. | ||
+ | Defina o tipo complexo como uma struct da forma: | ||
+ | |||
+ | PROPOSTA 1 - SEM USAR FUNÇÔES ADICIONAIS | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | struct TComplexo { | ||
+ | float real; | ||
+ | float imaginario; | ||
+ | }; | ||
+ | |||
+ | main() | ||
+ | { | ||
+ | struct TComplexo Numero1,Numero2,Resultado; | ||
+ | |||
+ | /* Entrada de dados */ | ||
+ | |||
+ | printf("\nEntre com a parte real do primeiro numero => "); | ||
+ | scanf ("%f",&Numero1.real); | ||
+ | printf("\nEntre com a parte imaginaria do primeiro numero => "); | ||
+ | scanf ("%f",&Numero1.imaginario); | ||
+ | |||
+ | printf("\nEntre com a parte real do primeiro numero => "); | ||
+ | scanf ("%f",&Numero2.real); | ||
+ | printf("\nEntre com a parte imaginaria do primeiro numero => "); | ||
+ | scanf ("%f",&Numero2.imaginario); | ||
+ | |||
+ | /* Soma dos complexos */ | ||
+ | Resultado.real = Numero1.real + Numero2.real; | ||
+ | Resultado.imaginario = Numero1.imaginario + Numero2.imaginario; | ||
+ | |||
+ | /* imprimir resultado */ | ||
+ | |||
+ | printf("Resultado da soma - Parte real = %f\n",Resultado.real); | ||
+ | printf("Resultado da soma - Parte imaginaria = %f\n",Resultado.imaginario); | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | PROPOSTA 2 - COM FUNÇÔES ADICIONAIS - | ||
+ | |||
+ | NOTA1: As estruturas são passadas por valor (cópias). O mais eficiente seria passar por referência (endereços). | ||
+ | Infelizmente não tivemos tempo de ver. | ||
+ | |||
+ | NOTA2: Fazer a função de multiplicação indicada! | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | struct TComplexo { | ||
+ | float real; | ||
+ | float imaginario; | ||
+ | }; | ||
+ | |||
+ | struct TComplexo SomarComplexos(struct TComplexo a, struct TComplexo b) | ||
+ | { | ||
+ | struct TComplexo Resultado; | ||
+ | |||
+ | Resultado.real = a.real + b.real; | ||
+ | Resultado.imaginario = a.imaginario + b.imaginario; | ||
+ | return Resultado; | ||
+ | } | ||
+ | |||
+ | struct TComplexo MultiplicarComplexos(struct TComplexo a, struct TComplexo b) | ||
+ | { | ||
+ | } | ||
+ | |||
+ | main() | ||
+ | { | ||
+ | struct TComplexo Numero1,Numero2,Resultado; | ||
+ | |||
+ | /* Entrada de dados */ | ||
+ | |||
+ | printf("\nEntre com a parte real do primeiro numero => "); | ||
+ | scanf ("%f",&Numero1.real); | ||
+ | printf("\nEntre com a parte imaginaria do primeiro numero => "); | ||
+ | scanf ("%f",&Numero1.imaginario); | ||
+ | |||
+ | printf("\nEntre com a parte real do primeiro numero => "); | ||
+ | scanf ("%f",&Numero2.real); | ||
+ | printf("\nEntre com a parte imaginaria do primeiro numero => "); | ||
+ | scanf ("%f",&Numero2.imaginario); | ||
+ | |||
+ | /* Soma dos complexos */ | ||
+ | //Resultado.real = Numero1.real + Numero2.real; | ||
+ | //Resultado.imaginario = Numero1.imaginario + Numero2.imaginario; | ||
+ | |||
+ | /* imprimir resultado */ | ||
+ | |||
+ | Resultado = SomarComplexos(Numero1,Numero2); | ||
+ | printf("Resultado da soma - Parte real = %f\n",Resultado.real); | ||
+ | printf("Resultado da soma - Parte imaginaria = %f\n",Resultado.imaginario); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 5) Fazer um programa para ler um vetor de inteiros não negativos (um negativo é o final da leitura) e copiar o vetor para outro vetor chamador vetor_crescente. Colocar este | ||
+ | vetor_crescente na forma ordenada crescente. Imprimir os dois vetores. | ||
+ | |||
+ | PROPOSTA DE SOLUÇÂO | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | |||
+ | #include <stdio.h> | ||
+ | |||
+ | |||
+ | void imprimirVetor(int vetor[], int tamanho) | ||
+ | { | ||
+ | int i; | ||
+ | |||
+ | for (i=0;i<tamanho;i++) { | ||
+ | printf("\nElemento[%d] = %d",i,vetor[i]); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void ordenarMetodoInsertion(int vetor[], int tamanho) | ||
+ | { | ||
+ | int i,j,aux; | ||
+ | |||
+ | for (i=1;i< tamanho;i++) { | ||
+ | for (j=i;j>0 && vetor[j] < vetor[j-1];j--) { | ||
+ | aux=vetor[j-1]; | ||
+ | vetor[j-1]=vetor[j]; | ||
+ | vetor[j]=aux; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | void main() | ||
+ | { | ||
+ | int vetor_lido[50],vetor_ordenado[50]; | ||
+ | int i,auxiliar,tamanho_vetor; | ||
+ | |||
+ | /* Ler vetor */ | ||
+ | |||
+ | i = 0; | ||
+ | auxiliar = 0; | ||
+ | |||
+ | do { | ||
+ | printf("\nElemento[%d] = ",i); | ||
+ | scanf("%d",&auxiliar); | ||
+ | if (auxiliar < 0) | ||
+ | break; | ||
+ | else | ||
+ | vetor_lido[i++] = auxiliar; | ||
+ | } while(1); | ||
+ | tamanho_vetor = i; | ||
+ | |||
+ | /* copiar o vetor para vetor ordenado */ | ||
+ | for (i=0;i<tamanho_vetor;i++) { | ||
+ | vetor_ordenado[i]=vetor_lido[i]; | ||
+ | } | ||
+ | |||
+ | /* ordenar vetor */ | ||
+ | ordenarMetodoInsertion(vetor_ordenado,tamanho_vetor); | ||
+ | |||
+ | /* imprimir vetor nao ordenado */ | ||
+ | printf("\nVETOR NAO ORDENADO"); | ||
+ | imprimirVetor(vetor_lido,tamanho_vetor); | ||
+ | |||
+ | /* imprimir vetor ordenado */ | ||
+ | printf("\nVETOR ORDENADO"); | ||
+ | imprimirVetor(vetor_ordenado,tamanho_vetor); | ||
+ | |||
+ | printf("\nFinal do Programa\n"); | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | 6) Fazer um programa que define dois vetores de tamanho 50: um vetor de ''char'' e um vetor de ''inteiros''. Imprimir os endereços das posições 0,1 e 2 de cada vetor no formato hexadecimal. Olhando os resultados | ||
+ | é possível inferir o tamanho de um ''char'' e de um ''int''? | ||
+ | |||
+ | == 6/07: PROVA FINAL == | ||
+ | |||
+ | Considerações sobre as questões da prova: | ||
+ | |||
+ | 1) Será uma modificação do exercício 2 da prova do Tiago, envolvendo restrições no uso de caracteres (uso do switch) e de tamanho de senhas; | ||
+ | |||
+ | 2) Será parecida com o exercício de calcular a média dos elementos de vetores quando foi retirado o menor e o maior número (uma outra restrição também pode | ||
+ | ser considerada); | ||
+ | |||
+ | 3) Envolverá structs, números complexos e possivelmente alguma coisa envolvendo soma, multiplicação ou conversão para a forma polar; | ||
+ | |||
+ | 4) Questão "surpresa" onde será dado um programa e o aluno deverá escrever as saídas do programa. | ||
+ | |||
+ | |||
+ | * [http://tele.sj.ifsc.edu.br/~eraldo/prog/prova.pdf Prova] | ||
+ | |||
+ | Soluções: | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Questão 1 | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | |||
+ | #include <stdio.h> | ||
+ | #include <string.h> | ||
+ | |||
+ | char senha[50]="844136"; /* variavel global com senha atual */ | ||
+ | |||
+ | void verificar_senha_atual() | ||
+ | { | ||
+ | char cadeia[50]; | ||
+ | int retorno; | ||
+ | |||
+ | do { | ||
+ | printf("Entre com a senha atual\n"); | ||
+ | scanf("%s",cadeia); | ||
+ | retorno = strcmp(senha,cadeia); /* strcmp retorna 0 se cadeias iguais */ | ||
+ | if (retorno == 0) | ||
+ | break; | ||
+ | else | ||
+ | printf("Senha atual incorreta - tente novamente\n"); | ||
+ | } while(1); | ||
+ | } | ||
+ | |||
+ | int verificar_regras(char vetor[]) | ||
+ | { | ||
+ | int i; | ||
+ | int ret=1; /* variavel de apoio para retorno - se cadeia nao conforme ela vai a 0 */ | ||
+ | if (strlen(vetor)==6){ | ||
+ | for (i=0;i<6;i++) { | ||
+ | if (vetor[i]<'0' || vetor[i]>'9') { /* '0' equivale a 0x30 e '9' a 0x39 */ | ||
+ | ret=0; | ||
+ | printf("senha com caracter nao numerico\n"); | ||
+ | break; /* nao vale a pena continuar...*/ | ||
+ | } | ||
+ | } | ||
+ | }else { | ||
+ | printf("tamanho inválido\n"); | ||
+ | ret=0; | ||
+ | } | ||
+ | return ret; | ||
+ | } | ||
+ | |||
+ | void ler_nova_senha() | ||
+ | { | ||
+ | int retorno; | ||
+ | do { | ||
+ | printf("Entre com a nova senha\n"); | ||
+ | scanf("%s",senha); | ||
+ | retorno = verificar_regras(senha); /* verifica conformidade com regras */ | ||
+ | if (retorno == 1) | ||
+ | break; | ||
+ | else | ||
+ | printf("Senha nao conforme com as regras\n"); | ||
+ | } while(1); | ||
+ | } | ||
+ | void main() | ||
+ | { | ||
+ | verificar_senha_atual(); /*fica eternamente esperando pela senha atual*/ | ||
+ | ler_nova_senha(); /* fica eternamente esperando uma nova senha valida*/ | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | ---- | ||
+ | Questão 2 | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include "stdio.h" | ||
+ | |||
+ | float computar_media_maior_menor(float vetor[],int tamanho) | ||
+ | { | ||
+ | float media,maior,menor; | ||
+ | int i; | ||
+ | |||
+ | maior = vetor[0]; | ||
+ | menor = vetor[0]; | ||
+ | for (i=0;i<tamanho;i++) { /* i poderia começar em 1 se tamanho maior que 1 */ | ||
+ | if (maior<vetor[i]) | ||
+ | maior=vetor[i]; | ||
+ | if (menor>vetor[i]) | ||
+ | menor=vetor[i]; | ||
+ | } | ||
+ | media = (maior+menor)/2; | ||
+ | return media; | ||
+ | } | ||
+ | |||
+ | /* programa principal somente para fins de teste - nao faz parte da solucao */ | ||
+ | main() | ||
+ | { | ||
+ | float vetor_de_dados[50]={1.,4.,3.}; | ||
+ | |||
+ | printf ("media = %f\n", computar_media_maior_menor(vetor_de_dados, 3)); | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | ---- | ||
+ | Questão 3 | ||
+ | |||
+ | OBS 1: A entrada de ângulo é em radianos - como seria para entrar em graus??? | ||
+ | |||
+ | OBS 2: Para linkar com a biblioteca matematica fazer: gcc -lm prog.c -o prog | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | #include <math.h> | ||
+ | |||
+ | /* Estrutura representando numero complexo | ||
+ | em coordenada polar */ | ||
+ | struct TComplexoPolar{ | ||
+ | float r; /* raio */ | ||
+ | float theta; /* angulo */ | ||
+ | }; | ||
+ | |||
+ | /* Estrutura representando numero complexo | ||
+ | em coordenada retangular */ | ||
+ | |||
+ | struct TComplexoRetangular{ | ||
+ | float x; | ||
+ | float y; | ||
+ | }; | ||
+ | |||
+ | main () | ||
+ | { | ||
+ | struct TComplexoPolar numPolar; | ||
+ | struct TComplexoRetangular numRet; | ||
+ | |||
+ | /* entrada de dados */ | ||
+ | |||
+ | printf("Entre com o raio\n"); | ||
+ | scanf("%f",&numPolar.r); | ||
+ | printf("Entre com o angulo (em radianos)\n"); | ||
+ | scanf("%f",&numPolar.theta); | ||
+ | |||
+ | /* converter */ | ||
+ | |||
+ | numRet.x = numPolar.r * cos(numPolar.theta); | ||
+ | numRet.y = numPolar.r * sin(numPolar.theta); | ||
+ | |||
+ | /* imprimir */ | ||
+ | |||
+ | printf ("Complexo em Polar\n"); | ||
+ | printf("raio = %f\n", numPolar.r); | ||
+ | printf("angulo = %f\n", numPolar.theta); | ||
+ | |||
+ | printf ("Complexo em Retangular\n"); | ||
+ | printf("REAL = %f\n", numRet.x); | ||
+ | printf("IMAGINARIO = %f\n", numRet.y); | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Questão 4 | ||
+ | |||
+ | alfa = 1 | ||
+ | |||
+ | beta= 14 | ||
+ | |||
+ | gama= 2 | ||
+ | |||
+ | delta= 5 | ||
== 7/07: RECUPERAÇÃO == | == 7/07: RECUPERAÇÃO == |
Edição atual tal como às 20h45min de 6 de julho de 2011
Nome do Professor: Eraldo Silveira e Silva
email: eraldo@ifsc.edu.br
Material de Referência
- Apostila adotada: Curso de Linguagem C - Engenharia Elétrica - UFMG
Avaliação
Trabalhos: 30% Prova: 70%
Aulas
== 26/05:
01/06: Aula 1 e 2 do Curso UFMG
02/06: Cont.Aula 2 do Curso UFMG
08/06: Aula 2 do Curso UFMG
09/06: Aula 2 do Curso UFMG
15/06: Aula 3 do Curso UFMG
Propor resolver questão
Tarefa para casa:
1) Escrever um programa que leia como dados de entrada dois números inteiros positivos: "s" e "q". O programa deve computar os dez primeiros números da PG (progressão geométrica), onde "s" é o número inicial e "q" a razão da progressão.
Obs: Para PG tem-se:
- ou
2) Repetir para P.A (progressão aritmética). Obs:
3) Organizar (1) e (2) em um programa único, com uma função para PG e outra para PA. Enviar para o professor até 07/06 às 23:59!
Controle de Entrega de Trabalhos
Legenda:
- S: entregou
- N: não entregou
Aluno | Trabalho 1 | Trabalho 2 | Trabalho 3 | Trabalho 4 | Trabalho 5 | Trabalho 6 |
---|---|---|---|---|---|---|
Alfredo | ||||||
Ângelo | ||||||
Beatriz | S | |||||
Bruno da Silva | S | |||||
Bruno | S | |||||
Caroline | S | |||||
Danilo | ||||||
Dayze | S | |||||
Fabiana | S | |||||
Felipe | ||||||
Gabriel | S | |||||
Grazielle | ||||||
Jayson | ||||||
Juliano | ||||||
Leandro | ||||||
Leonardo |
16/06: Aula 7 do Curso UFMG
22/06: Semana de Telecomunicações
23/06: Feriado
29/06: Aula 4 e 5 do Curso UFMG
-revisão comando for
-comando while
-comando do
-comando switch
-revisão comandos break e continue;
EXERCÍCIOS
1) Fazer um programa para computar o número de caracteres de uma cadeia (string) lida pelo teclado.Use o comando for;
#include <stdio.h>
void main ()
{
char alfa[50];
int i;
printf ("Entre com a cadeia: ");
scanf("%s",alfa);
for (i=0;alfa[i]!=0;i++)
;
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);
}
2) Repetir (1) com while;
#include <stdio.h>
void main ()
{
char alfa[50];
int i;
printf ("Entre com a cadeia: ");
scanf("%s",alfa);
i=0;
while (alfa[i]!=0) {
i++;
}
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);
}
3) Refazer o exercício 2 colocando a função que faz a computação do tamanho da cadeia em uma função;
#include <stdio.h>
int calc_tamanho(char cadeia[])
{
int i=0;
while (cadeia[i]!=0) {
i++;
}
return i;
}
void main ()
{
char alfa[50];
int tamanho;
printf ("Entre com a cadeia: ");
scanf("%s",alfa);
tamanho = calc_tamanho(alfa);
printf ("\nNumero de caracteres em %s = %d \n", alfa, tamanho);
}
4) Fazer um programa para ler duas cadeias de caracteres (strings) e dizer qual delas possui mais caracter que a outra;
#include <stdio.h>
int calc_tamanho(char cadeia[])
{
int i=0;
while (cadeia[i]!=0) {
i++;
}
return i;
}
void main ()
{
char alfa[50],beta[50];
int tam1,tam2;
/* Leitura dos dados */
printf ("\nEntre com a cadeia alfa: ");
scanf("%s",alfa);
printf ("Entre com a cadeia beta: ");
scanf("%s",beta);
/* Computação dos tamanhos das cadeias */
tam1=calc_tamanho(alfa);
tam2=calc_tamanho(beta);
/* Verificacão da cadeia maior */
if (tam1>tam2)
printf ("alfa maior que beta\n");
else
printf("beta maior que alfa\n");
}
5) Refazer (4) colocando a comparação em uma função.
#include <stdio.h>
int calc_tamanho(char cadeia[])
{
int i=0;
while (cadeia[i]!=0) {
i++;
}
return i;
}
int comparar_cadeias(char cadeia1[], char cadeia2[])
{
int tam1,tam2, condicao_retorno;
tam1 = calc_tamanho(cadeia1);
tam2 = calc_tamanho(cadeia2);
if (tam1 == tam2)
condicao_retorno = 0;
else if (tam1>tam2)
condicao_retorno = 1;
else
condicao_retorno = -1;
return condicao_retorno;
}
void main ()
{
char alfa[50],beta[50];
int condicao;
/* Leitura dos dados */
printf ("\nEntre com a cadeia alfa: ");
scanf("%s",alfa);
printf ("Entre com a cadeia beta: ");
scanf("%s",beta);
/*Comparar cadeias */
condicao = comparar_cadeias(alfa,beta);
/* Mostrar resultado da comparacao */
if (condicao==1)
printf("\nalfa MAIOR que beta\n");
else if (condicao==0)
printf("\nCadeias de igual tamanho\n");
else
printf("\nalfa MENOR que beta\n");
}
30/06: Finalizando conteúdo - EXERCÍCIOS
-Uso de biblioteca por exemplo: manipulação de strings
-Tipos construídos pelo usuário: struct
-O operador de endereços &
EXERCÍCIOS:
1) Construir uma função que recebe dois parâmetros: um vetor de floats e o tamanho do vetor. A função deve retornar a média dos valores deste vetor. O programa principal deve ler os elementos do vetor até um número negativo apareça. Este é o final da entrada de dados. A função deve ser chamada para computar a média.
ESQUELETO DA SOLUÇÃO
#include <stdio.h>
float calcular_media_vetor(float vetor[], int tamanho)
{
float SomaAcumulada=0;
int i;
for(i=0;i<tamanho;i++) {
SomaAcumulada = SomaAcumulada + vetor[i];
}
return (SomaAcumulada/tamanho);
}
void main()
{
float vetor_lido[50];
float auxiliar;
float media;
int i,tamanho_vetor_lido;
/* Ler vetor */
i = 0;
auxiliar = 0;
do {
printf("\nElemento[%d] = ",i);
scanf("%f",&auxiliar);
if (auxiliar < 0)
break;
else
vetor_lido[i++] = auxiliar;
} while(1);
tamanho_vetor_lido = i;
printf("\nFim da entrada de dados\n");
/* Calcular media */
media = calcular_media_vetor(vetor_lido,i);
/* Imprimir media */
printf ("Media = %f\n",media);
}
2) Repetir o exercício 1 descartando o menor e o maior número do vetor, para fins da computação da média.
3) Traduzir o programa contador de moedas da wiki do Prof.Marcelo Sobral para o C:
Contador de moedas: faça um programa que leia valores de moedas e some as quantidades de tipos de moedas informadas. Por exemplo, se o usuário digitar 25, 50, 25, 5, 10, 5, o programa deve informar: 2 moedas de 5 centavos, 1 moeda de 10 centavos, 2 moedas de 25 centavos, 1 moeda de 50 centavos. São aceitos apenas valores de moedas de 1, 5, 10, 25 e 50 centavos. Seu programa deve ler 10 valores de moedas, e então apresentar o resultado.
inicio
inteiro m1, m5, m10, m25, m50
inteiro moeda
inteiro n
enquanto n < 10 faz
escrever "Moeda: "
ler moeda
escolhe moeda
caso 1:
m1 <- m1 + 1
caso 5:
m5 <- m5 + 1
caso 10:
m10 <- m10 + 1
caso 25:
m25 <- m25 + 1
caso 50:
m50 <- m50 + 1
defeito:
escrever "Valor invalido ...\n"
n <- n - 1
fimescolhe
n <- n + 1
fimenquanto
escrever "Moedas de 1 centavo: ", m1
escrever "\nMoedas de 5 centavos: ", m5
escrever "\nMoedas de 10 centavos: ", m10
escrever "\nMoedas de 25 centavos: ", m25
escrever "\nMoedas de 50 centavos: ", m50
fim
SOLUÇÂO PROPOSTA:
#include <stdio.h>
int main()
{
int m1=0,
m5=0,
m10=0,
m25=0,
m50=0;
int moeda;
int n=0;
while (n++<10) {
printf("Moeda: ");
scanf("%d",&moeda);
switch (moeda){
case 1:
m1 = m1++;
break;
case 5:
m5 = m5++;
break;
case 10:
m10 = m10++;
break;
case 25:
m25 = m25++;
break;
case 50:
m50 = m50++;
break;
default:
n--;
printf("Valor invalido...\n");
break;
}
}
printf("Moedas de 1 centavo:%d\n",m1);
printf("Moedas de 5 centavos:%d\n",m5);
printf("Moedas de 10 centavos:%d\n",m10);
printf("Moedas de 25 centavos:%d\n",m25);
printf("moedas de 50 centavos:%d\n",m50);
return(n++);
}
4) Um número complexo possui uma parte imaginaria e uma parte real. Fazer um programa para ler dois números complexos e somá-los. Defina o tipo complexo como uma struct da forma:
PROPOSTA 1 - SEM USAR FUNÇÔES ADICIONAIS
#include <stdio.h>
struct TComplexo {
float real;
float imaginario;
};
main()
{
struct TComplexo Numero1,Numero2,Resultado;
/* Entrada de dados */
printf("\nEntre com a parte real do primeiro numero => ");
scanf ("%f",&Numero1.real);
printf("\nEntre com a parte imaginaria do primeiro numero => ");
scanf ("%f",&Numero1.imaginario);
printf("\nEntre com a parte real do primeiro numero => ");
scanf ("%f",&Numero2.real);
printf("\nEntre com a parte imaginaria do primeiro numero => ");
scanf ("%f",&Numero2.imaginario);
/* Soma dos complexos */
Resultado.real = Numero1.real + Numero2.real;
Resultado.imaginario = Numero1.imaginario + Numero2.imaginario;
/* imprimir resultado */
printf("Resultado da soma - Parte real = %f\n",Resultado.real);
printf("Resultado da soma - Parte imaginaria = %f\n",Resultado.imaginario);
}
PROPOSTA 2 - COM FUNÇÔES ADICIONAIS -
NOTA1: As estruturas são passadas por valor (cópias). O mais eficiente seria passar por referência (endereços). Infelizmente não tivemos tempo de ver.
NOTA2: Fazer a função de multiplicação indicada!
#include <stdio.h>
struct TComplexo {
float real;
float imaginario;
};
struct TComplexo SomarComplexos(struct TComplexo a, struct TComplexo b)
{
struct TComplexo Resultado;
Resultado.real = a.real + b.real;
Resultado.imaginario = a.imaginario + b.imaginario;
return Resultado;
}
struct TComplexo MultiplicarComplexos(struct TComplexo a, struct TComplexo b)
{
}
main()
{
struct TComplexo Numero1,Numero2,Resultado;
/* Entrada de dados */
printf("\nEntre com a parte real do primeiro numero => ");
scanf ("%f",&Numero1.real);
printf("\nEntre com a parte imaginaria do primeiro numero => ");
scanf ("%f",&Numero1.imaginario);
printf("\nEntre com a parte real do primeiro numero => ");
scanf ("%f",&Numero2.real);
printf("\nEntre com a parte imaginaria do primeiro numero => ");
scanf ("%f",&Numero2.imaginario);
/* Soma dos complexos */
//Resultado.real = Numero1.real + Numero2.real;
//Resultado.imaginario = Numero1.imaginario + Numero2.imaginario;
/* imprimir resultado */
Resultado = SomarComplexos(Numero1,Numero2);
printf("Resultado da soma - Parte real = %f\n",Resultado.real);
printf("Resultado da soma - Parte imaginaria = %f\n",Resultado.imaginario);
}
5) Fazer um programa para ler um vetor de inteiros não negativos (um negativo é o final da leitura) e copiar o vetor para outro vetor chamador vetor_crescente. Colocar este vetor_crescente na forma ordenada crescente. Imprimir os dois vetores.
PROPOSTA DE SOLUÇÂO
#include <stdio.h>
void imprimirVetor(int vetor[], int tamanho)
{
int i;
for (i=0;i<tamanho;i++) {
printf("\nElemento[%d] = %d",i,vetor[i]);
}
}
void ordenarMetodoInsertion(int vetor[], int tamanho)
{
int i,j,aux;
for (i=1;i< tamanho;i++) {
for (j=i;j>0 && vetor[j] < vetor[j-1];j--) {
aux=vetor[j-1];
vetor[j-1]=vetor[j];
vetor[j]=aux;
}
}
}
void main()
{
int vetor_lido[50],vetor_ordenado[50];
int i,auxiliar,tamanho_vetor;
/* Ler vetor */
i = 0;
auxiliar = 0;
do {
printf("\nElemento[%d] = ",i);
scanf("%d",&auxiliar);
if (auxiliar < 0)
break;
else
vetor_lido[i++] = auxiliar;
} while(1);
tamanho_vetor = i;
/* copiar o vetor para vetor ordenado */
for (i=0;i<tamanho_vetor;i++) {
vetor_ordenado[i]=vetor_lido[i];
}
/* ordenar vetor */
ordenarMetodoInsertion(vetor_ordenado,tamanho_vetor);
/* imprimir vetor nao ordenado */
printf("\nVETOR NAO ORDENADO");
imprimirVetor(vetor_lido,tamanho_vetor);
/* imprimir vetor ordenado */
printf("\nVETOR ORDENADO");
imprimirVetor(vetor_ordenado,tamanho_vetor);
printf("\nFinal do Programa\n");
}
6) Fazer um programa que define dois vetores de tamanho 50: um vetor de char e um vetor de inteiros. Imprimir os endereços das posições 0,1 e 2 de cada vetor no formato hexadecimal. Olhando os resultados
é possível inferir o tamanho de um char e de um int?
6/07: PROVA FINAL
Considerações sobre as questões da prova:
1) Será uma modificação do exercício 2 da prova do Tiago, envolvendo restrições no uso de caracteres (uso do switch) e de tamanho de senhas;
2) Será parecida com o exercício de calcular a média dos elementos de vetores quando foi retirado o menor e o maior número (uma outra restrição também pode ser considerada);
3) Envolverá structs, números complexos e possivelmente alguma coisa envolvendo soma, multiplicação ou conversão para a forma polar;
4) Questão "surpresa" onde será dado um programa e o aluno deverá escrever as saídas do programa.
Soluções:
Questão 1
#include <stdio.h>
#include <string.h>
char senha[50]="844136"; /* variavel global com senha atual */
void verificar_senha_atual()
{
char cadeia[50];
int retorno;
do {
printf("Entre com a senha atual\n");
scanf("%s",cadeia);
retorno = strcmp(senha,cadeia); /* strcmp retorna 0 se cadeias iguais */
if (retorno == 0)
break;
else
printf("Senha atual incorreta - tente novamente\n");
} while(1);
}
int verificar_regras(char vetor[])
{
int i;
int ret=1; /* variavel de apoio para retorno - se cadeia nao conforme ela vai a 0 */
if (strlen(vetor)==6){
for (i=0;i<6;i++) {
if (vetor[i]<'0' || vetor[i]>'9') { /* '0' equivale a 0x30 e '9' a 0x39 */
ret=0;
printf("senha com caracter nao numerico\n");
break; /* nao vale a pena continuar...*/
}
}
}else {
printf("tamanho inválido\n");
ret=0;
}
return ret;
}
void ler_nova_senha()
{
int retorno;
do {
printf("Entre com a nova senha\n");
scanf("%s",senha);
retorno = verificar_regras(senha); /* verifica conformidade com regras */
if (retorno == 1)
break;
else
printf("Senha nao conforme com as regras\n");
} while(1);
}
void main()
{
verificar_senha_atual(); /*fica eternamente esperando pela senha atual*/
ler_nova_senha(); /* fica eternamente esperando uma nova senha valida*/
}
Questão 2
#include "stdio.h"
float computar_media_maior_menor(float vetor[],int tamanho)
{
float media,maior,menor;
int i;
maior = vetor[0];
menor = vetor[0];
for (i=0;i<tamanho;i++) { /* i poderia começar em 1 se tamanho maior que 1 */
if (maior<vetor[i])
maior=vetor[i];
if (menor>vetor[i])
menor=vetor[i];
}
media = (maior+menor)/2;
return media;
}
/* programa principal somente para fins de teste - nao faz parte da solucao */
main()
{
float vetor_de_dados[50]={1.,4.,3.};
printf ("media = %f\n", computar_media_maior_menor(vetor_de_dados, 3));
}
Questão 3
OBS 1: A entrada de ângulo é em radianos - como seria para entrar em graus???
OBS 2: Para linkar com a biblioteca matematica fazer: gcc -lm prog.c -o prog
#include <stdio.h>
#include <math.h>
/* Estrutura representando numero complexo
em coordenada polar */
struct TComplexoPolar{
float r; /* raio */
float theta; /* angulo */
};
/* Estrutura representando numero complexo
em coordenada retangular */
struct TComplexoRetangular{
float x;
float y;
};
main ()
{
struct TComplexoPolar numPolar;
struct TComplexoRetangular numRet;
/* entrada de dados */
printf("Entre com o raio\n");
scanf("%f",&numPolar.r);
printf("Entre com o angulo (em radianos)\n");
scanf("%f",&numPolar.theta);
/* converter */
numRet.x = numPolar.r * cos(numPolar.theta);
numRet.y = numPolar.r * sin(numPolar.theta);
/* imprimir */
printf ("Complexo em Polar\n");
printf("raio = %f\n", numPolar.r);
printf("angulo = %f\n", numPolar.theta);
printf ("Complexo em Retangular\n");
printf("REAL = %f\n", numRet.x);
printf("IMAGINARIO = %f\n", numRet.y);
}
Questão 4
alfa = 1
beta= 14
gama= 2
delta= 5