estevaodrdias
(usa openSUSE)
Enviado em 30/06/2012 - 17:27h
Você pode passear melhor pela matriz com um ponteiro... Mas apenas se você souber o que está fazendo para não gerar falhas de segmentação. Abaixo um exemplo de como fazer - um programa que fiz para ajudar um amigo. Se não ajudar, use variáveis auxiliares para acessar os endereços da matriz no laço, e outra para guardar os valores e outra para o cálculo... as vezes é preciso testar construindo um código mais simples possível para entender melhor como resolver o problema e depois pensar em deixar o código mais agradável, numa versão final.
/*
main.c
Sáb 02 Jun 2012 19:35:03 BRT
Estevão Dominique Ribeiro Dias at estevaodrdias@gmail.com
Recebe um mês e um ano no formato mm/aaaa e retorna o número de dias nesse mês levando em
consideração se o ano é ou não bissexto. Um ano é bissexto quando é múltiplo de 4 e não
múltiplo de 100, ou também quando é múltiplo de 400.
Há uma lista de anos para testar em
http://www.ponteiro.com.br/bisse.php
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(int argc, char **argv)
{
// Data digitada pelo usuário.
char data[] = "mm/aaaa";
// Mês fornecido pelo usuário
char mes[] = "mm";
// Ano fornecido pelo usuário.
char ano[] = "aaaa";
// Resultado dos testes que vão verificar se o ano digitado pelo usuário é ou não bissexto.
int ano_bissexto = 0;
// Utilizada nos loops. Declarada aqui por que em C devemos declarar nossas variáveis antes de
// qualquer outra declaração.
int contador = 0;
// Matriz contendo o total de dias nos meses do ano para facilitar a impressão do resultado.
// Note que o primeiro elemento na matriz é zero para que não seja necessário alterar o mês
// informado pelo usuário, por exemplo,
// <code>return dias_mes[mes + 1];</code>.
int dias_mes[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// Um ponteiro nos possibilita trabalhar de forma muito mais fácil com cadeias de caracteres. A
// variável pdata aponta para o primeiro elemento na matriz data.
char *pdata = &data[0];
// Imprime a mensagem de boas vindas na tela.
fprintf(stdout, "Insira uma data no formato: %s\n", data);
// Lê a data.
gets(data);
// Verifica se o formato da data inserido pelo usuário está correto. Se o usuário deseja saber
// quantos dias tem fevereiro e digitou, por exemplo 2/2012, deveria digitar 02/2012, então o
// programa exibe um erro e finaliza. EXIT_FAILURE contém o valor 1, que indica que o programa
// terminou após um erro.
if(data[2] != '/') {
fprintf(stderr, "%s\n%s\n",
"Atenção, o formato da data deve ser mm/aaaa",
"Ex: 02/2012");
system("PAUSE");
return EXIT_FAILURE;
}
// Aqui utilizamos o ponteiro para a variável data para obter porções dessa matriz, e copiar o
// que está antes e depois da barra na matriz para as variáveis ano e mês.
strncpy(mes, pdata, 2);
pdata += 3;
strncpy(ano, pdata, 4);
// Exibe os dados inseridos nas variáveis mês e ano para sabermos como se comportou o bloco de
// código acima. Isso não é relevante para o usuário, portanto pode ser comentado antes de
// gerar a versão final do programa. Ou, de uma forma mais elegante pode ser inserido entre
// macros <code>#ifdef FOO</code> e <code>#endif</code>. Assim só será exibida se usarmos a
// opção <code>-DFOO</code> do compilador.
fprintf(stdout, "\n%s: %s\n%s: %s\n",
"Mês digitado", mes, "Ano digitado", ano);
// Verifica se o mês digitado é maior que doze gerando um erro se for e finalizando o programa.
if(atoi(mes) > 12) {
fprintf(stderr, "%s: %s!\n", "Mês digitado inválido", mes);
system("PAUSE");
return EXIT_FAILURE;
}
// Aqui verificamos se o ano é ou não bissexto. Se for, o valor na variável de controle
// ano_bissexto será verdadeiro. Primeiro verifico se o ano é múltiplo de cem, se for verifico
// se ele é múltiplo de quatrocentos. Se não for verifico se é múltiplo de quatro.
if(atoi(ano) % 100 == 0) {
if(atoi(ano) % 400 == 0)
ano_bissexto = 1;
}
else if(atoi(ano) % 4 == 0)
ano_bissexto = 1;
// Se o mês for fevereiro, e o ano for bissexto, então imprimimos vinte e nove e finalizamos o
// programa.
if(atoi(mes) == 2 && ano_bissexto) {
fprintf(stdout, "%s %s\n",
"A quantidade de dias no mês digitado é: ", "29");
system("PAUSE");
return EXIT_SUCCESS;
}
// Caso contrário imprimimos o valor no endereço correspondente ao mês digitado pelo usuário
// na matriz <code>dias_mes</code>.
fprintf(stdout, "%s %d\n", "A quantidade de dias no mês digitado é: ",
dias_mes[atoi(mes)]);
system("PAUSE");
return EXIT_SUCCESS;
}
Tente resolver - sabe aquele capa do livro Compiladores com o dragão? Destrua ele, brother! Ou dome-o. Leia as mensagens do compilador com atenção e corrija os pontos indicados um por um. Se ainda assim não conseguir coloque o código, as mensagens de erro e questão completa, dai poderemos te ajudar melhor.