Your code compiles just fine without errors or warnings. Here's mine...
Code:
/*
// Objetivo do programa:
// ---------------------
// Programa em linguagem C que permite as seguintes opções:
// (a) Abrir semestre
// (b) Incluir disciplina
// (c) Informar nota ou freqüência
// (d) Finalizar semestre
// (f) Fechar semestre
// (g) Sair do programa
//
//
// Componentes do grupo:
// ---------------------
// Nome:
// Nome:
//
//
// Data e hora da última atualização do texto do programa:
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <windows.h>
void mostrar_menu(void);
int escolha_valida(char);
int processar_escolha(char);
void limpar_buffer(void);
void tirar_newline(char[]);
void abrir_semestre(void);
void adicionar_linha(char[]);
void clrscr(void);
void fechar_semestre(void);
/*
// Esta struct será usada na lista encadeada
// que vai armazenar todas as linhas lidas do
// arquivo do semestre. Abaixo dela está a
// declaração do primeiro nó que será usado
// para marcarmos o começo da lista.
*/
struct node {
char linha[100];
struct node *proximo;
};
struct node *primeiro = NULL;
/*
// Este vetor armazenará o nome do arquivo do
// semestre que o usuário quer abrir.
*/
char nome_do_arquivo[14] = {0};
memset(nome_do_arquivo, '\0', sizeof(nome_do_arquivo));
int main(void)
{
char escolha;
/*
// Enquanto a opção escolhida pelo
// usuário não for igual à letra g...
*/
do {
do {
mostrar_menu();
printf("> ");
escolha = getchar();
limpar_buffer();
escolha = tolower(escolha);
} while(escolha_valida(escolha) == 0);
} while(processar_escolha(escolha) != 0);
return 0;
}
/*
// Esta função simplismente limpará
// a tela e depois mostrará o menu
// do programa.
*/
void mostrar_menu(void)
{
clrscr();
printf("(a) Abrir semestre\n");
printf("(b) Incluir disciplina\n");
printf("(c) Informar nota ou frequencia\n");
printf("(d) Finalizar semestre\n");
printf("(f) Fechar semestre\n");
printf("(g) Sair do programa\n");
}
/*
// Esta função faz com que o usuário
// escolha uma das opções que estão
// no menu do programa e nada mais.
// Ela retorna 0 se a opção do usuário
// é inválida e 1 caso contrário.
*/
int escolha_valida(char escolha)
{
if((escolha < 'a' || escolha > 'd') && (escolha < 'f' || escolha > 'g')) {
printf("Comando desconhecido\n");
limpar_buffer();
return 0;
}
return 1;
}
/*
// Esta função limpa o buffer do teclado.
// Caso o buffer já esteja limpo, o usuário
// terá que apertar enter para continuar com
// a execução do programa.
*/
void limpar_buffer(void)
{
int c;
while((c = getchar()) != '\n' && c != EOF)
;
}
/*
// Esta função recebe a opção que o usuário
// escolheu (depois que ela passou pelo teste
// de validade) e chama a função que executa
// a tarefa escolhida de acordo. Ela sempre
// retornará 1 a não ser que a opção escolhida
// foi a opção g (sair do programa).
*/
int processar_escolha(char escolha)
{
switch(escolha) {
case 'a':
abrir_semestre();
return 1;
case 'b':
printf("Incluir disciplina");
getchar();
return 1;
case 'c':
printf("Informar nota ou frequencia\n");
getchar();
return 1;
case 'd':
printf("Finalizar semestre\n");
getchar();
return 1;
case 'f':
clrscr();
printf("Fechar semestre\n");
return 1;
default:
return 0;
}
}
/*
// Quando lemos alguma coisa com a função
// fgets(), um \n é adicionado no vetor
// que recebe os caracteres lidos. Se um
// \n não é encontrado, isso significa que
// nem todos os caracteres digitados pelo
// usuário foram adicionados no vetor e
// que existe "sujeira" no buffer do teclado.
// Esta função retira o \n do vetor ou limpa
// o buffer do teclado de acordo com a situação.
*/
void tirar_newline(char linha[])
{
char *ptr;
if((ptr = strchr(linha, '\n')) != NULL)
*ptr = '\0';
else
limpar_buffer();
}
/*
// Esta função recebe a linha que foi lida
// do arquivo do semestre e a adiciona na
// lista encadeada.
*/
void adicionar_linha(char linha[])
{
struct node *novo;
struct node *guia;
novo = (struct node*)malloc(1 * sizeof(*novo));
if(novo == NULL) {
printf("\nmalloc() retornou NULL!\n");
exit(1);
}
novo->proximo = NULL;
strcpy(novo->linha, linha);
if(primeiro == NULL)
primeiro = novo;
else {
guia = primeiro;
while(guia->proximo != NULL)
guia = guia->proximo;
guia->proximo = novo;
}
}
/*
// Esta função simplismente limpa a tela
// utilizando funções da API do Windows.
// Infelizmente ela não funcionará no Linux.
*/
void clrscr(void)
{
HANDLE handle;
COORD coord = {0, 0};
DWORD tamanho_do_console;
CONSOLE_SCREEN_BUFFER_INFO csbi;
handle = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(handle, &csbi);
tamanho_do_console = csbi.dwSize.X * csbi.dwSize.Y;
FillConsoleOutputCharacter(handle, ' ', tamanho_do_console, coord, NULL);
SetConsoleCursorPosition(handle, coord);
}
/*
// Esta função recebe o semestre que o usuário quer abrir.
// Caso o arquivo do semestre já exista, armazenamos todas
// as linhas do arquivo em nossa lista encadeada e depois
// fechamos o arquivo. Caso contrário, só criamos um arquivo
// e logo em seguida o fechamos. Eu podia passar o ponteiro
// que aponta para o arquivo para a função fechar_semestre()
// mas achei melhor fazer com que cada função controle seus
// própios ponteiros para evitar possíveis confusões.
*/
void abrir_semestre(void)
{
char linha[100];
char semestre[7];
FILE *arquivo_do_semestre;
clrscr();
printf("Abrir semestre\n--------------\n");
printf("Semestre: ");
fgets(semestre, sizeof(semestre), stdin);
tirar_newline(semestre);
strcpy(nome_do_arquivo, "sem");
strcat(nome_do_arquivo, semestre);
strcat(nome_do_arquivo, ".txt");
arquivo_do_semestre = fopen(nome_do_arquivo, "r");
if(arquivo_do_semestre == NULL) {
arquivo_do_semestre = fopen(nome_do_arquivo, "w");
if(arquivo_do_semestre == NULL) {
printf("\n%s nao pode ser criado.");
exit(1);
}
fclose(arquivo_do_semestre);
}
else {
while(fgets(linha, sizeof(linha), arquivo_do_semestre) != NULL)
adicionar_linha(linha);
fclose(arquivo_do_semestre);
//fechar_semestre();
}
}
/*void fechar_semestre(void)
{
FILE *arquivo_do_semestre;
/*
// nome_do_arquivo é o vetor de caracteres que
// foi declarado globalmente no início do programa.
/
arquivo_do_semestre = fopen(nome_do_arquivo, "r");*/
The error "is" on line 56