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

RitxAngel

[AJUDA]Programa rebenta quando estou a executa-lo

14 mensagens neste tópico

Bons dias pessoal, passa-se o seguinte.  Tenho aqui um projecto para fazer, e embora no debug do dev não me deia erros, não o consigo executar para ter total certeza pois quando estou a navegar pelo menu, quando chego a parte de inserir um curso por exemplo, o programa bloqueia e dá aquele erro de "O windows encontrou um problema e vai ter que ser encerrado". Estou um pouco aflito com isto, pois ja perdi aqui quase um dia e ainda nao consegui entender o porque, e devido a isso, vim vos perguntar por aqui, se alguem me consegue resolver este prob.

Desde já os meus maravilhosos obrigados :D

Abraços

#include <stdio.h>
#include <stdlib.h>

#include "gestor.h"
//-------------------------------------------------------MAIN------------------------------------------------------------
int main()
{
        unsigned short op_menu;
        char op_inserir,op_editar,op_eliminar,op_listar;

        do{
                
                printf("\t\tMenu Principal\n\n");
                op_menu=menu();     //Escolha da opção no menu
        switch(op_menu){
                
                case 1:
                        
                        printf("-->Prima C seguido de enter para ADICIONAR um novo CURSO\n");
                        printf("\n");
                        printf("-->Prima D seguido de enter para ADICIONAR uma nova DISCIPLINA\n");
                        printf("\n");
                        printf("-->Prima T seguido de enter para ADICIONAR uma nova TURMA\n");
                        printf("\n");
                        printf("-->Prima H seguido de enter para ADICIONAR um novo Horario\n");
                        scanf("%s", op_inserir);
                        
                        if(op_inserir=='c')
                        {
                                           inserir_curso;
                                
                        }
                        else if(op_inserir=='d')     
                                {
                                        inserir_disciplina;
                                        
                                } 
                        else if(op_inserir=='t')     
                                {
                                        inserir_turma;
                                        
                                }      
                        /*else if(op_inserir=='h')     
                                {
                                        inserir_horario;
                                        clrscr();
                                }»*/       

                                else{
                                        printf("Opcao invalida\n");
                                        system("pause");
                                         
                                }       
                                                         
                       /* break;
                case 2:
                        clrscr();
                        printf("-->Prima C seguido de enter para REMOVER um novo CURSO\n");
                        printf("\n");
                        printf("-->Prima D seguido de enter para REMOVER uma nova DISCIPLINA\n");
                        printf("\n");
                        printf("-->Prima T seguido de enter para REMOVER uma nova TURMA\n");
                        printf("\n");
                        printf("-->Prima H seguido de enter para REMOVER um novo Horario\n");
                        scanf("%s",&op_eliminar);
        
                        if(op_eliminar=='c')
                        {
                                eliminar_curso;
                                clrscr();
                        }
                        else if(op_eliminar=='d')     
                                {
                                        eliminar_disciplina;
                                        clrscr();
                                } 
                        else if(op_eliminar=='t')     
                                {
                                        eliminar_turma;
                                        clrscr();
                                }      
                        else if(op_eliminar=='h')     
                                {
                                        eliminar_horario;
                                        clrscr();
                                }
                                else
                                {
                                        printf("Opcao invalida\n");
                                        system("pause");
                                        clrscr(); 
                                }                                                               
                        break;
                        
                /*case 3:
                        clrscr();
                        printf("-->Prima C seguido de enter para EDITAR um novo CURSO\n");
                        printf("\n");
                        printf("-->Prima D seguido de enter para EDITAR uma nova DISCIPLINA\n");
                        printf("\n");
                        printf("-->Prima T seguido de enter para EDITAR uma nova TURMA\n");
                        printf("\n");
                        printf("-->Prima H seguido de enter para EDITAR um novo Horario\n");
                        scanf("%s",&op_editar);

                        if(op_editar=='c')
                        {
                                editar_curso;
                                clrscr();
                        }
                        else if(op_editar=='d')     
                                {
                                        editar_disciplina;
                                        clrscr();
                                } 
                        else if(op_editar=='t')     
                                {
                                        editar_turma;
                                        clrscr();
                                }      
                        /*else if(op_eliminar=='h')     
                                {
                                        eliminar_horario;
                                        clrscr();
                                }
                                
                        case 4:
                             clrscr();
                             printf("-->Prima C seguido de enter para LISTAR um novo CURSO\n");
                             printf("\n");
                             printf("-->Prima D seguido de enter para LISTAR uma nova DISCIPLINA\n");
                             printf("\n");
                             printf("-->Prima T seguido de enter para LISTAR uma nova TURMA\n");
                             printf("\n");
                             printf("-->Prima H seguido de enter para LISTAR um novo Horario\n");
                             scanf("%s",&op_listar);
                        
                             if(op_listar=='c')
                             {
                                listar_curso;
                                clrscr();
                                }
                                else if(op_listar=='d')     
                                {
                                        listar_disciplina;
                                        clrscr();
                                } 
                                else if(op_listar=='t')     
                                {
                                        listar_turma;
                                        clrscr();
                                }      
                                /*else if(op_listar=='h')     
                                {
                                        listar_horario;
                                        clrscr();
                                }      

                                else{
                                        printf("Opcao invalida\n");
                                        system("pause");
                                        clrscr(); 
                                }       
                                clrscr();                          
                        break;

                  case 0:
                            clrscr();
                                printf("\n\t\tFim do programa\n\n");
                                system("pause");
                          break;*/

                default:
                        printf("OPCAO INEXISTENTE\n\n");
        }
        }while(op_menu!=0);
        return 0;
}


