Ir ao conteúdo
  • Cadastre-se

C Programa de Cadastro de Empresas em C


peedroroi
Ir à solução Resolvido por arfneto,

Posts recomendados

Olá, pessoal. Comecei a faculdade de Sistemas recentemente e estou com dúvidas em um exercício.

 

Meu professor pediu para que criássemos um programa onde é possível realizar o cadastro de empresas o qual, além de cadastrá-las, é possível buscar, editar e/ou excluir o cadastro das mesmas futuramente (sem usar ponteiros). Detalhe: a empresa pode ter mais de um endereço. Estou com problemas na parte de salvar e mostrar os "n" endereços que uma empresa pode ter. Poderiam me ajudar com o código? Coloquei comentários onde estou com dúvidas no código. Ficarei muito grato com a ajuda.

 

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

//STRUCT ENDERECO
typedef struct{
    int qnt_endereco;
    char pais_endereco[80];
    char estado_endereco[80];
    char municipio_endereco[80];
    char logradouro_endereco[80];
    int numero_endereco;
    int cep_endereco;
} Endereco; 

//STRUCT CADASTRO
typedef struct{
    //COLOCAR ID DA EMPRESA
    char nome_empresa[80];
    char cnpj_empresa[80];
    char proprietario_empresa[80];
    int funcionarios_empresa;
    Endereco endereco; 
} Cadastro;

//FUNCAO LIMPA
void limpa(){
    printf("\n\n\n");
    system("Pause");
    system("cls");
}

//FUNCAO PARA ENTRADA DE DADOS
void cadastrarEmpresa(Cadastro empresa[], int tam){
    int i;
    for(i=0;i<tam;i++){
    printf("\nInforme o NOME da empresa: ");
    fflush(stdin);
    fgets(empresa[i].nome_empresa,79,stdin);
    fflush (stdin);
    
    printf("\nInforme o CNPJ da empresa: ");
    fflush(stdin);
    fgets(empresa[i].cnpj_empresa,79,stdin);
    fflush (stdin);

    printf("\nInforme o PROPRIETARIO da empresa: ");
    fflush(stdin);
    fgets(empresa[i].proprietario_empresa,79,stdin);
    fflush (stdin);

    printf("\nInforme a QUANTIDADE de funcionarios da empresa: ");
    fflush (stdin);
    scanf("%d%*c", &empresa[i].funcionarios_empresa);
    fflush (stdin);

    //O QUE FAZER PARA SALVAR E MOSTRAR 'N' ENDERECOS?
    
    printf("\nInforme a QUANTIDADE de enderecos da empresa: ");
    scanf("%d%*c", &empresa[i].endereco.qnt_endereco);
    }

    for(i=0;i</*O QUE COLOCO AQUI???empresa[i].endereco.qnt_endereco*/;i++){
    printf("\nInforme o ENDERECO da %d empresa: ",i+1);

    printf("\n\nPais: ");
    fflush(stdin);
    fgets(empresa[i].endereco.pais_endereco,79,stdin);
    fflush (stdin);
    printf("\nEstado: ");
    fflush(stdin);
    fgets(empresa[i].endereco.estado_endereco,79,stdin);
    fflush (stdin);
    printf("\nMunicipio: ");
    fflush(stdin);
    fgets(empresa[i].endereco.municipio_endereco,79,stdin);
    fflush (stdin);
    printf("\nLogradouro: ");
    fflush(stdin);
    fgets(empresa[i].endereco.logradouro_endereco,79,stdin);
    fflush (stdin);
    printf("\nNumero: ");
    fflush(stdin);
    scanf("%d%*c",&empresa[i].endereco.numero_endereco);
    fflush (stdin);
    printf("\nCEP: ");
    fflush(stdin);
    scanf("%d%*c",&empresa[i].endereco.cep_endereco);
    fflush(stdin);
    printf("\n\n");
    }
}


//FUNCAO PARA EXIBIR INFOS DAS EMPRESAS
void imprimirRelatorio(Cadastro empresa[], int tam){
    int i;
    for(i=0;i<tam;i++){
    printf("\n\nRELATORIO INICIAL DA EMPRESA\n");
    printf("\n\nNOME DA EMPRESA: %s", empresa[i].nome_empresa);
    printf("\nCNPJ DA EMPRESA: %s", empresa[i].cnpj_empresa);
    printf("\nPROPRIETARIO: %s", empresa[i].proprietario_empresa);
    printf("\nQUANT DE FUNCIONARIOS: %d", empresa[i].funcionarios_empresa);
    printf("\n\nQUANT DE ENDERECOS: %d",empresa[i].endereco.qnt_endereco);
    }
    //O QUE FAZER PARA MOSTRAR 'N' ENDERECOS?
    for(i=0;i</*O QUE COLOCO AQUI??? empresa[i].endereco.qnt_endereco*/;i++){
    printf("\n\nENDERECO %d: ",i+1);
    printf("\n\nPais: %s", empresa[i].endereco.pais_endereco);
    printf("\nEstado: %s", empresa[i].endereco.estado_endereco);
    printf("\nMunicipio: %s", empresa[i].endereco.municipio_endereco);
    printf("\nLogradouro: %s", empresa[i].endereco.logradouro_endereco);
    printf("\nNumero: %d", empresa[i].endereco.numero_endereco);
    printf("\n\nCEP: %d", empresa[i].endereco.cep_endereco);
    }
    printf("\n");

    //POR QUE EU TENHO QUE USAR DUPLA QUEBRA DE LINHA PRA SEPARAR ALGUNS?
}


