Ir ao conteúdo
  • Cadastre-se

C Como organizar esse programa em C ?


Eli Almeida

Posts recomendados

22 horas atrás, Eli Almeidaa disse:

dá uma ajuda aí, o que tem fazer em seguida ? 

Criar um menu já e uma estrutura de repetição e logo em seguida

uma estrutura condicional para esse menu?

 

Venho te ajudando desde o mes passado. Te disse o que estava errado, como não fazer e como fazer de um modo profissional. 

 

Te mostrei um exemplo das estruturas, como testar rápido e um programa de exemplo.

 

Te disse como replicar isso para as outras estruturas e como era mais simples escrever assim.

 

Não sei ao certo qual seria meu proximo passo

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

@arfneto , tô tentando fazer desse jeito seguindo o que você já estava fazendo, mas

não sei se está correto e também tem a parte de locar veículo e os contratos ativos

que não sei direito como criar. Como colocaria os preços da diária aqui?

 

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


typedef struct {
    char nome [50];
    char endereco [100];
    char cpf [15];
    char telefone [15];
} Locador;

typedef struct
{
    char     marca [100];
    char     modelo [50];
    unsigned ano;
    char     cor [50];
    char     placa [8];
} Veiculo;

typedef struct
{
    unsigned cap;    // capacidade
    unsigned size;   // o nome consagrado para o tamanho
    Veiculo  v[20];  // tanto faz, mais de 2
} Frota;

typedef struct
{
    unsigned cap;    // capacidade
    unsigned size;   // o nome consagrado para o tamanho
    Locador v[20];  
} Frotalocador;


int lista_locador (Locador* l)
{
    if (l == NULL) return -1;
    printf("%s %s %s %s\n ", l->nome, l->endereco, l->cpf, l->telefone );
    return 0;
}

int lista_frotap (Frotalocador* p)
{
    if (p == NULL) return -1;
    printf(
        "A frota tem %d de %d locadores\n", p->size,
        p->cap);
    for (int i = 0; i < p->size; i += 1)
       lista_locador(&p->v[i]); 
    return 0;
}


void cadastrar_locador (Frotalocador*p )

{
    if (p == NULL) return;
    if (p->size >= p->cap) {
        printf("A frota está cheia, não é possível cadastrar mais locadores.\n");
        return;
    }
    Locador novo_locador;
    printf("Informe o seu nome: ");
    fgets(novo_locador.nome, 50, stdin);
    printf("Informe o seu endereço: ");
    fgets(novo_locador.endereco, 100, stdin);
    printf("Informe o seu CPF: ");
    fgets(novo_locador.cpf, 15, stdin);
    printf("Informe o seu telefone: ");
    fgets(novo_locador.telefone, 15, stdin);
    p->v[p->size] = novo_locador;
    p->size += 1;
    printf("locador cadastrado com sucesso!\n");

    
}

void cadastrar_veiculo(Frota* frota)
{
    if (frota == NULL) return;
    if (frota->size >= frota->cap) {
        printf("A frota está cheia, não é possível cadastrar mais veículos.\n");
        return;
    }
    Veiculo novo_veiculo;
    printf("Digite a marca do veículo: ");
    scanf("%s", novo_veiculo.marca);
    printf("Digite o modelo do veículo: ");
    scanf("%s", novo_veiculo.modelo);
    printf("Digite o ano do veículo: ");
    scanf("%u", &novo_veiculo.ano);
    printf("Digite a cor do veículo: ");
    scanf("%s", novo_veiculo.cor);
    printf("Digite a placa do veículo: ");
    scanf("%s", novo_veiculo.placa);
    frota->v[frota->size] = novo_veiculo;
    frota->size += 1;
    printf("Veículo cadastrado com sucesso!\n");
}

int lista_carro(Veiculo* c)
{
    if (c == NULL) return -1;
    printf("%s %s %d %s %s\n ", c->marca, c->modelo, c->ano, c->cor, c->placa );
    return 0;
}

