pudim Posted December 29, 2009 at 10:20 PM Report Share #303088 Posted December 29, 2009 at 10:20 PM #include <stdio.h> #include <ctype.h> #include <stdbool.h> /* CONSTANTES E TIPOS - Constantes e tipos */ #define MAX_STRING 256 #define MAX_LINHA 1024 typedef char String[MAX_STRING]; typedef char Linha[MAX_LINHA]; /* AUXILIARES - Funcoes auxiliares */ char ler_comando(void) { int c; while( (c = fgetc(stdin)) == ' ' || c == '\t' ); return (c < ' ') ? ' ' : toupper(c); } int ler_inteiros(int *arg1, int *arg2, int *arg3) { Linha linha ; int i, arg4; // le^ a linha ate' ao fim if (fgets(linha, MAX_LINHA, stdin) == NULL) return 0; // testa se a linha tem lixo for( i = 0 ; linha[i] != '\0' ; i++ ) if (!isspace(linha[i]) && !isdigit(linha[i]) && linha[i] != '-') return -1; // le^ os inteiros int n = sscanf(linha, "%d %d %d %d", arg1, arg2, arg3, &arg4); // a expressao seguinte e' uma expressao condicional, estudada na aula teorica 8 return (n < 0) ? 0 : (n > 3 ) ? -1 : n; typedef struct { int dia, mes, ano; }Data; bool ano_bissexto(int ano) { return (ano % 4 == 0 && ano % 100 != 0) || ano % 400 == 0; } int dias_do_mes(int mes, int ano) { if (mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12) return 31; else if (mes == 4 || mes == 6 || mes == 9 || mes == 11) return 30; else if (ano_bissexto(ano)) return 29; else return 28; } bool valid_data(Data d) { return d.mes >= 1 && d.mes <= 12 && d.dia >= 1 && d.dia <=dias_do_mes(d.mes, d.ano); } Data le_data(void) { Data aux; do scanf("%d %d %d", &aux.dia, &aux.mes, &aux.ano); while(!valid_data(aux)); return aux; } Data dia_seguinte(Data d) { Data aux = d; if(aux.dia < dias_do_mes(aux.mes, aux.ano)) aux.dia ++; else if(aux.mes < 12) { aux.dia = 1; aux.mes ++; } else { aux.dia=1; aux.mes=1; aux.ano ++; } return aux; } Data dia_anterior(Data d) { Data aux = d; if(aux.dia < dias_do_mes(aux.mes, aux.ano)) aux.dia --; else if(aux.mes < 12) { aux.dia = 1; aux.mes --; } else { aux.dia=1; aux.mes=1; aux.ano --; } return aux; } Data avanca_dias(Data d, int n) { int i; if(n > 0) for(i = 0; i < n; i++) d = dia_seguinte(d); else if(n < 0) for(i = 0; i > n; i--) d = dia_anterior(d); return d; } void escreve_data(Data d) { printf("%d %d %d\n", d.dia, d.mes, d.ano); Data d,d1; int n; d=le_data(); scanf("%d", &n); d1=avanca_dias(d, n); escreve_data(d1); } /* INTERPRETADOR DE COMANDOS - A funcao que implementa o interpretador de comandos */ void interpretador_comandos(void) { char comando; int arg1, arg2, arg3, n_args; for(;B) { printf("=> "); comando = ler_comando(); n_args = ler_inteiros(&arg1, &arg2, &arg3); switch (comando) { case '+': printf("%d\n, escreve_data"); break; case '-': printf("Comando nao implementado\n"); break; case 'A': printf("Comando nao implementado\n"); break; case 'C': printf("Comando nao implementado\n"); break; case 'D': printf("Comando nao implementado\n"); break; case 'E': printf("Comando nao implementado\n"); break; case 'F': printf("Comando nao implementado\n"); break; case 'G': printf("Comando nao implementado\n"); break; case 'H': printf("Comando nao implementado\n"); break; case 'I': printf("Comando nao implementado\n"); break; case 'J': printf("Comando nao implementado\n"); break; case 'M': printf("Comando nao implementado\n"); break; case 'O': printf("Comando nao implementado\n"); break; case 'P': printf("Comando nao implementado\n"); break; case 'Q': printf("Comando nao implementado\n"); break; case 'S': printf("Comando nao implementado\n"); break; case 'T': printf("Comando nao implementado\n"); break; case 'V': printf("Comando nao implementado\n"); break; case 'Y': printf("Comando nao implementado\n"); break; case 'Z': printf("Comando nao implementado\n"); break; default : printf("Comando inexistente\n");} } } /* MAIN - Funcao principal */ int main(void) { interpretador_comandos(); return 0; } Depois de programar este extenso código onde intervêm vários comandos mas que eu ainda só implementei funções para o primeiro comando denominado "+" aparece o seguinte erro: parse error at end of input. Não percebo o que se passa. Se algúem me puder ajudar agradecia. Link to comment Share on other sites More sharing options...
Rui Carlos Posted December 30, 2009 at 10:17 AM Report Share #303143 Posted December 30, 2009 at 10:17 AM Dava jeito colocar aqui as mensagens de erro do compilador, que não deve ser só essa que colocaste aí. Basicamente falta-te terminar a função ler_inteiros. Adicionalmente tens a variável d declarada duas vezes na função escreve_data. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
pudim Posted December 30, 2009 at 03:07 PM Author Report Share #303202 Posted December 30, 2009 at 03:07 PM #include <stdio.h> #include <ctype.h> #include <stdbool.h> /* CONSTANTES E TIPOS - Constantes e tipos */ #define MAX_STRING 256 #define MAX_LINHA 1024 typedef char String[MAX_STRING]; typedef char Linha[MAX_LINHA]; /* AUXILIARES - Funcoes auxiliares */ char ler_comando(void) { int c; while( (c = fgetc(stdin)) == ' ' || c == '\t' ); return (c < ' ') ? ' ' : toupper(c); } int ler_inteiros(int *arg1, int *arg2, int *arg3) { Linha linha ; int i, arg4; // le^ a linha ate' ao fim if (fgets(linha, MAX_LINHA, stdin) == NULL) return 0; // testa se a linha tem lixo for( i = 0 ; linha[i] != '\0' ; i++ ) if (!isspace(linha[i]) && !isdigit(linha[i]) && linha[i] != '-') return -1; // le^ os inteiros int n = sscanf(linha, "%d %d %d %d", arg1, arg2, arg3, &arg4); // a expressao seguinte e' uma expressao condicional, estudada na aula teorica 8 return (n < 0) ? 0 : (n > 3 ) ? -1 : n; } typedef struct { int dia, mes, ano; }Data; bool ano_bissexto(int ano) { return (ano % 4 == 0 && ano % 100 != 0) || ano % 400 == 0; } int dias_do_mes(int mes, int ano) { if (mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12) return 31; else if (mes == 4 || mes == 6 || mes == 9 || mes == 11) return 30; else if (ano_bissexto(ano)) return 29; else return 28; } bool valid_data(Data d) { return d.mes >= 1 && d.mes <= 12 && d.dia >= 1 && d.dia <=dias_do_mes(d.mes, d.ano); } Data le_data(void) { Data aux; do scanf("%d %d %d", &aux.dia, &aux.mes, &aux.ano); while(!valid_data(aux)); return aux; } Data dia_seguinte(Data d) { Data aux = d; if(aux.dia < dias_do_mes(aux.mes, aux.ano)) aux.dia ++; else if(aux.mes < 12) { aux.dia = 1; aux.mes ++; } else { aux.dia=1; aux.mes=1; aux.ano ++; } return aux; } Data dia_anterior(Data d) { Data aux = d; if(aux.dia < dias_do_mes(aux.mes, aux.ano)) aux.dia --; else if(aux.mes < 12) { aux.dia = 1; aux.mes --; } else { aux.dia=1; aux.mes=1; aux.ano --; } return aux; } Data avanca_dias(Data d, int n) { int i; if(n > 0) for(i = 0; i < n; i++) d = dia_seguinte(d); else if(n < 0) for(i = 0; i > n; i--) d = dia_anterior(d); return d; } void escreve_data(Data d) { printf("%d %d %d\n", d.dia, d.mes, d.ano); } int comando_mais(int n) { Data d, d1; d=le_data(); scanf("%d", &n); d1=avanca_dias(d, n); escreve_data(d1); return 0; } /* INTERPRETADOR DE COMANDOS - A funcao que implementa o interpretador de comandos */ void interpretador_comandos(void) { char comando; int arg1, arg2, arg3, n_args; for(;B) { printf("=> "); comando = ler_comando(); n_args = ler_inteiros(&arg1, &arg2, &arg3); switch (comando) { case '+': printf("comando_mais"); break; case '-': printf("Comando nao implementado\n"); break; case 'A': printf("Comando nao implementado\n"); break; case 'C': printf("Comando nao implementado\n"); break; case 'D': printf("Comando nao implementado\n"); break; case 'E': printf("Comando nao implementado\n"); break; case 'F': printf("Comando nao implementado\n"); break; case 'G': printf("Comando nao implementado\n"); break; case 'H': printf("Comando nao implementado\n"); break; case 'I': printf("Comando nao implementado\n"); break; case 'J': printf("Comando nao implementado\n"); break; case 'M': printf("Comando nao implementado\n"); break; case 'O': printf("Comando nao implementado\n"); break; case 'P': printf("Comando nao implementado\n"); break; case 'Q': printf("Comando nao implementado\n"); break; case 'S': printf("Comando nao implementado\n"); break; case 'T': printf("Comando nao implementado\n"); break; case 'V': printf("Comando nao implementado\n"); break; case 'Y': printf("Comando nao implementado\n"); break; case 'Z': printf("Comando nao implementado\n"); break; default : printf("Comando inexistente\n");} } } /* MAIN - Funcao principal */ int main(void) { interpretador_comandos(); return 0; } Muito obrigado pelo esclarecimento. Já emendei as situações referidas. Continuo a não conseguir obter o comando mais, quando abre a consola insiro os argumentos pedidos: o nome do comando, dia, mês, ano e n, mas n aparece o resultado pretendido que é 20091217 no caso de "+ 20091215 2". Aparece-me "comando_mais=>". Se alguém m puder ajudar agradecia. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now