Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

pudim

Progama comandos

Recommended Posts

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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.