// lista_carro é uma função , essa função tem um ponteiro
// que aponta para os elementos da struct Veiculos. 
// então essa função imprime as características de cada veiculo utilizando ponteiros.


int lista_frota(Frota* frota)
{
    if (frota == NULL) return -1;
    printf(
        "A frota tem %d de %d carros\n", frota->size,
        frota->cap);
    for (int i = 0; i < frota->size; i += 1)
        lista_carro(&frota->v[i]); 
    return 0;
    
    
    // o "&" é usado para obter o endereço de memória do elemento "i" do vetor de veículos "v" da estrutura "frota"
}  // lista_frota é responsável por armazenar a capacidade de veiculos que a locadora pode alugar cap
  // e a quantidade de carros já cadastrados size. Ela também imprime as características de todos os veículos já cadastrados. 


int main(void) {
    
setlocale (LC_ALL,"Portuguese")    ;


Frota frota = {
    .cap = 20,
    .size = 3,
          .v[0] =
            {"   Ford",   "Mustang", 2019, "Prata", "ABC4D01"},
        .v[1] =
            {" Aston Martin", "DBS",   2017, "Prata",  "ABC4D02"},
        .v[2] =
            { " Cadillac", "Escalade ", 2023, "Vermelho", "ABC4D03"},
         .v[3] =
              {" Ford",   "Mustang", 2019, "Prata", "ABC4D06"},  
};


 Frotalocador locadorp = {
 .cap = 20,
 .size = 1,
 .v[0] =
 { "João", "Jj.seabra", "xxxxxxxx","075xxxx"  }, // esse campo aqui coloquei "x" porque o cpf é um dado pessoal e o número também.
 
 };
 
 



    int opcao = 0; 

while (opcao != 7) {
    printf("\n------- MENU --------\n");
    printf("Escolha uma opção:\n");
    printf("1 - Cadastrar Veículo\n");
    printf("2 - Cadastrar Locador (Usuario)\n");
    printf("3 - Listar Veículos\n");
    printf("4 - Listar Locadores\n");
    printf("5 - Contratos ativos\n");
    printf("6 - Locar Veículo\n");
    printf("7 - Sair\n");

    scanf("%d", &opcao);
switch (opcao) {
         case 1:
          cadastrar_veiculo(&frota);    
         break;
        case 2:
          cadastrar_locador(&locadorp);

            break;
        case 3:
        lista_frota(&frota);

            break;
        case 4:
         lista_frotap(&locadorp);

            break;
        case 5:
             printf ("//cadastrar_veiculo(&frota");

            break;
        case 6:
         
            break;
        case 7:
            printf("Saindo...\n");
            break;
        default:
            printf("Opção inválida!\n");
        break;
    }

}


    return 0;
    
    }


 

 

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

10 horas atrás, Eli Almeidaa disse:

tô tentando fazer desse jeito seguindo o que você já estava fazendo, mas

não sei se está correto e também tem a parte de locar veículo e os contratos ativos

que não sei direito como criar. Como colocaria os preços da diária aqui?

 

 

Está bem melhor, parece.

 

O que seria FrotaLocador? Considere o exemplo e tudo que te mostrei até aqui.

 

Eu te disse como criar um contrato. É a mesma coisa.

 

Onde por os preços? Os preços tem a ver com o que? Esse é um programa de estudo, não é um programa de produção. Faça o simples para começar a testar em minutos sem inventar nada. Depois que estiver rodando você vê outras possibilidades. O próprio fato de estar rodando já te dá novas ideias. Pena que não ensinam isso na escola.

 

  • É claro que o preço deve estar inicialmente associado ao bem, ao veículo no caso.
  • É claro que tanto faz o que vai alugar então pode ter uma categoria de veículo. Pode ser um patinete, se alugar um.
  • É claro que clientes podem ter descontos por qualquer razão, como volume por exemplo, e isso estaria em uma categoria. De cliente claro.

Você está voltando aos mesmos "erros"  no programa agora.

 