int main(void) {

    system("cls");
    setlocale(LC_ALL, "Portuguese_Brazil");

    int i, tam;
    char nome_busca[80];
    int controle = -1;

    printf("Este programa cadastra e imprime informações de N empresas!\n\n");

    printf("Insira o numero de empresas a serem cadastradas: ");
    scanf("%d",&tam);
    
    Cadastro empresa[tam];

    //COMO TRANSFORMAR EM FUNCAO???
    //LIMPEZA DE VETORES
    for(i=0;i<tam;i++){
        strcpy(empresa[i].nome_empresa, "NULL");
        strcpy(empresa[i].cnpj_empresa, "NULL");
        strcpy(empresa[i].proprietario_empresa, "NULL");
        empresa[i].funcionarios_empresa = 0;
        empresa[i].endereco.qnt_endereco = 0;
        strcpy(empresa[i].endereco.pais_endereco, "NULL");
        strcpy(empresa[i].endereco.estado_endereco, "NULL");
        strcpy(empresa[i].endereco.municipio_endereco, "NULL");
        strcpy(empresa[i].endereco.logradouro_endereco, "NULL");
        empresa[i].endereco.numero_endereco = 0;
        empresa[i].endereco.cep_endereco = 0;
    }

    //INVOCO A ENTRADA DE DADOS
    cadastrarEmpresa(empresa, tam);

    //INVOCO A LIMPEZA
    limpa();
    
    //INVOCO O RELATORIO
    imprimirRelatorio(empresa, tam);

    //BUSCA POR NOME OU CNPJ
    printf("\n\nInforme o NOME ou CNPJ da empresa para busca no sistema: ");
    fflush(stdin);
    fgets(nome_busca,79,stdin);
    fflush(stdin);

    //COMO TRANSFORMAR EM FUNCAO???
    //COMPARACAO DE DADOS
    for(i=0;i<tam;i++){
        if(strcmp(empresa[i].nome_empresa,nome_busca) == 0 || strcmp(empresa[i].cnpj_empresa,nome_busca) == 0){
        controle = i;
        }
    }
        
    //IMPRESSAO POS COMPARACAO
    if(controle != -1){
        printf("\n\nRELATORIO FINAL DA EMPRESA");
        printf("\n\nNOME DA EMPRESA: %s", empresa[controle].nome_empresa);
        printf("\nCNPJ DA EMPRESA: %s", empresa[controle].cnpj_empresa);
        printf("\nPROPRIETARIO: %s", empresa[controle].proprietario_empresa);
        printf("\nQUANT DE FUNCIONARIOS: %d", empresa[controle].funcionarios_empresa);
        printf("\nQUANTIDADE DE ENDEREÇOS: %d", empresa[controle].endereco.qnt_endereco);
        printf("\n\nENDERECO");
        printf("\n\nPais: %s", empresa[controle].endereco.pais_endereco);
        printf("\nEstado: %s", empresa[controle].endereco.estado_endereco);
        printf("\nMunicipio: %s", empresa[controle].endereco.municipio_endereco);
        printf("\nLogradouro: %s", empresa[controle].endereco.logradouro_endereco);
        printf("\nNumero: %d", empresa[controle].endereco.numero_endereco);
        printf("\n\nCEP: %d", empresa[controle].endereco.cep_endereco);
        printf("\n");
    }else{
        printf("\n\nA empresa não foi encontrada!\n");
    }

    printf("\n\nObrigado por utilizar o nosso programa!!!\n\n");

    system("Pause");
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

ainda tem muitos problemas em seu programa e vai ter um trabalho a mais se continuar escrevendo programas assim. E muito trabalho para testar.

 

Sobre o Cadastro

//STRUCT CADASTRO
typedef struct{
    //COLOCAR ID DA EMPRESA
    char nome_empresa[80];
    char cnpj_empresa[80];
    char proprietario_empresa[80];
    int funcionarios_empresa;
    Endereco endereco; 
} Cadastro;

 

Notou que esse não é o cadastro? É apenas UMA empresa.

 

Esse é o cadastro:

	Cadastro empresa[tam];

 

E você chamou de empresa.  Não faz sentido. E provavelmente estaria melhor sem repetir "empresa" pra todo lado na struct Cadastro...

 

Note que em C tam deve ser conhecido em tempo de compilação. Não pode declarar isso se declarou

 

	int i, tam;

 

 

a menos que dependa de extensões obscuras da linguagem, um trem chamado de VLA que não é padrão e depois de 50 anos de C não deve passar a ser parte da linguagem

 

Mais algumas coisas que vou copiar de uma lista que tenho, por serem muito comuns:

 

  • Não use system() para nada. Não estará fazendo nada. Não há praticamente nada que possa fazer com system() que não possa fazer em C ou C++. system() foi escrita em C e o sistema quase todo também. E em geral é proibido em empresas e escolas afinal: é um risco grande de segurança. E se tem algo que você não possa inicialmente fazer em C ou C++ talvez não deva mesmo fazer.
  • main() deve ser a primeira função de seu programa. Se possível em um arquivo separado. Há muitas razões para isso, mas em especial vai gostar de começar a ler seus programas e os de outros a partir de main() E a partir do início do texto. Ao mesmo tempo. E ao usar protótipos fica trivial passar as declarações todas para um arquivo .h que é o mais prático afinal.
  • evite retornar void de funções: em geral é um desperdício. E muitas vezes um erro. Use argumentos nas funções, e retorne algo delas. É mais esperto e expressivo.
  • Use alguma ordem em suas funções, como a ordem alfabética por exemplo. Vai gostar disso quando seu programa tiver 50 funções ao invés de umas poucas. Muitos IDE mostram uma lista das funções, em geral na ordem em que foram declaradas, de modo que você pode clicar no nome e o editor vai direto para o código, mas se estiverem em ordem é claro que você só ganha.
  • Não declare mais que uma variável por linha. Não acrescenta nada e só dificulta a leitura. Inicialize todas as variáveis.
  • Nunca leia valores do teclado para alimentar seu programa antes dele estar rodando. Só vai te atrasar e não acrescenta absolutamente nada. Use constantes, use funções que retornam a estrutura preenchida. Leia de arquivos: é trivial em C. Ao terminar os  testes aí sim incorpore a leitura.
  • Use nomes significativos para as variáveis e fuja de coisas como aux, aux1 e aux2. E não use nomes de variáveis enormes porque em uma expressão fica muito difícil de ler.
  • Se seu programa tem um menu, entenda que o menu() deve mostrar as opções e ler e retornar a opção. Um void menu() é um desperdício.
  • scanf() foi escrita para ler entrada formatada. Não use para ler do teclado, que claramente não é entrada formatada. Só vai dar mais trabalho. Muito mais trabalho.
  • Ao usar scanf() ou alguma função da família, como fscanf() entenda que ela retorna um valor. E teste. É ingênuo deixar o programa seguir sem testar. TESTE sempre. Exemplo: para 5 especificadores --- aquelas coisas com % na frente e que não tem um asterisco nem outro '%' --- como "%d %d %f %f %d" scanf() pode ler de 0 a 5 itens ou dar erro e retornar -1. Então teste o retorno que vai estar entre -1 e 5...
  • não use fflush(): isso só está definido para fluxos de saída. Em alguns compiladores pode até funcionar, mas é um sinal de fez algo errado e não sabe como consumir os dados.Não existe "lixo de teclado": necessidades como de flush() na entrada indicam apenas que não entendeu bem o que está lendo e o que é a entrada via teclado, free form: o usuário pode digitar qualquer coisa e é o seu programa que tem que se virar O teclado tem ao menos 105 teclas de liberdade e o usuário pode digitar qualquer coisa em qualquer ordem.
  • Nunca escreva um programa interativo. Não vai aprender nada. Não vai ganhar nada. Escreva e teste todas as funções. DEPOIS de tudo testado coloque a parte interativa. isso inclui claro o eventual menu. Um programa interativo é chato para testar. Durante o desenvolvimento ninguém quer interagir com o programa. Nunca escreva um programa interativo, mesmo que seja o objetivo final.
  • evite ler do teclado a menos que seja o objetivo do problema. Ler de arquivos é muito mais simples, seguro e fácil de reproduzir. Não há razão para ficar parado em frente a tela minutos inventando nomes de campos e coisas assim: o efeito é que vai acabar não testando direito porque é difícil controlar e repetir testes.
  • Não misture entrada de dados ou formatação com a apresentação dos dados ou a lógica do programa, Isso é um desastre para manutenção e desenvolvimento
  • Um printf() de 6 linhas é muito, mas muito melhor que 6 printf() de 1 linha. E se só vai mostrar o texto puts() é ainda melhor e dezenas de vezes mais rápido que uma série de printf().
  • evite comentários óbvios como esse:
8 horas atrás, peedroroi disse:
//FUNCAO LIMPA
void limpa(){

 Comente o que está fazendo, o porque das coisas.

 

Sobre algumas das suas questões:

 

9 horas atrás, peedroroi disse:

é possível buscar, editar e/ou excluir o cadastro das mesmas futuramente (sem usar ponteiros).

 

Não existe "C sem ponteiros".   Todo vetor é descrito como base e deslocamento. Se declarou Empresa[200] então Empresa é um ponteiro para o início do vetor. E o índice na hora de acessar vai dar o deslocamento a partir do tal início:
 

	Cadastro empresa[200];


é a mesma coisa que somar ao ponteiro empresa 42 vezes o tamanho da struct Cadastro e assim descobrir o endereço dessa particular empresa...

 

9 horas atrás, peedroroi disse:

Detalhe: a empresa pode ter mais de um endereço. Estou com problemas na parte de salvar e mostrar os "n" endereços que uma empresa pode ter

 

O trivial é um campo na estrutura Empresa com o total de endereços. Na versão que postou tem o total de funcionários mas não tem nenhum. E pode ter vários endereços mas não tem o número e só tem lugar para um.  Por outro lado:

 

// STRUCT ENDERECO
typedef struct
{
    int  qnt_endereco;
    char pais_endereco[80];
    char estado_endereco[80];
    char municipio_endereco[80];
    char logradouro_endereco[80];
    int  numero_endereco;
    int  cep_endereco;
} Endereco;

 

Pois é: qnt_endereco está na estrutura errada. E não precisa repetir _endereco toda hora. É muito pior assim. A struct é endereço e vai usar o prefixo. Fica muito ruim de ler e escrever:

 

	Endereco endereco;
	endereco.numero_endereco = 42;

 

Acha mesmo que precisa repetir? E para que o comentário com o mesmo texto?

 

// STRUCT ENDERECO
typedef struct
{
} Endereco;

 

Já dava para imaginar que o typedef era de uma struct endereco.

 

Escreva em torno dos dados.

 

9 horas atrás, peedroroi disse:
Cadastro empresa[tam];

    //COMO TRANSFORMAR EM FUNCAO???
    //LIMPEZA DE VETORES
    for(i=0;i<tam;i++){

 

O simples é passar o Cadastro para a função como argumento e retornar um status

 

9 horas atrás, peedroroi disse:
//COMO TRANSFORMAR EM FUNCAO???
    //LIMPEZA DE VETORES
    for(i=0;i<tam;i++){
        strcpy(empresa[i].nome_empresa, "NULL");
        strcpy(empresa[i].cnpj_empresa, "NULL");
        strcpy(empresa[i].proprietario_empresa, "NULL");

 

Está certo de que escrever "NULL" é o que precisa? Não seria mais simples usar NULL, a constante? E aí poderia zerar tudo em uma linha:

 

	Cadastro empresa[20] = {0};

 

Na declaração. Ou depois usando memset()

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

15 horas atrás, peedroroi disse:

(sem usar ponteiros)

Olá! Suponho que, vosso professor filosofou e durante sua aula discriminou 'Array' x 'Pointers'.

E daí,

15 horas atrás, peedroroi disse:
void cadastrarEmpresa(Cadastro empresa[], int tam)

Apesar dos operadores de array, o parâmetro empresa não é um; tem-se a ilusão de array, mas será somente seu ponteiro — 🙂

Sendo didático, sugiro a revisão da discussão, porque se essa exceção passou, então passou ponteiro.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@arfneto Muito obrigado por tirar um tempo e responder minhas dúvidas. Até agora, tive menos de um mês em contato com a linguagem C. Sobre "ponteiros", @mauro_b e @arfneto, o professor quer que aprendamos primeiro como fazer com arrays para depois introduzir uma maneira mais fácil, no caso os pointers. Nos foi recomendado usar o system("cls") para limpar a tela e o system("Pause") é para o prompt não fechar ao final do teste do programa. Se tiverem mais alguma dica ou consideração, gostaria que me mostrassem de maneira mais ilustrativa, mostrando como a parte do código deveria ser escrita e comparando com o que escrevi previamente. De qualquer forma, irei fazer modificações no código atual. Estou iniciando, mas me esforçarei ao máximo. Mais uma vez, obrigado. 😀

Link para o comentário
Compartilhar em outros sites

49 minutos atrás, peedroroi disse:

o professor quer que aprendamos primeiro como fazer com arrays para depois introduzir uma maneira mais fácil, no caso os pointers

 

Não tem sentido algum. Como eu expliquei, um array é isso: base e deslocamento como escrevi acima. A base é um endereço. Pode chamar de ponteiro, de Claudia, Jose Victor, endereço inicial, o que seja. Mas é um ponteiro. Não existe maneira mais fácil. E se existisse seria essa de array e por isso aprende antes.

 

10 horas atrás, arfneto disse:

Não existe "C sem ponteiros".   Todo vetor é descrito como base e deslocamento. Se declarou Empresa[200] então Empresa é um ponteiro para o início do vetor. E o índice na hora de acessar vai dar o deslocamento a partir do tal início:
 

	Cadastro empresa[200];


é a mesma coisa que somar ao ponteiro empresa 42 vezes o tamanho da struct Cadastro e assim descobrir o endereço dessa particular empresa...

 

empresa[42] é a mesma coisa que *(empresa+42). Isso é C, desde os anos 70. E empresa é um ponteiro.

 

54 minutos atrás, peedroroi disse:

Nos foi recomendado usar o system("cls") para limpar a tela e o system("Pause") é para o prompt não fechar ao final do teste do programa

 

Uma pena que alguém recomende isso... Nunca fiz um curso de C mas acho uma pena os caras terem coragem de recomendar isso.

 

Imagine rodar o programa e ele ficar parado no fim.... Tosco. Imagine isso num script para rodar todos os programas dos alunos e o script parar no primeiro, no segundo e afinal em todos eles.

 

Isso é uma bobagem e parte do princípio que programas são escritos para rodar em IDE e que os alunos não sabem que se o IDE não for medíocre tem uma opção para não fechar a janela ao final do teste.

 

Programas não são escritos para rodar em IDE. Espero que ensinem isso.

 

57 minutos atrás, peedroroi disse:

Se tiverem mais alguma dica ou consideração, gostaria que me mostrassem de maneira mais ilustrativa, mostrando como a parte do código deveria ser escrita e comparando com o que escrevi previamente

 

Entendeu os problemas que eu listei, @pedroroi ? Nada perguntou sobre isso.

Link para o comentário
Compartilhar em outros sites

12 horas atrás, peedroroi disse:

o professor quer que aprendamos primeiro como fazer com arrays para depois introduzir uma maneira mais fácil, no caso os pointers.

Olá! Entendo os dois (você e vosso professor). Suponho que, apesar de um 'pointer', empresa[] é efetivamente 'array' porque terá o endereço de um; e sua sintaxe.

E daí,

Em 08/08/2023 às 01:43, peedroroi disse:

Estou com problemas na parte de salvar e mostrar os "n" endereços que uma empresa pode ter

Em 'arrays', declara-se tudo, inclusive o "n" - sua composição; sendo "N"-máximo independente do usuário com declaração no programa pelo programador - N sendo constante, porque, proíbe-se composição de 'array' (tamanho) sobre incógnita (x, n... qualquer variável não definida) e dizem que 'arrays' são quase sempre definidos durante a montagem do programa:    

Em 08/08/2023 às 01:43, peedroroi disse:

Detalhe: a empresa pode ter mais de um endereço

A turma talvez concordará que no máximo 10 endereços por empresa já serve para essa constante — 🙂 

Assim,

Em 08/08/2023 às 01:43, peedroroi disse:
for(i=0;i</*O QUE COLOCO AQUI??? empresa[i].endereco.qnt_endereco*/;i++)

o máximo de endereços por empresa. Depois de um cadastro, existirá entre eles empresas com endereços preenchidos e não, sem definição de número. Mas, como determina os endereço a cada empresa com/sem preenchimento e excluído?

— Com lógica.

  • Amei 1
Link para o comentário
Compartilhar em outros sites

@arfneto, vou responder um por um. Desculpe se alguma pergunta for leiga. Realmente estou no início.
 

Em 08/08/2023 às 09:19, arfneto disse:

Não use system() para nada. Não estará fazendo nada. Não há praticamente nada que possa fazer com system() que não possa fazer em C ou C++. system() foi escrita em C e o sistema quase todo também. E em geral é proibido em empresas e escolas afinal: é um risco grande de segurança. E se tem algo que você não possa inicialmente fazer em C ou C++ talvez não deva mesmo fazer.

  • Como dito anteriormente, nos foi recomendado usar o system("cls") para limpar a tela (limpar tudo que aconteceu até aquele ponto para a tela não ficar poluída) e o system("Pause") é para que o Prompt de Comando não feche ao final do teste do programa e consigamos ler tudo que foi escrito/respondido.
Em 08/08/2023 às 09:19, arfneto disse:

main() deve ser a primeira função de seu programa. Se possível em um arquivo separado. Há muitas razões para isso, mas em especial vai gostar de começar a ler seus programas e os de outros a partir de main() E a partir do início do texto. Ao mesmo tempo. E ao usar protótipos fica trivial passar as declarações todas para um arquivo .h que é o mais prático afinal.

  • Perfeito. Usei sua recomendação e gostei. Sobre o uso de arquivos, sinceramente não sei como fazer isso.
Em 08/08/2023 às 09:19, arfneto disse:

evite retornar void de funções: em geral é um desperdício. E muitas vezes um erro. Use argumentos nas funções, e retorne algo delas. É mais esperto e expressivo.

  • Por que desperdício ou erro? Me explique por, favor. Me dê um exemplo usando o código onde eu retornaria algo (transformando função void em return). Exemplo: o que exatamente eu retornaria e como usaria esse retorno; qual a vantagem no caso específico).
Em 08/08/2023 às 09:19, arfneto disse:

Nunca leia valores do teclado para alimentar seu programa antes dele estar rodando. Só vai te atrasar e não acrescenta absolutamente nada. Use constantes, use funções que retornam a estrutura preenchida. Leia de arquivos: é trivial em C. Ao terminar os  testes aí sim incorpore a leitura.

  • Perdão. Não entendi muito bem essa parte. No caso, o ideal seria eu usar um arquivos com respostas pré-estabelecidas ao invés de eu digitar manualmente. É isso? Se sim, como eu faria isso?
Em 08/08/2023 às 09:19, arfneto disse:

Está certo de que escrever "NULL" é o que precisa? Não seria mais simples usar NULL, a constante? E aí poderia zerar tudo em uma linha:

 

  • Poderia me explicar o que constantes e como funcionam dentro do código?
Em 08/08/2023 às 09:19, arfneto disse:

Se seu programa tem um menu, entenda que o menu() deve mostrar as opções e ler e retornar a opção. Um void menu() é um desperdício.

  • Ainda não tem, mas vou colocar no futuro. Então, ao invés de uma função void para o menu, faria uma função com retorno?
Em 08/08/2023 às 09:19, arfneto disse:

não use fflush(): isso só está definido para fluxos de saída. Em alguns compiladores pode até funcionar, mas é um sinal de fez algo errado e não sabe como consumir os dados.Não existe "lixo de teclado": necessidades como de flush() na entrada indicam apenas que não entendeu bem o que está lendo e o que é a entrada via teclado, free form: o usuário pode digitar qualquer coisa e é o seu programa que tem que se virar O teclado tem ao menos 105 teclas de liberdade e o usuário pode digitar qualquer coisa em qualquer ordem.

  • Quando você diz fluxo de saída está se referindo aos "printf"?
Em 08/08/2023 às 09:19, arfneto disse:

evite ler do teclado a menos que seja o objetivo do problema. Ler de arquivos é muito mais simples, seguro e fácil de reproduzir. Não há razão para ficar parado em frente a tela minutos inventando nomes de campos e coisas assim: o efeito é que vai acabar não testando direito porque é difícil controlar e repetir testes.

  • Sobre o uso de arquivos, sinceramente não sei como fazer isso. Poderia me ensinar ou passar alguma referência?

Obrigado por tirar um tempo e me responder.

Aqui está o código novo (No momento, está armazenando e mostrando apenas um endereço por empresa). Gostaria que apontassem quais mudanças específicas preciso fazer para armazenar e depois exibir os "n" endereços de cada empresa.

 

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

typedef struct{
    char pais[80];
    char estado[80];
    char municipio[80];
    char logradouro[80];
    int numero;
    int cep;
} Endereco; 

typedef struct{
    int id;
    char nome[80];
    char cnpj[80];
    char proprietario[80];
    int funcionarios;
    int qtd_endereco;
    Endereco endereco; 
} Empresa;

//DECLARACAO DAS FUNCOES QUE estão ABAIXO DA MAIN
void limpar();
void limpezaDados(int tam, Empresa cadastro[]);
void cadastrarEmpresa(int tam, Empresa cadastro[]);
void imprimirRelatorio(int tam, Empresa cadastro[]);
void buscaCompara(int tam, Empresa cadastro[]);

//INICIO DA MAIN
int main(void) {

    system("clear");
    setlocale(LC_ALL, "Portuguese_Brazil");

    int tam;

    printf("Este programa cadastra e imprime informações de N empresas!\n\n");

    printf("Insira o numero de empresas a serem cadastradas: ");
    scanf("%d",&tam);
    
    //LOCAL ONDE SÃO ARMAZENADOS OS DADOS
    Empresa cadastro[tam];

    //INVOCO A LIMPEZA DE DADOS
    limpezaDados(tam, cadastro);

    //INVOCO A ENTRADA DE DADOS
    cadastrarEmpresa(tam, cadastro);
    
    //INVOCO O RELATORIO INICIAL
    imprimirRelatorio(tam, cadastro);

    //INVOCO A FUNCAO QUE BUSCA POR NOME OU CNPJ E EXIBE RELATORIO FINAL
    buscaCompara(tam, cadastro);

    printf("\n\nObrigado por utilizar o nosso programa!!!\n\n");

    system("Pause");
    return 0;
}

//FUNCAO P/ LIMPAR A TELA
void limpar(){
    printf("\n\n\n");
    system("clear");
    printf("\n\n\n");
}

//FUNCAO PARA LIMPEZA DE DADOS NAS ARRAYS
void limpezaDados(int tam, Empresa cadastro[]){
    int i;
    for(i=0;i<tam;i++){
        strcpy(cadastro[i].nome, "NULL");
        strcpy(cadastro[i].cnpj, "NULL");
        strcpy(cadastro[i].proprietario, "NULL");
        cadastro[i].funcionarios = 0;
        cadastro[i].qtd_endereco = 0;
        strcpy(cadastro[i].endereco.pais, "NULL");
        strcpy(cadastro[i].endereco.estado, "NULL");
        strcpy(cadastro[i].endereco.municipio, "NULL");
        strcpy(cadastro[i].endereco.logradouro, "NULL");
        cadastro[i].endereco.numero = 0;
        cadastro[i].endereco.cep = 0;
    }
}

//FUNCAO PARA ENTRADA DE DADOS
void cadastrarEmpresa(int tam, Empresa cadastro[]){
    int i;
    for(i=0;i<tam;i++){
    printf("\n\nCADASTRO DA EMPRESA %d\n",i+1);

    printf("\nInforme o ID da empresa: ");
    scanf("%d%*c", &cadastro[i].id);

    printf("\nInforme o NOME da empresa: ");
    fgets(cadastro[i].nome,79,stdin);
    
    printf("\nInforme o CNPJ da empresa: ");
    fgets(cadastro[i].cnpj,79,stdin);

    printf("\nInforme o PROPRIETARIO da empresa: ");
    fgets(cadastro[i].proprietario,79,stdin);

    printf("\nInforme a QUANTIDADE de funcionarios da empresa: ");
    scanf("%d%*c", &cadastro[i].funcionarios);
    
    printf("\nInforme a QUANTIDADE de enderecos da empresa: ");
    scanf("%d%*c", &cadastro[i].qtd_endereco);

    //USO OUTRO FOR PARA MOSTRAR OS "N" ENDEREÇOS? E COMO SERIA ESSE FOR?
    printf("\nInforme o ENDERECO da empresa: ");

    printf("\n\nPais: ");
    fgets(cadastro[i].endereco.pais,79,stdin);

    printf("\nEstado: ");
    fgets(cadastro[i].endereco.estado,79,stdin);

    printf("\nMunicipio: ");
    fgets(cadastro[i].endereco.municipio,79,stdin);


    printf("\nLogradouro: ");
    fgets(cadastro[i].endereco.logradouro,79,stdin);

    printf("\nNumero: ");
    scanf("%d%*c",&cadastro[i].endereco.numero);

    printf("\nCEP: ");
    scanf("%d%*c",&cadastro[i].endereco.cep);
    
    printf("\n\n");
    }
}

//FUNCAO PARA EXIBIR INFOS DAS EMPRESAS
//POR QUE EU TENHO QUE USAR DUPLA QUEBRA DE LINHA PRA SEPARAR ALGUNS?
void imprimirRelatorio(int tam, Empresa cadastro[]){
    int i;
    for(i=0;i<tam;i++){
    printf("\n\nRELATORIO INICIAL DA EMPRESA");
    printf("\n================================\n");
    printf("\nID DA EMPRESA: %d", cadastro[i].id);
    printf("\n\nNOME DA EMPRESA: %s", cadastro[i].nome);
    printf("\nCNPJ DA EMPRESA: %s", cadastro[i].cnpj);
    printf("\nPROPRIETARIO: %s", cadastro[i].proprietario);
    printf("\nQUANT DE FUNCIONARIOS: %d", cadastro[i].funcionarios);
    printf("\n\nQUANT DE ENDERECOS: %d",cadastro[i].qtd_endereco);
    //O QUE FAZER PARA MOSTRAR 'N' ENDERECOS? USO OUTRO FOR? E COMO SERIA ESSE FOR?
    printf("\n\n\nENDERECO DA EMPRESA: ");
    printf("\n\nPais: %s", cadastro[i].endereco.pais);
    printf("\nEstado: %s", cadastro[i].endereco.estado);
    printf("\nMunicipio: %s", cadastro[i].endereco.municipio);
    printf("\nLogradouro: %s", cadastro[i].endereco.logradouro);
    printf("\nNumero: %d", cadastro[i].endereco.numero);
    printf("\n\nCEP: %d", cadastro[i].endereco.cep);
    }
    printf("\n");


}

//FUNCAO PARA BUSCAR E COMPARAR
void buscaCompara(int tam, Empresa cadastro[]){
    char nome_busca[80];
    int i;
    int controle = -1;
    printf("\n\nInforme o NOME ou CNPJ da empresa para busca no sistema: ");
    fgets(nome_busca,79,stdin);
    fflush(stdin);

    for(i=0;i<tam;i++){
        if(strcmp(cadastro[i].nome,nome_busca) == 0 || strcmp(cadastro[i].cnpj,nome_busca) == 0){
        controle = i;
        }
    }
    if(controle != -1){
        printf("\n\nRELATORIO FINAL DA EMPRESA");
        printf("\n================================\n");
        printf("\nID DA EMPRESA: %d", cadastro[controle].id);
        printf("\n\nNOME DA EMPRESA: %s", cadastro[controle].nome);
        printf("\nCNPJ DA EMPRESA: %s", cadastro[controle].cnpj);
        printf("\nPROPRIETARIO: %s", cadastro[controle].proprietario);
        printf("\nQUANT DE FUNCIONARIOS: %d", cadastro[controle].funcionarios);
        printf("\n\nQUANTIDADE DE ENDEREÇOS: %d", cadastro[controle].qtd_endereco);
        fflush(stdin);
        //O QUE FAZER PARA MOSTRAR 'N' ENDERECOS? USO OUTRO FOR? E COMO SERIA ESSE FOR?
        printf("\n\nENDERECO");
        printf("\n\nPais: %s", cadastro[controle].endereco.pais);
        printf("\nEstado: %s", cadastro[controle].endereco.estado);
        printf("\nMunicipio: %s", cadastro[controle].endereco.municipio);
        printf("\nLogradouro: %s", cadastro[controle].endereco.logradouro);
        printf("\nNumero: %d", cadastro[controle].endereco.numero);
        printf("\n\nCEP: %d", cadastro[controle].endereco.cep);
        printf("\n");
    }else{
        printf("\n\nA empresa não foi encontrada!\n");
    }
}

 

1 hora atrás, mauro_b disse:
for(i=0;i</*O QUE COLOCO AQUI??? empresa[i].endereco.qnt_endereco*/;i++)

Então, bastava eu colocar o número "10" (no caso, o máximo de endereços) no ligar do "i"? Mandei o código novamente aqui na discussão. Dá uma olhada, se puder, por favor. 😀

Link para o comentário
Compartilhar em outros sites

  • Solução
1 hora atrás, peedroroi disse:
   //LOCAL ONDE SÃO ARMAZENADOS OS DADOS
    Empresa cadastro[tam];

 

Ainda no tópico #3 te disse que não pode escrever assim. Esse valor tam deve ser conhecido em tempo de compilação. Não pode ser um valor lido na hora em que o programa está rodando porque o compilador precisa reservar essa área ao gerar o código.

 

Se precisa criar na hora deve alocar a memória necessária usando malloc() de stdlib.h. Existe uma extensão para C que admite isso, um troço chamado VLA, mas nunca foi adiante e não irá agora, depois de 50 anos.

  

    // 200, fixo
    Empresa cadastro[200];
    // variavel, tam
    Empresa* cad = malloc(tam* sizeof(Empresa));

 

Assim é.

 

Da minha lista de problemas comuns:

  • não use comentários com acentos. Podem não sair na tela em algumas maquinas ou pode sair tudo errado na tela ou na eventual impressão.
  • evite comentários óbvios como
// FUNCAO P/ LIMPAR A TELA
void limpar()
{
    printf("\n\n\n");
    system("clear");
    printf("\n\n\n");
}

 

Ainda sobre essa função, qual o propósito de escrever 3 linhas em branco, que ninguém vai ver, e depois limpar a tela?

 

Veja esse comentário em seu programa:

 

// INICIO DA MAIN
	int main(void)

 

Acha que acrescentou algo dizer que ali é o ínicio da função?

 

Sobre system: é apenas uma função que pega uma string, um texto, e tenta rodar usando o interpretador de comandos do sistema. É proibida em toda parte, escolas e empresas. Como te disse, não vai aprender nada com isso. E system foi escrita em C. O sistema foi escrito em C. E deve imaginar que tem uma função para limpar a tela, em C, para o seu sistema operacional.

 

Sobre pause: é uma coisa simples: você roda um programa para fazer algo e terminar. Não para fazer algo e ficar esperando um infeliz ficar em frente a tela para teclar ENTER depois que o programa fizer o que se espera que ele faça.

 

EXEMPLO: 

 

Você escreveu o programa soma.exe para rodar no windows. Você usa assim: 

 

C:\Clube do Hardware>soma 42 17
        42 + 17 = 59
      
C:\Clube do Hardware>soma 1700 4200
        1700 + 4200 = 5900

 

E está ok. Mas se você fizer como "recomendado" e usar um pause imagine o que vai acontecer:

 

C:]Clube do Hardware>soma 3 4
        3 + 4 = 7
Press any key to continue . . .

C:\Clube do Hardware>soma 5 6
        5 + 6 = 11
Press any key to continue . . .

 

E você tem que digitar um ENTER. Ou chamar alguém pra ficar lá esperando. Mas imagine que você tenha uma lista de programas

 

soma 2 3 
soma 17 42
soma 2300 1
soma 0 0

 

Então você poderia por num arquivo e rodar todos de uma vez e esperar pelo resultado... basta digitar por exemplo .

 

soma 2 3 & soma 17 42 & soma 2300 1 & soma 0 0

 

SEM o infeliz PAUSE:

 

O sistema sabe que é pra rodar os programas um depois do outro e pronto

 

C:\Clube do Hardware>soma 2 3 & soma 17 42 & soma 2300 1 & soma 0 0
        2 + 3 = 5
        17 + 42 = 59
        2300 + 1 = 2301
        0 + 0 = 0

 

Mas se fizer o recomendado....
 

C:\Clube do Hardware>soma 2 3 & soma 3 4
        2 + 3 = 5
Press any key to continue . . .

 

Genial., Tem que  teclar ENTER para rodar a próxima soma. Tem que ter alguém lá em frente ao teclado. Tosco. Não se escrevem programas para isso.

 

Sobre void: Retornar void é ingênuo. Veja sua função

 

	void cadastrarEmpresa(int tam, Empresa cadastro[])...

 

 

O que se quer aqui? Simples: inserir uma empresa em um cadastro. Só que não é o que está escrito.

 

Considere a alternativa
 

int cadastrar(Empresa emp, Cadastro cad) { return 0; };

 

Você quer cadastrar uma empresa em um cadastro de empresas. Então você passa pra função uma empresa e um cadastro. E a função faz o serviço dela. Retorna 0 se deu certo, retorna -1, -2 ou qualquer coisa negativa para o caso de erro. Não acha mais esperto? Novidade não é. Sempre é feito assim.

 

Sobre ler dados do teclado

 

Entenda que seu programa tem um monte de funções e tem um monte de coisas pra testar. Não é nada esperto ficar digitando coisas a cada teste. 

 

Sua empresa tem 6 campos. Um deles é o endereço e pode ter mais de um por empresa. Se for testar o programa com 3 empresas vai ter que digitar 18 campos. Só que endereco tem 6 campos também. Se usar 2 enderecos por empresa para 5 empresas imagina quanto tempo vai demorar cada simples teste que for fazer? 

 

E você está aprendendo então é boa a chance do programa cancelar na sua cara logo depois de ficar 5 minutos inventando dados.

 

sobre "NULL"

 

NULL é um texto, um valor objetivo. NULL é o que se usa quando não tem nada no campo.

 

Se você escrever 

 

	Empresa cadastro[20] = {0};

 

por exemplo, o sistema vai colocar esse valor em cada lugar do vetor inteiro.

 

Sobre constantes e inicialização

 

typedef struct
{
    char pais[80];
    char estado[80];
    char municipio[80];
    char logradouro[80];
    int  numero;
    int  cep;
} Endereco;

 

Pois é. Então pode usar

 

    Endereco teste = {
        .cep        = 222,
        .estado     = "SP",
        .logradouro = "Av. Antiga",
        .municipio  = "Vila Nova",
        .numero     = 42,
        .pais       = "Terra Nova"};

 

E colocar valores na estrutura toda.

 

Sobre um menu

 

Imagine essa função:

 

	int menu1();

 

Ela mostra um menu e retorna o valor da opção que o cara escolheu. Não é conveniente????

 

Sobre fflush

 

fflush só está definido para saída. Não está no padrão fflush da entrada como está fazendo. Isso não existe exceto em um ou outro compilador e não é certo que vá funcionar. 

 

Sobre o uso de arquivos

 

Em C é trivial criar arquivos. Essa linguagem foi criada para ajudar a escrever um sistema, o Unix, que virou Linux, MacOS, Android e outros nessas décadas todas. No Unix tudo é arquivo então dá pra imaginar que é fácil usar arquivos em C.

 

EXEMPLO

 

int cria_arquivo(const char* nome, const char* texto)
{
    FILE* arq = fopen(nome, "w");
    if (arq == NULL) return -1;
    fprintf(arq, "arquivo: \"%s\"\n", nome);
    for (int i = 0; i < 5; i += 1)
        fprintf(arq,"%06d    \"%20s\"\n", 1 + i, texto);
    fclose(arq);
    return 0;
}

 

Essa função trivial chamada assim

 

    cria_arquivo("teste.txt", "valor");

 

cria o arquivo teste.txt com isso dentro

 

arquivo: "teste.txt"
000001    "               valor"
000002    "               valor"
000003    "               valor"
000004    "               valor"
000005    "               valor"

 

Nada mais

 

Sobre o código postado

 

Pouco corrigiu dos problemas que apontei. Uso incorreto de scanf, printf, fflush e tal. Sugiro ir refinando o programa conforme aprende.

 

typedef struct
{
    char pais[80];
    char estado[80];
    char municipio[80];
    char logradouro[80];
    int  numero;
    int  cep;
} Endereco;

typedef struct
{
    int      id;
    char     nome[80];
    char     cnpj[80];
    char     proprietario[80];
    int      funcionarios;
    int      qtd_endereco;
    Endereco endereco;
} Empresa;

 

Criou um campo qtd_endereco mas só tem lugar pra 1. Que diferença faz? E os outros?

 

Pra que 80 bytes num cnpj? Porque cep é int? vai somar? Porque estado tem 80? Seu compilador não reclamou pelo tamanho da pilha porque declarou errado o vetor.

 

A noção de container

 

Todos esses programas de iniciantes giram em torno da noção de container, coleção, algum tipo de cadastro. Se usar isso desde o início sua vida vai ficar muito mais simples

 

Escreva em torno dos dados

 

Cade o cadastro? Porque não tem essa estrutura em seu programa? Acha que basta um vetor??

 

Não basta. Só dá muito mais trabalho se ficar só com o vetorzinho. Considere uma alternativa bobinha:

 

typedef struct
{
    unsigned tam;  // tamanho
    unsigned lim;  // limite
    Empresa  emp[20];
  
}   Cadastro;

 

Não fica claro que o limite é 20 e que  se colocar tam = 0 a estrutura fica marcada como vazia? Não é mais simples?

 

E a mesma coisa não serviria para os endereços, já que seria um outro container, a mesma coisa? Algo assim não ajudaria:

 

typedef struct
{
    unsigned tam;  // tamanho
    unsigned lim;  // limite
    Endereco end[5];
} Enderecos;

 

Sim,  a mesma coisa.

 

Como usar? Trivial: basta colocar isso em cada empresa

 

typedef struct
{
    int      id;
    char     nome[80];
    char     cnpj[15];
    char     proprietario[80];
    int      funcionarios;
    Enderecos end;
} Empresa;

 

E claro que não precisa mais da quantidade de endereços em Empresa porque a estrutura já tem seu contador DENTRO.

 

Veja como pode ser simples:

 

int limpar_cadastro(Cadastro* cad,unsigned tam)
{ 
    if ( cad == NULL ) return -1; 
    cad->lim = tam;
    cad->tam = 0; // vazio
    return 0;
}

 

O que importa é começar logo a testar o programa. Precisa de uma empresa? Um cadastro? Um endereco? Use C, use o computador.

 

int cadastra(Empresa emp, Cadastro* cad)
{
    if (cad == NULL) return -1;
    if (cad->tam >= cad->lim) return -2;  // não cabe
    cad->emp[cad->tam] = emp;             // copia a empresa
    cad->tam += 1;                        // conta essa
    return 0;
}

 

cadastrar uma empresa pode ser só isso. Se voltou zero está ok.

 

Veja a saida de um exemplo

 

Cadastro tem 4 [de 20] empresas

    Amazonia (CNPJ:123.456.78-45)
    Amazon (CNPJ:123.456.78-03)
    Google (CNPJ:123.456.78-02)
    Microsoft (CNPJ:123.456.78-04)

 

Só digitando os dados. Sem entrada, sem pausa, sem esperar. Em 5 minutos estamos testando e já rodou da primeira vez

 

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

typedef struct
{
    char pais[80];
    char estado[3];
    char municipio[80];
    char logradouro[80];
    int  numero;
    char cep[10];  // 01234-012
} Endereco;

typedef struct
{
    unsigned tam;  // tamanho
    unsigned lim;  // limite
    Endereco end[5];
} Enderecos;

typedef struct
{
    int       id;
    char      nome[80];
    char      cnpj[15];
    char      proprietario[80];
    int       funcionarios;
    Enderecos end;
} Empresa;

typedef struct
{
    unsigned tam;      // tamanho
    unsigned lim;      // limite
    Empresa  emp[20];  // max 20
} Cadastro;

int limpar_cadastro(Cadastro*);
int cadastra(Empresa, Cadastro*);
int lista(Cadastro*);

int cria_arquivo(const char*, const char*);

int main(void)
{
    Endereco teste = {
        .cep        = "123450678",
        .estado     = "TN",
        .logradouro = "Rua Antiga",
        .municipio  = "Vila Nova",
        .numero     = 42,
        .pais       = "Terra Nova"};

    Empresa emp_1 = {
        .cnpj = "123.456.78-45", .nome = "Amazonia"};

    int      res = 0;
    Cadastro um;
    limpar_cadastro(&um, 20);
    // cadastra umas empresas
    res = cadastra(emp_1, &um);
    res = cadastra(
        (Empresa){
            .cnpj = "123.456.78-03", .nome = "Amazon"},
        &um);
    res = cadastra(
        (Empresa){
            .cnpj = "123.456.78-02", .nome = "Google"},
        &um);
    res = cadastra(
        (Empresa){
            .cnpj = "123.456.78-04", .nome = "Microsoft"},
        &um);
    // lista
    lista(&um);
    return 0;
}

// https://www.clubedohardware.com.br/forums/topic/1654426-programa-de-cadastro-de-empresas-em-c/#comment-8620688

int cadastra(Empresa emp, Cadastro* cad)
{
    if (cad == NULL) return -1;
    if (cad->tam >= cad->lim) return -2;  // não cabe
    cad->emp[cad->tam] = emp;             // copia a empresa
    cad->tam += 1;                        // conta essa
    return 0;
}

int lista(Cadastro* cad)
{
    printf(
        "Cadastro tem %u [de %u] empresas\n\n", cad->tam,
        cad->lim);
    for (int i = 0; i < cad->tam; i += 1)
    {
        printf(
            "    %s (CNPJ:%s)\n", cad->emp[i].nome,
            cad->emp[i].cnpj);
    }
    printf("\n");
    return 0;
}

int limpar_cadastro(Cadastro* cad, unsigned tam)
{
    if (cad == NULL) return -1;
    cad->lim = tam;
    cad->tam = 0;  // vazio
    return 0;
}

int cria_arquivo(const char* nome, const char* texto)
{
    FILE* arq = fopen(nome, "w");
    if (arq == NULL) return -1;
    fprintf(arq, "arquivo: \"%s\"\n", nome);
    for (int i = 0; i < 5; i += 1)
        fprintf(arq, "%06d    \"%20s\"\n", 1 + i, texto);
    fclose(arq);
    return 0;
}

 

Agora pode inserir os enderecos e continuar testando, mas o que importa é entender como deve escrever em torno dos dados. E NUNCA escrever um programa interativo.

  • Amei 1
Link para o comentário
Compartilhar em outros sites

O ideal seria usar o banco de dados para alimentar informação assim, e uma entrada de cadastro precisa de um formulário, certo?

Eu imagino que a ideia, no curso que o Pedro está fazendo, seria introduzir o conceito do cadastro pra depois aprender a fazer em um formulário, já que as ideias são as mesmas. Assim, o sistema vai ler o que está em cada campo para depois registrar e guardar em um banco de dados.

Acho que é essa a ideia de fazer um programa em command line interativo.

É necessário um programa que leia os dados inseridos pelo usuário. Mas eu acho que para alguém com um mês de C, o programa apresentado é digno de um 10.

Se está lendo um endereço já está bom.

O que você pode fazer é deixar todos os limites pré-programados, assim fica fácil colocar tudo em um for. Li também no livro do Bjarne Stroustrup que usar System é uma péssima ideia, e ele é o criador do C++.

Você pode unir os printf's em um só. Se colocar na ordem em que aparecem as variáveis eu acho que funciona. Usar a struct da forma que o arfneto falou, assim fica mais limpo o código também.

Não acho que seja esperado dos alunos saber usar estrutura de dados com um mês de curso. Só fecha o programa pra ele rodar e acho que está bom o seu programa inicial.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!