#define GESTOR_H

#define MAX_NOME 150

/*--------------------------------------------------------STRUCTS----------------------------------------------------*/
struct CURSO{
        char nome[MAX_NOME+1];
        char descricao[MAX_NOME+1];
        char ciclo[MAX_NOME+1];
};

struct DISCIPLINA{
        char nome[MAX_NOME+1];
        int anolectivo;
        int semestre;
        char curso[MAX_NOME+1];
        char tipoblocos[MAX_NOME+1];
        int numblocos;
        int numhorasblocos;
        int maxalunosblocos;
        
};

struct TURMA{
        char nome[MAX_NOME+1];
        char curso[MAX_NOME+1];
        char tipohorario[MAX_NOME+1];
        int anolectivo;
        int maxalunos;

};

/*--------------------------------------------------------TYPEDEF--------------------------------------------------------*/
typedef struct CURSO curso;
typedef struct DISCIPLINA disciplina;
typedef struct TURMA turma;

/*--------------------------------------------------------DECLARAR FUNCOES------------------------------------------------*/

int menu();
int inserir_curso(curso *entrada_c[]);
int inserir_turma(turma *entrada_t);
int inserir_disciplina(disciplina *entrada_d);



#include <stdio.h>
#include "gestor.h"
#include "leTipo.h"

/*-----------------------------------------------FUNÇÕES-----------------------------------------------------------------*/


int menu()
{
        int NumOpcao;

        printf(" 1 - Adicionar Curso/Disciplina/Turma/Horario\n");
        printf(" 2 - Remover Curso/Disciplina/Turma/Horario\n");
        printf(" 3 - Editar Curso/Disciplina/Turma/Horario\n");
        printf(" 4 - Listar Curso/Disciplina/Turma/Horario\n");
        printf(" 5 - Curso/Disciplina/Turma/Horario\n");
        printf(" 0 - Sair do programa\n\n");

        printf("Introduza o NUMERO da opcao desejada: ");
        do{
                fflush(stdin);
                scanf("%d",&NumOpcao);
        }while(NumOpcao<0 && NumOpcao>5);     

        return NumOpcao;       
}

int inserir_curso(curso *entrada_c[])
{
      unsigned short addnew;      
            
            do
            {
             unsigned short i;
             printf("\n Adicionar curso \n");
             printf("Nome do Curso%s\n", (*entrada_c[i]).nome);
             printf("Descricao do curso:%s\n", (*entrada_c[i]).descricao);
             printf("Ciclo do curso%s\n", (*entrada_c[i]).ciclo);
             printf("\nCURSO ADICIONADO\n");
             printf("Deseja continuar a adicionar cursos? Presione 0 para terminr e 1 para continuar\n");
             scanf("%s", addnew);
             i++;
             }
            while (addnew != 0);
                               
}

int inserir_turma(turma *entrada_t)
{
                printf("Adicionar Turma \n\n");
                printf("Nome da Turma\n", (*entrada_t).nome);
                printf("Curso da Turma\n", (*entrada_t).curso);
                printf("Tipo do Horario(Manha, Tarde, Pos-laboral)\n", (*entrada_t).tipohorario);
                printf("Ano Lectivo da Turma\n", (*entrada_t).anolectivo);
                printf("Numero maximo de alunos da Turma\n", (*entrada_t).maxalunos);
                printf("\nTURMA ADICIONADA\n");
                system("pause");

}