NUNCA coloque um menu num programa que não está pronto. 

 

Vai levar uma eternidade para testar o programa a cada vez. Ainda no mes passado te disse para usar constantes e arquivos porque é trivial em C. E rápido.

 

Acha mesmo que vai conseguir testar com por exemplo  5 carros e 5 clientes digitando todas essas dezenas de campos TODA vez que for testar o programa??? Não é esperto. E se fechar na sua cara vai digitar tudo de novo? A cada vez vai sumir tudo. Acha que vai dar certo? Não, não vai.

 

Leia o manual. Entenda que scanf retorna um int. TESTE sempre. É ingenuo não testar.

 

Não escreva 8 printf de uma linha. Não faz sentido. Leva uma eternidade. É ruim de ler. E é pior ainda para alinhar o texto. Use 1 printf de 8 linhas. É o simples. De ler, de alinhar, de executar.

 

E se não vai formatar nada use puts() e não printf(). Conheça suas ferramentas.

 

 

 

 

Em 29/04/2023 às 18:54, arfneto disse:
  • Não tem uma única função exceto main
  • tem dados globais
  • tem fflush na entrada (indefinido)
  • Não testa o retorno de scanf
  • tem printf() em sequência
  • chama system()

 

pra lembrar do que te expliquei ainda em abril

 

 

Em 03/05/2023 às 21:56, arfneto disse:

Entendeu mesmo o que eu tentei explicar sobre escrever em torno dos dados?

 

typedef struct
{
    Veiculo v;
    Locador l;
    char data[12];
    unsigned id;
} Locacao;

 

Uma locação é uma relação. Te expliquei isso. Não há o que pensar.

 

E é óbvio que tem uma coleção delas. Esse é o seu programa....

 

typedef struct
{
    unsigned cap;    // capacidade
    unsigned size;   // o nome consagrado para o tamanho
    Locacao  loc[20];  // tanto faz, mais de 2
} Contratos;

 

Entende isso? Os contratos são uma coleção de Locacao claro. É tudo igual, como te expliquei. É só copiar tudo.

 

 

Pois é. Não sabe mesmo como criar um contrato ativo? Que tal inserir um registro na coleção de contratos como te expliquei?

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

@arfneto , estou um pouco com dificuldade para entender o que você está falando porque

não estudei bem vetores, matrizes ,ponteiro, estrutura de repetição e nem em como salvar em arquivo.

Estava estudando portugol e nem terminei de concluir ainda . Se você pudesse explicar

de uma maneira mais clara e fácil de entender.

@arfneto , coloquei "FrotaLocador" porque a capacidade de veículos que podem ser alugados

são vinte , então teria de ser vinte locadores também . Mas estou tentando achar a lógica aí.

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

3 horas atrás, Eli Almeidaa disse:

Se você pudesse explicar

de uma maneira mais clara e fácil de entender.

Então não está claro e está difícil de entender, mesmo eu tendo listado alguns dos problemas um a um e mesmo tendo te mostrado estruturas de exemplo e até um programa de exemplo com a saída dele e tudo?

 

E você não fez uma única pergunta objetiva sobre o que não está claro. Sugiro tentar esse caminho.

 

entenda que esse programa não é passado para um iniciante que nem concluiu um aprendizado com "portugol"  que não sei ao certo o que é mas imagino que essa um artifício para ensinar algoritmos e programação.

 

3 horas atrás, Eli Almeidaa disse:

coloquei "FrotaLocador" porque a capacidade de veículos que podem ser alugados

são vinte , então teria de ser vinte locadores também . Mas estou tentando achar a lógica aí.

 

Já te falei 2 ou 3 vezes sobre essa "lógica". Não é nada. Um contrato é isso: um vínculo entre um cliente e um bem, uma pessoa e um veículo. E os Contratos são claro uma simples coleção de Contrato, copiado igualzinho do programa de exemplo que te mostrei.

 

