Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

pudim

Progama comandos

Mensagens Recomendadas

pudim

#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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rui Carlos

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pudim

#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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.