Altere o �ltimo exemplo da p�gina para que ele escreva cada letra 5 vezes seguidas. Para isto, use um 'if' para testar se o contador � divis�vel por cinco (utilize o operador %) e s� ent�o realizar a atualiza��o em index.
Solu��o: Neste exerc�cio, segundo a sugest�o apresentada, bastava se adicionar a linha de c�digo que est� comentada, no exerc�cio abaixo. A vari�vel index, que aponta qual letra da string sera impressa, e que era incrementada circularmente a cada iteracao, agora so e incrementada de 5 em 5 iteracoes, ou seja, quando o resto da divisao de contador por 5 for 4, ou seja, seu valor vai variar de 0 a 4.
#include <stdio.h> main() { int index = 0, contador; char letras[5] = "Joao"; for (contador=0; contador<1000; contador++) { printf("\n%c",letras[index]); if (( contador % 5 ) == 4) /* Se o resto da divisao == 4, entao incrementa */ (index == 4)? index=0: ++index; } return 0; }
Enunciado:
Escreva um programa utilizando o comando switch que leia uma string (use gets()) e substitua todos os espa�os e tabula��es ('\t') por caracteres de nova linha ('\n'). O loop deve encerrar quando encontrar o caracter de final de string '\0'.
Solu��o:
#include <stdio.h> main() { int index; char frase[30];
printf("\n\nEntre com a frase (max 30 caracteres): "); gets(frase); for (index =0 ; frase[index] != '\0'; index++) { switch(frase[index]) { case '\t': frase[index] = '\n';
Fa�a um programa que inverta uma string: leia a string com gets e armazea-a invertida em outra string. Use o comando for para varrer a string at� o seu final.
Solu��o: Neste exerc�cio existem alguns detalhes interessantes. Primeiramente, � necess�rio determinar-se o tamanho da string. Isto � feito atrav�s de um primeiro for. Algumas pessoas n�o conseguiram chegar ao resultado por causa de um pequeno detalhe na 'linha em destaque'. Lembre-se sempre que se voc� tem um string de 10 posi��es, o seu �ndice pode variar de 0 a 9, e o '\0' vai estar na posi��o 9. Logo, voc� deve inverter a posi��o 8 com a 0, 7 com a 1, e assim por diante. � por isto que a express�o fica:
copia[i] = str[compstr-i-1]
N�o podemos tamb�m deixar de colocar o '\0' no final da nova string.
#include <stdio.h> #define MAX 31
void main() { char str[MAX], copia[MAX]; int i, compstr;
printf("\n\nEntre com uma string (max 30 caracteres): "); gets(str);
/* Determina o comprimento da string atraves de um for sem conteudo : ao final dele, compstr contem a posicao do '\0' da string*/
for(compstr=0; str[compstr]; compstr++);
/* Inverte a string */
for(i=0; str[i]; i++) { copia[i] = str[compstr-i-1]; /* Linha em destaque */ } copia[i] = '\0'; /* coloca um finalizador na string */ printf("\n\nString Invertida: %s\n", copia); }
Enunciado:
Refa�a o programa da p�gina anterior. Use o comando while para fechar o loop.
Solu��o: Como o comando while n�o tem o incremento pr�prio, precisamos faz�-lo dentro do seu loop. Outra observa��o importante � a necessidade de se inicializar a vari�vel com i = 0. Entao temos:
#include <stdio.h> #define MAX 31
void main() { char str[MAX], copia[MAX]; int i = 0, compstr;
printf("\n\nEntre com uma palavra (max 30 caracteres): "); gets(str);
/* Determina o comprimento da string atraves de um for sem conteudo : ao final dele, compstr contem a posicao do '\0' da string*/
for(compstr=0; str[compstr]; compstr++);
while (str[i] != '\0') { copia[i] = str[compstr-i-1]; /* Linha em destaque */ i++; } copia[i] = '\0'; printf("\n\nString Invertida: %s\n", copia); }
Enunciado:
Refa�a o exerc�cio da p�gina c410.html utilizando o la�o do-while para controlar o fluxo.
Solu��o: � preciso inicializar a vari�vel contador, para garantir o resultado desejado. O incremento tamb�m tem que ser feito explicitamente.
#include <stdio.h> main() { int index = 0, contador = 0; char letras[5] = "Joao"; do { printf("\n%c",letras[index]); if (( contador % 5 ) == 4) /* Se o resto da divis�o == 4, entao incrementa */ (index == 4)? index=0: ++index; contador ++; } while (contador < 1000); }
Enunciado:
Escreva um programa que pe�a ao usu�rio que digite tr�s n�meros inteiros, correspondentes a dia , m�s e ano. Teste os n�meros recebidos, e em caso de haver algum inv�lido, repita a leitura at� conseguir valores que estejam na faixa correta (dias entre 1 e 31, m�s entre 1 e 12 e ano entre 1900 e 2100). Verifique se o m�s e o n�mero de dias batem (incluindo verifica��o de anos bissextos). Se estiver tudo certo imprima o n�mero que aquele dia corresponde no ano. Comente seu programa.
Obs: Um ano � bissexto se for divis�vel por 4 e n�o for divis�vel por 100, exceto para os anos divis�veis por 400, que tamb�m s�o bissextos.
Solu��o: Este j� � um programa mais trabalhoso e exige um pouco mais de paci�ncia e aten��o. Apresentam-se algumas poss�veis solu��es para o problema. A primeira vers�o foi apresentada pelo Henrique Vianna na lista do curso do semestre passado. Como ela est� muito bem feita, entrou no nosso gabarito. A segunda vers�o e uma vers�o b�sica e n�o se garante a consist�ncia completa da data (entre , por exemplo, com o dia 30 de fevereiro de 1999 e o programa vai aceitar!!). Al�m disto, ela faz uso de vetores, que � o assunto da pr�xima aula. Assim, voc� so deve estud�-la se quiser adiantar o assunto. A terceira vers�o j� e mais avan�ada, realiza a leitura e testa a consist�ncia da data em um mesmo loop. Mas a filosofia das duas vers�es � a mesma: O programa testa a validade dos dados assim que os l�, para s� entao processar. A terceira vers�o tamb�m faz o uso do comando goto, o que pode ser evitado, pois o mesmo efeito teria sido alcan�ado usando-se uma estrutura de controle de fluxo qualquer.
Vers�o 1: Esta vers�o foi apresentada na lista do curso do semestre passado pelo Henrique Avila Viana, da Universidade Federal de Pelotas
#include <stdio.h>
dia_do_ano (int dia, int mes, int ano) {
int ano_bissexto, data_valida = 0; // Usadas como variaveis booleanas int total_dias = 0;
/* Na atribuicao abaixo, se as condicoes forem satisfeitas, a variavel recebera' um valor maior do que 0. Esta variavel sera' usada para testes booleanos, mais abaixo... */
if (dia >= 1 && dia <= 31 && mes >= 1 && mes <= 12 && ano >= 1900 && ano <= 2100) // Todos os dados nas faixas validas? if (mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12) data_valida = (dia <= 31); // Estes meses tem 31 dias else if (mes == 2) // Fevereiro e' um caso a parte... if (ano_bissexto) // Se o ano for bissexto data_valida = (dia <= 29); // o dia pode ir ate' 29 else data_valida = (dia <= 28); // Senao, so' ate' 28 else data_valida = (dia <= 30); // Se chegou aqui, e' um mes de 30 dias
if (data_valida) {
/* O switch abaixo totaliza os dias decorridos dos meses anteriores ao digitado. Notem a ordem decrescente dos meses e a falta do comando "break" nos cases, fazendo com que todos os meses anteriores sejam somados... */
switch (mes) { case 12: total_dias += 30; // do mes de novembro case 11: total_dias += 31; // do mes de outubro case 10: total_dias += 30; // do mes de setembro case 9: total_dias += 31; // do mes de agosto case 8: total_dias += 31; // do mes de julho case 7: total_dias += 30; // do mes de junho case 6: total_dias += 31; // do mes de maio case 5: total_dias += 30; // do mes de abril case 4: total_dias += 31; // do mes de marco case 3: total_dias += ano_bissexto?29:28; // do mes de fevereiro case 2: total_dias += 31; // do mes de janeiro }
total_dias += dia; // Agora adicionamos os dias decorridos no mes atual }
return (total_dias); // E retornamos o valor; retorna 0 se data invalida }
/* *********************************************************************** Funcao principal - faz a leitura da data a partir do teclado, chama a nossa funcao dia_do_ano e mostra o resultado. *********************************************************************** */
main() {
int d, m, a, dias = 0;
while (!dias) { printf("Entre com dia, mes e ano no formato dd/mm/aaaa: "); fflush (NULL); scanf("%d/%d/%d", &d, &m, &a);
dias = dia_do_ano(d,m,a);
if (!dias) printf ("Data invalida! Tente novamente..\n\n"); }
printf ("\n\nEsta data representa o %do. dia de %d.\n", dias, a); return 0; }
Vers�o 2: consist�ncia da data n�o est� boa (aceita datas erradas, como o dia 30 de fevereiro ...). Al�m disto, faz uso de vetores ...: /* -------------------------------------------------------- */ /* CONTADOR DE DIAS: Vers�o 2 ---------------------------- */ #include <stdio.h> main() { int dia, mes, ano, i; /* Variaveis.. */ int ndias; int meses[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
printf("\n\n ----Contador de dias----- \n");
/* Leitura da data */ do { printf("\nDia: "); scanf("%d", &dia); } while ((dia > 31) || (dia < 1)); do { printf("\nMes: "); scanf("%d", &mes); } while ((mes > 12) || (mes < 1)); do { printf("\nAno: "); scanf("%d", &ano); } while ((ano < 1900) || (ano > 2100));
/* E isto garante que a data seja valida */ /* Agora, ao processamento ------------------------------------ */ /* Primeiro inicializamos ndias. Em seguida, somamos os dias */ /* do mes corrente e por fim somamos os dias dos meses passados */
ndias = 0;
/* Descobrindo se o ano e bissexto */ /* Caso seja, iremos somar um dia na soma final, mas somente se */ /* o mes corrente for posterior ao mes de fevereiro.. */
if ( ((ano%4) == 0) && ((ano%100) != 0) || (ano%400 == 0)) /* Se e bissexto */ if (mes > 2) ndias += 1; /* Se j� passou o mes de fevereiro */
/* Computa os dias do mes corrente */ ndias += dia;
/* O mes corrente j� foi contado. Portanto o contador vai ate mes-1 */ for (i=0; i< (mes-1); i++) ndias += meses[i];
printf("\nDia Numero: %ld", ndias); }
Vers�o 3: Melhora a consist�ncia da data, mas inda faz uso de vetores: /* -------------------------------------------------------- */ /* CONTADOR DE DIAS: Vers�o 3 ---------------------------- */ #include <stdio.h> main() { int dia, mes, ano, i; long int ndias; int meses[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
printf("\n\n ----Contador de dias----- \n");
/* Leitura da data L� ate que a data seja valida */ le_data: /* Rotulo usado para o comando goto */ do { printf("\nEntre com a data no formato DD/MM/AA: "); scanf("%d/%d/%d", &dia, &mes, &ano); } while (((dia > 31) || (dia < 1)) && ((mes > 12) || (mes < 1)) && ((ano < 1900) || (ano > 2100)) );
/* Verificando se o ano e bissexto */ /* Caso seja, o mes de fevereiro ganha mais um dia.. */
/* Verifica a consistencia da data. Caso inconsistente volta a le_data */ if (dia > meses[mes-1]) /* DATA INCONSISTENTE!! */ { printf("\n DATA INCONSISTENTE! \n "); meses[1] = 28; /* Desfaz a soma de um dia no mes de fevereiro */ goto le_data; }
/* E isto garante que a data seja valida */ /* Agora, ao processamento -----------------------*/
ndias = 0;
/* Computa os dias do mes corrente */ ndias += dia;
for (i=0; i< (mes-1); i++) /* O mes corrente j� foi contado (mes-1)*/ ndias += meses[i];
printf("\nDia Numero: %ld", ndias); }
Enunciado:
Fa�a um programa de convers�o de base num�rica. O programa dever� apresentar uma tela de entrada com as seguintes op��es:
< Conversao de base >
1: decimal para hexadecimal 2: hexadecimal para decimal 3: decimal para octal 4: octal para decimal 5: Encerra
Informe sua opcao:
A partir da op��o escolhida, o programa dever� pedir o numero na base escolhida, l�-lo e apresent�-lo na base desejada. Em seguida, o programa deve perguntar ao usu�rio se ele deseja retornar ao menu principal ou finalizar o programa. O problema pode ser estendido a outras bases, de acordo com o interesse do aluno.
Solu��o: A seguir � apresentada uma solu��o.Mais uma vez, esta � apenas uma forma de implementar, havendo muitos outros caminhos para se chegar � solu��o.
/*------------------------------------------------------------------*/ /* Programa de conversao de bases ----------------------------------*/ /* Vers�o 1 --------------------------------------------------------*/
/* Loop principal do programa --------------------------------------*/ while (opcao != 5) { printf("\n\n");
/* Imprime a tela */ printf("\n\n\t< Conversao de base >"); printf("\n 1: decimal para hexadecimal"); printf("\n 2: hexadecimal para decimal"); printf("\n 3: decimal para octal"); printf("\n 4: octal para decimal"); printf("\n 5: Encerra");
printf("\n\n\t\tOpcao: "); scanf("%d", &opcao); if ((opcao > 4)||(opcao <1)) continue; /* Opcao invalida ou saida */ /* Volta ao inicio do loop */
printf("\nEntre com o numero: "); switch (opcao) { case 1: scanf("%d", &entrada); printf("Numero convertido: %x", entrada); break; case 2: scanf("%x", &entrada); printf("Numero convertido: %d", entrada); break; case 3: scanf("%d", &entrada); printf("Numero convertido: %o", entrada); break; case 4: scanf("%o", &entrada); printf("Numero convertido: %d", entrada); break; } } }