Só isso. É como se marcasse num papel. O cliente 22 alugou o bem 2034. Nada mais. Uma lista dessas é a estrutura Contratos.

 

E como eu disse umas vezes, faça o simples e leia e grave isso em arquivos. É muito fácil em C. Essa linguagem foi criada para um sistema em que tudo é arquivo (o Unix, que hoje é Linux, Android, MacOS...)

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

@Eli Almeidaa não há muito que dizer a respeito: ou usa fwrite ou usa fprintf. Prefira fwrite sempre ao invés de usar texto (fprintf). Abra o arquivo com fopen, grave com fwrite os registros 1 a 1, feche o arquivo com fclose. Nada mais.

 

Tem que escrever esse programa mas nunca gravou um arquivo em C? Esse tipo de programa --- esse de locadora que tem que escrever --- vem muito depois desses exercícios de gravar arquivos, imagino. 

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

@arfneto , desse jeito aqui também está certo né ? 

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

#define maxUsuarios 100
#define maxVeiculos 100
#define maxContratos 100

typedef struct {
    int idUsuario;
    int idVeiculo;
    int ativo;
} Contrato;

typedef struct {
    char nome[50];
    int id;
} Usuario;

typedef struct {
    char modelo[50];
    int id;
} Veiculo;

Usuario usuarios[maxUsuarios];
int numUsuarios = 0;

Veiculo veiculos[maxVeiculos];
int numVeiculos = 0;

Contrato contratos[maxContratos];
int numContratos = 0;

void cadastrarUsuario() {
    if (numUsuarios >= maxUsuarios) {
        printf("Limite máximo de usuários atingido.\n");
        return;
    }
    
    Usuario novoUsuario;
    printf("Digite o nome do usuário: ");
    getchar(); 
    fgets(novoUsuario.nome, 50, stdin);
    printf("Digite o ID do usuário: ");
    scanf("%d", &novoUsuario.id);
    getchar(); // Consumir o caractere '\n' residual
    usuarios[numUsuarios++] = novoUsuario;
    printf("Usuário cadastrado com sucesso.\n");
}

void listarUsuarios() {
    printf("Lista de usuários:\n");
    for (int i = 0; i < numUsuarios; i++) {
        printf("ID: %d, Nome: %s\n", usuarios[i].id, usuarios[i].nome);
    }
}

void cadastrarVeiculo() {
    if (numVeiculos >= maxVeiculos) {
        printf("Limite máximo de veículos atingido.\n");
        return;
    }
    
    Veiculo novoVeiculo;
    printf("Digite o modelo do veículo: ");
    getchar(); 
    fgets(novoVeiculo.modelo, 50, stdin);
    printf("Digite o ID do veículo: ");
    scanf("%d", &novoVeiculo.id);
    getchar(); // Consumir o caractere '\n' residual
    veiculos[numVeiculos++] = novoVeiculo;
    printf("Veículo cadastrado com sucesso.\n");
}

void listarVeiculos() {
    printf("Lista de veículos:\n");
    for (int i = 0; i < numVeiculos; i++) {
        printf("ID: %d, Modelo: %s\n", veiculos[i].id, veiculos[i].modelo);
    }
}

void exibirContratosAtivos() {
    printf("Contratos ativos:\n");
    int possuiContratosAtivos = 0;
    for (int i = 0; i < numContratos; i++) {
        if (contratos[i].ativo) {
            printf("ID do usuário: %d, ID do veículo: %d\n", contratos[i].idUsuario, contratos[i].idVeiculo);
            possuiContratosAtivos = 1;
        }
    }

    if (!possuiContratosAtivos) {
        printf("Nenhum contrato ativo no momento.\n");
    }
}