int inserir_disciplina(disciplina *entrada_d)
{
                printf("Adicionar Disciplina \n\n");
                printf("Nome da Disciplina\n", (*entrada_d).nome);
                printf("Ano Lectivo da Disciplina\n", (*entrada_d).anolectivo);
                printf("Semestre da Disciplina\n", (*entrada_d).semestre);
                printf("Curso da Disciplina\n", (*entrada_d).curso);
                printf("Tipo de Blocos (Teoricos ou Praticos) da Disciplina\n", (*entrada_d).tipoblocos);
                printf("Numero de Blocos\n", (*entrada_d).numblocos);
                printf("Numero de Horas de cada bloco\n", (*entrada_d).numhorasblocos);
                printf("Numero Maximo de Alunos por bloco\n", (*entrada_d).maxalunosblocos);
                printf("\nTURMA ADICIONADA\n");
                system("pause");

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

scanf("%s", op_inserir);

op_inserir é um char e não uma string.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então vai ficar scanf("%c", op_inserir);?

É que ja tentei mas continua a dar erro logo a seguir :s

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não, tens de lhe passar o endereço de op_inserir, usando o operador &.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

                        scanf("%c", &op_inserir);

                       

                        if(op_inserir=='c')

                       

È assim que vai ficar? Desculpa la a massada :D

Já agora, se for assim que tem que ficar, ele assume sempre o valor que eu puser antes, e como não pode ser assim. Por exemplo, eu tenho que por 1 e c, e quando meto um, ele assume logo o 1 quando devia pedir o c ainda

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eish, mais uma vez desculpa, mas não entendi como uso aquilo, entendi a sua função, mas nao percebi como o aplico.

Mas desde já o meu muito obrigado pela tua ajuda

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sempre que usares o scanf para uma "string" em C, a seguir limpa o buffer de input: scanf("%*c");

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas como, assim? scanf("%*c", op_inserir);

Já pus, mas continua a fazer a mesma coisa

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

scanf("%*[^\n]", &op_inserir);

scanf("%*c");

no link que o Baderous explica-te muito bem. E é verdade, não estás a usar strings nem char*'s, nem char[] nem nada disso, estás a usar char's somente. Já agora:

if(op_inserir=='c')
                        {
                                           inserir_curso;
                               
                        }

o inserir_curso não é uma função? Tu estás a usar scanf para strings em muitas coisas, como por exemplo scanf("%s",&addnew); e o addnew é um u_short...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, eu ja tinha reparado que possivelmente me tinha enganado nesse u_short, mas obrigada por me confirmares :D

já tentei com essas duas funções que disses-te, mas no entanto, ainda não deu :s

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

scanf("%*[^\n]", &op_inserir);

Isto não está certo.

scanf("%*[^\n]"); Descarta todos os caractered do stdin até ao \n. scanf("%*c"); descarta o próprio \n.

Não podes ler nada quando tens o * lá pois esse é o especificador de descarte.

Sigam este algoritmo (lol) para INPUT/OUTPUT em C:

/* PASSO 1: Ler as tuas merd*s */ scanf("%BLABLABLA", &var1);  /* tira o '&' se for char[] */
/* PASSO 2: Limpar o buffer */      scanf("%*[^\n]%*c");
/* PASSO 3: Voltar ao PASSO 1 */

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isto não está certo.

scanf("%*[^\n]"); Descarta todos os caractered do stdin até ao \n. scanf("%*c"); descarta o próprio \n.

Não podes ler nada quando tens o * lá pois esse é o especificador de descarte.

Sigam este algoritmo (lol) para INPUT/OUTPUT em C:

/* PASSO 1: Ler as tuas merd*s */ scanf("%BLABLABLA", &var1);  /* tira o '&' se for char[] */
/* PASSO 2: Limpar o buffer */      scanf("%*[^\n]%*c");
/* PASSO 3: Voltar ao PASSO 1 */

Já tinha reportado aqui que essa forma de limpar o buffer não funciona.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já tinha reportado aqui que essa forma de limpar o buffer não funciona.

Tens razão. Erro meu. Tens que separar as chamadas.

scanf("%*[^\n]"); scanf("%*c");

0

Partilhar esta mensagem


Link 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