void locarVeiculo() {
    int idUsuario, idVeiculo;
    printf("Digite o ID do usuário que deseja locar um veículo: ");
    scanf("%d", &idUsuario);
    printf("Digite o ID do veículo que deseja locar: ");
    scanf("%d", &idVeiculo);
    
    if (numContratos >= maxContratos) {
        printf("Limite máximo de contratos atingido.\n");
        return;
    }

      Contrato novoContrato;
    novoContrato.idUsuario = idUsuario;
    novoContrato.idVeiculo = idVeiculo;
    novoContrato.ativo = 1;
   
    contratos[numContratos++] = novoContrato;
    printf("Veículo locado com sucesso.\n");
}

int main() {
    setlocale(LC_ALL, "Portuguese");

    int opcao;
    do {
        printf("==== Locadora de Veículos ====\n");
        printf("1. Cadastrar usuário\n");
        printf("2. Listar usuários\n");
        printf("3. Cadastrar veículo\n");
        printf("4. Listar veículos\n");
        printf("5. Exibir contratos ativos\n");
        printf("6. Locar veículo\n");
        printf("7. Sair\n");
        printf("Escolha uma opção: ");
        scanf("%d", &opcao);

        switch (opcao) {
            case 1:
                cadastrarUsuario();
                break;
            case 2:
                listarUsuarios();
                break;
            case 3:
                cadastrarVeiculo();
                break;
            case 4:
                listarVeiculos();
                break;
            case 5:
                exibirContratosAtivos();
                break;
            case 6:
                locarVeiculo();
                break;
            case 7:
                printf("Encerrando o programa. Obrigado!\n");
                break;
            default:
                printf("Opção inválida. Por favor, escolha uma opção válida.\n");
                break;
        }

        printf("\n");
    } while (opcao != 7);

    return 0;
}

 

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

1 hora atrás, Eli Almeidaa disse:

desse jeito aqui também está certo né ?

Em 01/05/2023 às 18:35, arfneto disse:

Não são 3 vetores apenas, mas sim 3 coleções, como são chamadas em java, ou containers, como são chamados em C++. Mas são óbvios 3 vetores ao menos. Ou deveriam ser. Pode resolver com dois como está tentando. mas são 3 como já expliquei duas vezes ao menos.

 

Pois é.

 

Não, não está certo. Voltou ao que estava fazendo em abril.

 

Usuario usuarios[maxUsuarios];
int     numUsuarios = 0;

Veiculo veiculos[maxVeiculos];
int     numVeiculos = 0;

Contrato contratos[maxContratos];
int      numContratos = 0;

 

Aqui estão de volta 3 vetores globais mais 3 contadores globais.

 

Não deu atenção ao que te expliquei ainda no mês passado.

 

Ou ao exemplo de 1 de maio, um programa completo com saída e tudo.

 

Veja uma Frota como te mostrei no #10 de 1 de maio:

 

typedef struct
{
    unsigned cap;    // capacidade
    unsigned size;   // o nome consagrado para o tamanho
    Veiculo  v[20];  // tanto faz, mais de 2
} Frota;

 

E no dia 19 você tem um vetor e um contador:

 

Veiculo veiculos[maxVeiculos];
int numVeiculos = 0;

 

E funções void e sem argumentos? 

 

De 2 de maio:

  • seu programa não trata um carro. Trata um conjunto deles, com ao menos um.
  • seu programa não trata um cliente. Trata um conjunto deles, com ao menos um.
  • seu programa não trata um aluguel. trata um conjunto deles, e cada aluguel é uma relação entre um carro e um cliente
  • Quanto mais perto seu programa estiver da realidade mais fácil é o seu trabalho. Seu programa original está muito longe então vai ter trabalho.
  • O modo como te mostrei (o normal profissional) é iterativo e começa a testar antes mesmo de pensar no problema, como a parte que te mostrei.


Como listar uma frota de carros, no exemplo?

 

	int lista_frota(Frota* frota)

 

E o que você tem?

 

void listarVeiculos()
{
    printf("Lista de veículos:\n");
    for (int i = 0; i < numVeiculos; i++)
    {
        printf(
            "ID: %d, Modelo: %s\n", veiculos[i].id,
            veiculos[i].modelo);
    }
}

 

3 semanas depois está voltando ao problema original. Sua função não vale nada como tal. Funciona para um único vetor global com um único contador.

 

E é o mesmo problema de todas as funções que escreveu. 

 

Os dados estão desconectados e são globais. As funções não retornam nada e não tem argumentos. Não tem nenhum arquivo.

 

Não está aproveitando a oportunidade que tem aqui neste forum.

 

😞 

 

Entendeu o que seria escrever em torno dos dados, como te disse desde o início?

 

Rodou o programa que escrevi para você? Entendeu a diferença entre o que te mostrei e o que está tentando fazer?

 

Acha mesmo que vai conseguir testar isso como está fazendo? Vai levar dez minutos só pra entrar com dados de carros ,pessoas e contratos a cada vez que for testar o programa.

 

 

Link para o comentário
Compartilhar em outros sites

@arfneto , entendo. Mas estou sem tempo para estudar direito essa parte

de "sixe" e "cap" ,eu nunca tinha ouvido falar, além do mais como eu disse,

não me aprofundei em vetores, matrizes , repetição e ponteiros. Já estou estudando outra

linguagem de programação, então não tem como me aprofundar por enquanto.

É só um programa simples mesmo a nível de iniciante , quando eu estiver

com uma base melhor dos conteúdos, voltarei nessa questão para

fazer ela melhor.

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Eli Almeidaa disse:

entendo. Mas estou sem tempo para estudar direito essa parte

de "sixe" e "cap" ,eu nunca tinha ouvido falar, além do mais como eu disse,

não me aprofundei em vetores, matrizes , repetição e ponteiros. Já estou estudando outra

linguagem de programação, então não tem como me aprofundar por enquanto.

É só um programa simples mesmo a nível de iniciante , quando eu estiver

com uma base melhor dos conteúdos, voltarei nessa questão para

fazer ela melhor.

 

Isso é absolutamente superficial e a mesma coisa em todas linguagens. De todo modo está usando matrizes e vetores. Não precisa de ponteiros para esse programa. O fato de usar um & para indicar por exemplo o contrato a listar não quer dizer que esteja usando ponteiros.

 

Como iniciante já teria terminado o programa em 1 dia ou dois copiando e colando a partir do exemplo que escrevi para você.

 

Quanto a size e cap nem sei o que dizer. Veja a "profundidade": 
 

size é um contador, quantos carros tem na frota num dado momento

cap é a capacidade, quantos carros cabem na tal Frota já que não está usando ponteiros ou alocação dinâmica.

 

Veja a ironia desse conceito:

 

Do seu programa
 

	Veiculo veiculos[maxVeiculos];
	int numVeiculos = 0;

 

Qual a capacidade? 

 

11 horas atrás, Eli Almeidaa disse:
#define maxVeiculos 100

 

Qual o size?

 

9 horas atrás, arfneto disse:
int numVeiculos = 0;

 

Então parece que seu programa tem a mesma coisa, size é 0 e cap é 100.

 

Só que seu programa tem uma e uma só coleção de veículos, e isso não vai a lugar a nenhum, em, linguagem nenhuma. Ela não tem nome, não pode ser copiada, não pode ser alocada. Suas funções tratam um único dado. É como contratar um motorista para um único carro e ao ter dois carros contratar outro motorista.

 

Do exemplo de 1 de maio

 

typedef struct
{
    unsigned cap;    // capacidade
    unsigned size;   // o nome consagrado para o tamanho
    Veiculo  v[20];  // tanto faz, mais de 2
} Frota;

 

Leu os comentários?

 

Seu programa de iniciante não está bom e podia ter terminado naquela semana e talvez aprendido algo que poderia usar nessas outras linguagens que vai aprender.

 

E vai ter uma dificuldade enorme para concluir assim

 

Acha que isso não é mais simples:
 

	int lista_frota(Frota* frota);

 

?

 

Para listar uma Frota de veículos, qualquer uma? E eu te mostrei um exemplo 😉 

  • Curtir 1
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!