Ir ao conteúdo

Posts recomendados

Postado

@arfneto posso usar dois typedef? para o cadastro do veiculo e do cliente, ou deixo como estava antes?

Agora ficou assim: 

#define  _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//dados cadastrais do cliente
  typedef struct
   {
    char nome[10];
    int idade;
    char CPF_CNPJ[20];
    char CNH[30];
    char Endereco[50];
    } Cliente;

    int le_um_cliente(Cliente*);
    int mostra_um_carro(Cliente* c);

    int main(void){
         Cliente info;
    int opcao = 2;
    switch (opcao)
    {
    case 1:
        le_um_cliente(&info);
        mostra_um_cliente(&info);
        break;
    default:
        printf("Opcao inesperada: %d\n", opcao);
        break;
    };  // switch()
};  // main()

int le_um_cliente(Cliente* C)
{
    char aux[200];
    Cliente info;
    int opcao;
    printf("Informe o nome do cliente: ");
    fflush(stdin);
    gets(info.nome);
    printf("Informe a idade do cliente: ");
    scanf("%d", &info.idade);

    printf("Informe o CPF/CNPJ do cliente: ");
    cpf:
    fflush(stdin);
    gets(aux);
    if (strlen(aux) < 11){
    printf("erro quantidade de digitos menor do que o correto\n");
    printf("Digite novamente: \n");
    goto cpf;

    }
    else if (strlen(aux) > 11){
    printf("erro quantidade de digitos maior do que o correto\n");
    printf("Digite novamente: \n");
    goto cpf;

    }
    else{
    strcpy(info.CPF_CNPJ,aux);
    }
    printf("Informe o número do CNH do cliente: ");
    cnh:
    fflush(stdin);
    gets(aux);
    if (strlen(aux) < 11){
    printf("erro quantidade de digitos menor do que o correto\n");
    printf("digite novamente: \n");
    goto cnh;

    }
    else if (strlen(aux) > 11){
    printf("erro quantidade de digitos maior do que o correto\n");
    printf("digite novamente: \n");
    goto cnh;

    }
    else{
    strcpy(info.CNH,aux);
    }

    printf("Informe o endereco do cliente: ");
    gets(info.Endereco);
    system("pause");
    break;
    }
    }
	}

typedef struct
{
    char placa[10];
    char modelo[20];
    char marca[20];
    char cor[20];
    char ano[5];
}   Carro;

int le_um_carro(Carro*);
int mostra_um_carro(Carro* c);

{
    Carro info;
    int opcao = 2;
    switch (opcao)
    {
    case 2:
        le_um_carro(&info);
        mostra_um_carro(&info);
        break;
    default:
        printf("Opcao inesperada: %d\n", opcao);
        break;
    };  // switch()
};  // main()

int le_um_carro(Carro* C)
{
    char aux[200];
    Carro info;
        printf("Informe o numero da placa [7 digitos]: ");
    placa:
        fflush(stdin);
        gets(aux);
        if (strlen(aux) < 8) {
            printf("erro quantidade de digitos menor do que o correto\n");
            printf("Digite novamente: ");
            goto placa;
        }
        else if (strlen(aux) > 8) {
            printf("erro quantidade de digitos maior do que o correto\n");
            printf("Digite novamente: ");
            goto placa;
        }
        else {
            strcpy(info.placa, aux);
        }
        printf("Informe a marca do veiculo: ");
        gets(info.marca);
        printf("Informe o modelo do veiculo: ");
        gets(info.modelo);
        printf("Informe a cor do veiculo: ");
        gets(info.cor);
        printf("Informe o ano do veiculo: ");
        gets(info.ano);
        *C = info;
        return 0;
};  // le_um_carro()


int mostra_um_carro(Carro* c)
{
    printf("Marca/Modelo: %s %s Cor: %s Placa: %s Entrada: %s \n",
        c->marca,
        c->modelo,
        c->cor,
        c->placa,
        c->ano
    );
    return 0;
};

 

Postado
6 minutos atrás, Def disse:

posso usar dois typedef? para o cadastro do veiculo e do cliente, ou deixo como estava antes?

 

typedef cria um sinonimo, um alias. Útil para deixar a coisa mais legível e evitar ter que digitar, e acabar esquecendo, struct isso ou aquilo em todo lugar.

 

Não há qualquer limite para isso. É só um alias.

Postado
agora, Def disse:

Esse a = 10; é usado pra declarar a linha de "a"?

não, na realidade só está  associando o valor 10 a variavel 'a' já que o poderoso typedef tomou o seu tipo, estou mostrando porque as vezes agente pensa usar as coisas porque acha o nome bonitinho mas ele tem suas habilidades

Postado

@arfneto Ok, dá pra usar a estrutura que você usou com o do cadastro do cliente? 

OBS: O do cliente já estava pronto, porém quando eu coloquei junto com o cad_veiculo ele deu erro

Devo usar o int le_um_cliente e esse processo todo ou posso simplemente usar como eu ja tinha terminado o do cliente?

//dados cadastrais do cliente
    struct cad_cliente{
    char nome[10];
    int idade;
    char CPF_CNPJ[20];
    char CNH[30];
    char Endereco[50];
    };
    int main(void){
    char aux[200];
    struct cad_cliente info;
    int opcao;
    while(1){
            system("cls");
       printf("-----------------------------------------\n");
    printf("\tCONTROLE DE ESTACIONAMENTO\n");
    printf("-----------------------------------------\n\n");
    printf("1- Cadastrar Cliente\n");
    printf("\n2- Cadastrar Veiculo\n");
    printf("\n3- Listar veiculos cadastrados\n");
    printf("\n4- Creditos\n");
    printf("\n5- Sair\n");
    printf("\nOpcao: ");
    scanf("%d",&opcao);
    switch(opcao){
    case 1:
        system("cls");
    printf("Informe o nome do cliente: ");
    fflush(stdin);
    gets(info.nome);
    printf("Informe a idade do cliente: ");
    scanf("%d", &info.idade);

    printf("Informe o CPF/CNPJ do cliente: ");
    cpf:
    fflush(stdin);
    gets(aux);
    if (strlen(aux) < 11){
    printf("erro quantidade de digitos menor do que o correto\n");
    printf("Digite novamente: \n");
    goto cpf;

    }
    else if (strlen(aux) > 11){

Ou uso desse jeito pra compilar o cadastro do cliente e do veiculo?

image.png.7b8942711923912211b0676dfa932229.png

adicionado 3 minutos depois

@herbertbahia ah sim, é que nem eu por exemplo. voce utilizou int idade; e eu achei que poderia usar para int modelo; também, as vezes fico perdido em quando usar int pra tal coisa e char pra outra, ainda mais em cadastros

adicionado 28 minutos depois

@herbertbahia O que eu poderia fazer pra colocar o do cadastro cliente com o cadastro veiculo? Eu digito na opcao: 1 e vai pro do cadastro cliente e 2 para veiculo, acho que já deveria ta rodando assim devido ao switch case1 e 2

#define  _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//dados cadastrais do cliente
    struct cad_cliente{
    char nome[10];
    int idade;
    char CPF_CNPJ[20];
    char CNH[30];
    char Endereco[50];
    };
    int main(void){
    char aux[200];
    struct cad_cliente info;
    int opcao;
    while(1){
            system("cls");
       printf("-----------------------------------------\n");
    printf("\tCONTROLE DE ESTACIONAMENTO\n");
    printf("-----------------------------------------\n\n");
    printf("1- Cadastrar Cliente\n");
    printf("\n2- Cadastrar Veiculo\n");
    printf("\n3- Listar veiculos cadastrados\n");
    printf("\n4- Creditos\n");
    printf("\n5- Sair\n");
    printf("\nOpcao: ");
    scanf("%d",&opcao);
    switch(opcao){
    case 1:
        system("cls");
    printf("Informe o nome do cliente: ");
    fflush(stdin);
    gets(info.nome);
    printf("Informe a idade do cliente: ");
    scanf("%d", &info.idade);

    printf("Informe o CPF/CNPJ do cliente: ");
    cpf:
    fflush(stdin);
    gets(aux);
    if (strlen(aux) < 11){
    printf("erro quantidade de digitos menor do que o correto\n");
    printf("Digite novamente: \n");
    goto cpf;

    }
    else if (strlen(aux) > 11){
    printf("erro quantidade de digitos maior do que o correto\n");
    printf("Digite novamente: \n");
    goto cpf;

    }
    else{
    strcpy(info.CPF_CNPJ,aux);
    }
    printf("Informe o número do CNH do cliente: ");
    cnh:
    fflush(stdin);
    gets(aux);
    if (strlen(aux) < 11){
    printf("erro quantidade de digitos menor do que o correto\n");
    printf("digite novamente: \n");
    goto cnh;

    }
    else if (strlen(aux) > 11){
    printf("erro quantidade de digitos maior do que o correto\n");
    printf("digite novamente: \n");
    goto cnh;

    }
    else{
    strcpy(info.CNH,aux);
    }

    printf("Informe o endereco do cliente: ");
    gets(info.Endereco);
    system("pause");
    break;
    }
    }
	}

typedef struct
{
    char placa[10];
    char modelo[20];
    char marca[20];
    char cor[20];
    char ano[5];
}   Carro;

int le_um_carro(Carro*);
int mostra_um_carro(Carro* c);
{
    Carro info;
    int opcao = 2;
    switch (opcao)
    {
    case 2:
        le_um_carro(&info);
        mostra_um_carro(&info);
        break;
    default:
        printf("Opcao inesperada: %d\n", opcao);
        break;
    };  // switch()
};  // main()

int le_um_carro(Carro* C)
{
    char aux[200];
    Carro info;
        printf("Informe o numero da placa [7 digitos]: ");
    placa:
        fflush(stdin);
        gets(aux);
        if (strlen(aux) < 8) {
            printf("erro quantidade de digitos menor do que o correto\n");
            printf("Digite novamente: ");
            goto placa;
        }
        else if (strlen(aux) > 8) {
            printf("erro quantidade de digitos maior do que o correto\n");
            printf("Digite novamente: ");
            goto placa;
        }
        else {
            strcpy(info.placa, aux);
        }
        printf("Informe a marca do veiculo: ");
        gets(info.marca);
        printf("Informe o modelo do veiculo: ");
        gets(info.modelo);
        printf("Informe a cor do veiculo: ");
        gets(info.cor);
        printf("Informe o ano do veiculo: ");
        gets(info.ano);
        *C = info;
        return 0;
};  // le_um_carro()


int mostra_um_carro(Carro* c)
{
    printf("Marca/Modelo: %s %s Cor: %s Placa: %s Entrada: %s \n",
        c->marca,
        c->modelo,
        c->cor,
        c->placa,
        c->ano
    );
    return 0;
};

 

  • Curtir 1
Postado
38 minutos atrás, Def disse:

Devo usar o int le_um_cliente e esse processo todo ou posso simplemente usar como eu ja tinha terminado o do cliente?

 

Não consegui entender

 

No geral vai fazer a mesma coisa para todos os cadastros para não perder tempo. Uma rotina lê outra mostra para tirar qualquer dúvida. Depois que estiver tudo pronta você tira o excesso.

Postado
1 minuto atrás, arfneto disse:

 

Não consegui entender

 

No geral vai fazer a mesma coisa para todos os cadastros para não perder tempo. Uma rotina lê outra mostra para tirar qualquer dúvida. Depois que estiver tudo pronta você tira o excesso.

Ahhh sim então aquilo que você fez no cadastro do veiculo eu posso usar no do cliente?

O que eu quis dizer acima é o seguinte, é que eu fiz desse jeito o cadastro do cliente junto com o herbert separado do cadastro do veiculo olha só como ficou: 

E assim deu super certo mas se eu coloco em cima dos seus codigos do cadastro do veiculo não dá certo, então eu mudo os codigos do cliente pra ficar que nem o que você fez do veiculo?

#define  _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//dados cadastrais do cliente
    struct cad_cliente{
    char nome[10];
    int idade;
    char CPF_CNPJ[20];
    char CNH[30];
    char Endereco[50];
    };
    int main(void){
    char aux[200];
    struct cad_cliente info;
    int opcao;
    while(1){
            system("cls");
       printf("-----------------------------------------\n");
    printf("\tCONTROLE DE ESTACIONAMENTO\n");
    printf("-----------------------------------------\n\n");
    printf("1- Cadastrar Cliente\n");
    printf("\n2- Cadastrar Veiculo\n");
    printf("\n3- Listar veiculos cadastrados\n");
    printf("\n4- Creditos\n");
    printf("\n5- Sair\n");
    printf("\nOpcao: ");
    scanf("%d",&opcao);
    switch(opcao){
    case 1:
        system("cls");
    printf("Informe o nome do cliente: ");
    fflush(stdin);
    gets(info.nome);
    printf("Informe a idade do cliente: ");
    scanf("%d", &info.idade);

    printf("Informe o CPF/CNPJ do cliente: ");
    cpf:
    fflush(stdin);
    gets(aux);
    if (strlen(aux) < 11){
    printf("erro quantidade de digitos menor do que o correto\n");
    printf("Digite novamente: \n");
    goto cpf;

    }
    else if (strlen(aux) > 11){
    printf("erro quantidade de digitos maior do que o correto\n");
    printf("Digite novamente: \n");
    goto cpf;

    }
    else{
    strcpy(info.CPF_CNPJ,aux);
    }
    printf("Informe o número do CNH do cliente: ");
    cnh:
    fflush(stdin);
    gets(aux);
    if (strlen(aux) < 11){
    printf("erro quantidade de digitos menor do que o correto\n");
    printf("digite novamente: \n");
    goto cnh;

    }
    else if (strlen(aux) > 11){
    printf("erro quantidade de digitos maior do que o correto\n");
    printf("digite novamente: \n");
    goto cnh;

    }
    else{
    strcpy(info.CNH,aux);
    }

    printf("Informe o endereco do cliente: ");
    gets(info.Endereco);
    system("pause");
    break;
    }
    }
	}

 

adicionado 1 minuto depois
1 minuto atrás, Def disse:

Ahhh sim então aquilo que você fez no cadastro do veiculo eu posso usar no do cliente?

O que eu quis dizer acima é o seguinte, é que eu fiz desse jeito o cadastro do cliente junto com o herbert separado do cadastro do veiculo olha só como ficou: 

E assim deu super certo, já está pronto ele mas se eu coloco em cima dos seus codigos do cadastro do veiculo não dá certo, então eu mudo os codigos do cliente pra ficar que nem o que você fez do veiculo?


#define  _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//dados cadastrais do cliente
    struct cad_cliente{
    char nome[10];
    int idade;
    char CPF_CNPJ[20];
    char CNH[30];
    char Endereco[50];
    };
    int main(void){
    char aux[200];
    struct cad_cliente info;
    int opcao;
    while(1){
            system("cls");
       printf("-----------------------------------------\n");
    printf("\tCONTROLE DE ESTACIONAMENTO\n");
    printf("-----------------------------------------\n\n");
    printf("1- Cadastrar Cliente\n");
    printf("\n2- Cadastrar Veiculo\n");
    printf("\n3- Listar veiculos cadastrados\n");
    printf("\n4- Creditos\n");
    printf("\n5- Sair\n");
    printf("\nOpcao: ");
    scanf("%d",&opcao);
    switch(opcao){
    case 1:
        system("cls");
    printf("Informe o nome do cliente: ");
    fflush(stdin);
    gets(info.nome);
    printf("Informe a idade do cliente: ");
    scanf("%d", &info.idade);

    printf("Informe o CPF/CNPJ do cliente: ");
    cpf:
    fflush(stdin);
    gets(aux);
    if (strlen(aux) < 11){
    printf("erro quantidade de digitos menor do que o correto\n");
    printf("Digite novamente: \n");
    goto cpf;

    }
    else if (strlen(aux) > 11){
    printf("erro quantidade de digitos maior do que o correto\n");
    printf("Digite novamente: \n");
    goto cpf;

    }
    else{
    strcpy(info.CPF_CNPJ,aux);
    }
    printf("Informe o número do CNH do cliente: ");
    cnh:
    fflush(stdin);
    gets(aux);
    if (strlen(aux) < 11){
    printf("erro quantidade de digitos menor do que o correto\n");
    printf("digite novamente: \n");
    goto cnh;

    }
    else if (strlen(aux) > 11){
    printf("erro quantidade de digitos maior do que o correto\n");
    printf("digite novamente: \n");
    goto cnh;

    }
    else{
    strcpy(info.CNH,aux);
    }

    printf("Informe o endereco do cliente: ");
    gets(info.Endereco);
    system("pause");
    break;
    }
    }
	}

 

Dessa forma?

image.png.7b8942711923912211b0676dfa932229.png

Postado
1 hora atrás, herbertbahia disse:

as vezes agente pensa usar as coisas porque acha o nome bonitinho mas ele tem suas habilidades

 

Existem razões bem objetivas para usar typedef.  Vou explicar 3:

 

Primeira

struct st_carro
{
    char placa[10];
    char modelo[20];
    char marca[20];
    char cor[20];
    char ano[5];
};
typedef struct st_carro Carro;

Declarando a estrutura assim com um alias via typedef ela passa a ter um nome, Carro, como uma classe em C++ ou java etc. 
 

Esse trecho

    struct st_carro* junta(struct st_carro* A, struct st_carro* B);
    struct st_carro outro;
    struct st_carro* um_novo = (struct st_carro*)malloc(sizeof(struct st_carro));

É funcionalmente idêntico a esse

    Carro* junta2(Carro* A, Carro* B);
    Carro um;
    Carro* novo = (Carro*)malloc(sizeof(Carro));

Num programa complexo você pode ter dezenas de vezes que repetir essa coisa de struct st_carro...

 

Claro que usar um alias resolve bem para deixar tudo mais claro e produtivo.

 

Segunda


Para se proteger de mudanças internas em seu código quando você distribui pode preferir usar nomes locais porque assim se precisar mudar a implementação não precisa mudar a interface e assim não precisa avisar ninguém...

 

Terceira


Se você precisa garantir portabilidade pode usar algo como em stdint.h que define tipos como

#if _VCRT_COMPILER_PREPROCESSOR

#pragma warning(push)
#pragma warning(disable: _VCRUNTIME_DISABLED_WARNINGS)

typedef signed char        int8_t;
typedef short              int16_t;
typedef int                int32_t;
typedef long long          int64_t;
typedef unsigned char      uint8_t;
typedef unsigned short     uint16_t;
typedef unsigned int       uint32_t;
typedef unsigned long long uint64_t;

E assim quando você precisa de um int de 32bits fica seguro em usar int32_t sem ter que pensar se o cara compilou seu programa em uma máquina onde os int tem 64, 24 ou 16 bits... Nada de sizeof() toda hora.

 

 

 

adicionado 5 minutos depois
23 minutos atrás, Def disse:

em cima dos seus codigos do cadastro do veiculo não dá certo, então eu mudo os codigos do cliente pra ficar que nem o que você fez do veiculo?

 

 

"Não dá certo" é algo muito vago. Você deve explicar melhor as coisas. Se você planejar bem ao separar o código não vai ter problemas ao juntar. Se tem problemas algo falhou no início.

 

Como te disse, isso tudo é simétrico e muito simples, então deve fazer igual. Quando testa o cliente em separado força opcao = 1 , quando testa carro usa opcao = 2 e assim por diante. No programa principal você lê a opção então não precisa mudar nada exceto colocar as rotinas novas lá.

 

Como você está começando e está testando deve, desde o início, já criar uma função que mostra o que tem na estrutura e chamar assim que leu, como te mostrei.

 

  • Haha 1
Postado

@arfneto @arfneto  tá dando erro bem nessa linha quando tirei o int main(void) mas eu tirei o int main(void) porque já tem lá em cima no cadastro do cliente, pois começa a partir deleimage.png.e10a41682622242357b5b4fec9abf0a3.pngTá 

  • Haha 1
Postado
8 minutos atrás, Def disse:

tá dando erro bem nessa linha quando tirei o int main(void) mas eu tirei o int main(void) porque já tem lá em cima no cadastro do cliente, pois começa a partir dele

 

Não me surpreende que tenha dado erro ao você fazer isso.

 

Recomendo muito mesmo que arrume um livro e estude esses conceitos básicos de tipos e loops e declarações. Você parece não ter noção de causa e efeito das coisas que vai mudando. Em geral você não muda uma linha sequer sem uma razão. E não escreva uma linha sem uma razão.

 

Veja esse código de main()

    Carro info;
    Cliente cliente;

    int opcao = 2;
    switch (opcao)
    {
    case 1:
        le_um_cliente(&cliente);
        mostra_um_carro(&cliente);
        break;

    case 2:
        le_um_carro(&info);
        mostra_um_carro(&info);
        break;
        
    default:
        printf("Opcao inesperada: %d\n", opcao);
        break;
    };  // switch()
};  // main()

 

Recortar e colar. Apenas. E você traz o código das funções que está agregando, as que tratam cliente no caso. Nada mais. Acha que funciona assim? Claro que funciona. Apenas tenha critério. E não use variáveis globais. 

 

Em geral essas funções vão estar em arquivos separados. Então cada cara do grupo tem sua parte definida e envia os arquivos correspondentes, tipo carros.c e clientes.c e alguém cuida de main() em main.c. E as declarações acertadas antes entre todos estão em carros.h e clientes.h e a vida segue.

 

 

 

  • Curtir 1
Postado
36 minutos atrás, arfneto disse:

 

Não me surpreende que tenha dado erro ao você fazer isso.

 

Recomendo muito mesmo que arrume um livro e estude esses conceitos básicos de tipos e loops e declarações. Você parece não ter noção de causa e efeito das coisas que vai mudando. Em geral você não muda uma linha sequer sem uma razão. E não escreva uma linha sem uma razão.

 

Veja esse código de main()


    Carro info;
    Cliente cliente;

    int opcao = 2;
    switch (opcao)
    {
    case 1:
        le_um_cliente(&cliente);
        mostra_um_carro(&cliente);
        break;

    case 2:
        le_um_carro(&info);
        mostra_um_carro(&info);
        break;
        
    default:
        printf("Opcao inesperada: %d\n", opcao);
        break;
    };  // switch()
};  // main()

 

Recortar e colar. Apenas. E você traz o código das funções que está agregando, as que tratam cliente no caso. Nada mais. Acha que funciona assim? Claro que funciona. Apenas tenha critério. E não use variáveis globais. 

 

Em geral essas funções vão estar em arquivos separados. Então cada cara do grupo tem sua parte definida e envia os arquivos correspondentes, tipo carros.c e clientes.c e alguém cuida de main() em main.c. E as declarações acertadas antes entre todos estão em carros.h e clientes.h e a vida segue.

 

 

 

Ok, eu ainda deixo o menu das funções? Esse da print é o menu 

image.png.18ae8eaca3b3f6f02aa036bf1b6e54af.png

adicionado 0 minutos depois
agora, Def disse:

Ok, eu ainda deixo o menu das funções? Esse da print é o menu 

image.png.18ae8eaca3b3f6f02aa036bf1b6e54af.png

Ou eu deixo o menu onde ele está e só pego o case do cliente e mudo pra baixo?

Postado

Esse print que nos mostra agora tem uma case 1: e conteúdo com comandos que já foram há tempos agrupados num bloco organizado de comandos chamado função le_um_cliente (), 

adicionado 1 minuto depois

Ou será que ainda não ?

Postado
3 minutos atrás, Mauro Britivaldo disse:

Esse print que nos mostra agora tem uma case 1: e conteúdo com comandos que já foram há tempos agrupados num bloco organizado de comandos chamado função le_um_cliente (), 

adicionado 1 minuto depois

Ou será que ainda não ?

Esse da print é o seguinte:

Fiz primeiro o cadastro do cliente que será a opção 1 desse programa, só que eu havia feito ela separado. Ai fui fazer o cadastro do veiculo que é a opção 2 e graças ao arfneto consegui finalizar ele. E agora estou tentando juntar eles para rodar como um só programa

 

Ou seja: quando eu teclar a opção 1 eu irei fazer o cadastro do cliente, preencher tudo certinho e dar o enter e apertar a opção 2 para cadastrar o veiculo do cliente. Espero ter dado pra entender, se quiser posso mandar aqui os dois codigos separados

Separados eles funcionam muito bem, mas juntando eles ta dando alguns erro o que provavelmente é por causa do case mesmo

  • Curtir 1
Postado
57 minutos atrás, arfneto disse:

Recortar e colar. Apenas. E você traz o código das funções que está agregando, as que tratam cliente no caso. Nada mais. Acha que funciona assim? Claro que funciona. Apenas tenha critério. E não use variáveis globais

 

:D recortar e colar e eu colei errado...

 

int main(void)
{
    Carro info;
    Cliente cliente;

    int opcao = 2;
    switch (opcao)
    {
    case 1:
        le_um_cliente(&cliente);
        mostra_um_cliente(&cliente);
        break;

    case 2:
        le_um_carro(&info);
        mostra_um_carro(&info);
        break;
    default:
        printf("Opcao inesperada: %d\n", opcao);
        break;
    };  // switch()
};  // main()

Claro que assim ainda não está lendo a opção. Quando estiverem todas as funções aí você mostra o menu e lê a opção do usuário antes de entrar no switch, como estava no programa original

adicionado 3 minutos depois

passe esse menu e a leitura da opção para uma outra função para ficar mais simples. Apenas uma função

int menu();

que retorna a opção lida antes antes de entrar no case. Acho que como estava antes. 

Postado
13 minutos atrás, arfneto disse:

 

:D recortar e colar e eu colei errado...

 


int main(void)
{
    Carro info;
    Cliente cliente;

    int opcao = 2;
    switch (opcao)
    {
    case 1:
        le_um_cliente(&cliente);
        mostra_um_cliente(&cliente);
        break;

    case 2:
        le_um_carro(&info);
        mostra_um_carro(&info);
        break;
    default:
        printf("Opcao inesperada: %d\n", opcao);
        break;
    };  // switch()
};  // main()

Claro que assim ainda não está lendo a opção. Quando estiverem todas as funções aí você mostra o menu e lê a opção do usuário antes de entrar no switch, como estava no programa original

adicionado 3 minutos depois

passe esse menu e a leitura da opção para uma outra função para ficar mais simples. Apenas uma função


int menu();

que retorna a opção lida antes antes de entrar no case. Acho que como estava antes. 

Kkkk ok, obrigado.

 

Assim, esse menu eu posso colocar dentro do case 1 mesmo? ou tem que ficar do lado de fora com o "Int menu();"

 

while(1){
            system("cls");
    printf("-----------------------------------------\n");
    printf("\tCONTROLE DE ESTACIONAMENTO\n");
    printf("-----------------------------------------\n\n");
    printf("1- Cadastrar Cliente\n");
    printf("\n2- Cadastrar Veiculo\n");
    printf("\n3- Listar veiculos cadastrados\n");
    printf("\n4- Creditos\n");
    printf("\n5- Sair\n");
    printf("\nOpcao: ");
    scanf("%d",&opcao);
    switch(opcao){
 

Postado

Se

ao final do menu você vai ler a opção com a qual pretende entrar no switch() pra executar o comando escolhido,

 

Então

 

não acha estranho se o menu estiver dentro do mesmo switch()?

 

O menu não estava funcionando? Deixe onde está

adicionado 0 minutos depois

poste o código atual para alguém poder ajudar. está ficando confuso agora

Postado
3 minutos atrás, arfneto disse:

Se

ao final do menu você vai ler a opção com a qual pretende entrar no switch() pra executar o comando escolhido,

 

Então

 

não acha estranho se o menu estiver dentro do mesmo switch()?

 

O menu não estava funcionando? Deixe onde está

adicionado 0 minutos depois

poste o código atual para alguém poder ajudar. está ficando confuso agora

Ok, está ficando assim: 

#define  _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//dados cadastrais do cliente
    struct cad_cliente{
    char nome[10];
    int idade;
    char CPF_CNPJ[20];
    char CNH[30];
    char Endereco[50];
    };
    {
    int menu();
    char aux[200];
    struct cad_cliente info;
    int opcao;
    while(1){
            system("cls");
    printf("-----------------------------------------\n");
    printf("\tCONTROLE DE ESTACIONAMENTO\n");
    printf("-----------------------------------------\n\n");
    printf("1- Cadastrar Cliente\n");
    printf("\n2- Cadastrar Veiculo\n");
    printf("\n3- Listar veiculos cadastrados\n");
    printf("\n4- Creditos\n");
    printf("\n5- Sair\n");
    printf("\nOpcao: ");
    scanf("%d",&opcao);
    switch(opcao){

    }
typedef struct
{
    char placa[10];
    char modelo[20];
    char marca[20];
    char cor[20];
    char ano[5];
}   Carro;

int le_um_carro(Carro*);
int mostra_um_carro(Carro* c);

{
    int main(void)

    Carro info;
    Cliente cliente;

    int opcao = 2;
    switch (opcao)
    {
    case 1:
        le_um_cliente(&cliente);
        mostra_um_cliente(&cliente);
        break;
        
        system("cls");
    printf("Informe o nome do cliente: ");
    fflush(stdin);
    gets(info.nome);
    printf("Informe a idade do cliente: ");
    scanf("%d", &info.idade);

    printf("Informe o CPF/CNPJ do cliente: ");
    cpf:
    fflush(stdin);
    gets(aux);
    if (strlen(aux) < 11){
    printf("erro quantidade de digitos menor do que o correto\n");
    printf("Digite novamente: \n");
    goto cpf;

    }
    else if (strlen(aux) > 11){
    printf("erro quantidade de digitos maior do que o correto\n");
    printf("Digite novamente: \n");
    goto cpf;

    }
    else{
    strcpy(info.CPF_CNPJ,aux);
    }
    printf("Informe o número do CNH do cliente: ");
    cnh:
    fflush(stdin);
    gets(aux);
    if (strlen(aux) < 11){
    printf("erro quantidade de digitos menor do que o correto\n");
    printf("digite novamente: \n");
    goto cnh;

    }
    else if (strlen(aux) > 11){
    printf("erro quantidade de digitos maior do que o correto\n");
    printf("digite novamente: \n");
    goto cnh;

    }
    else{
    strcpy(info.CNH,aux);
    }

    printf("Informe o endereco do cliente: ");
    gets(info.Endereco);
    system("pause");
    break;
        
    case 2:
        le_um_carro(&info);
        mostra_um_carro(&info);
        break;
    default:
        printf("Opcao inesperada: %d\n", opcao);
        break;
    };  // switch()
};  // main()
     
int le_um_carro(Carro* C)
{
    char aux[200];
    Carro info;
        printf("Informe o numero da placa [7 digitos]: ");
    placa:
        fflush(stdin);
        gets(aux);
        if (strlen(aux) < 8) {
            printf("erro quantidade de digitos menor do que o correto\n");
            printf("Digite novamente: ");
            goto placa;
        }
        else if (strlen(aux) > 8) {
            printf("erro quantidade de digitos maior do que o correto\n");
            printf("Digite novamente: ");
            goto placa;
        }
        else {
            strcpy(info.placa, aux);
        }
        printf("Informe a marca do veiculo: ");
        gets(info.marca);
        printf("Informe o modelo do veiculo: ");
        gets(info.modelo);
        printf("Informe a cor do veiculo: ");
        gets(info.cor);
        printf("Informe o ano do veiculo: ");
        gets(info.ano);
        *C = info;
        return 0;
};  // le_um_carro()


int mostra_um_carro(Carro* c)
{
    printf("Marca/Modelo: %s %s Cor: %s Placa: %s Entrada: %s \n",
        c->marca,
        c->modelo,
        c->cor,
        c->placa,
        c->ano
    );
    return 0;
};

 

Postado
#define  _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//dados cadastrais do cliente
     typedef struct{
    char nome[10];
    int idade;
    char CPF_CNPJ[20];
    char CNH[30];
    char Endereco[50];
    }Cliente;
    
    typedef struct
{
    char placa[10];
    char modelo[20];
    char marca[20];
    char cor[20];
    char ano[5];
}   Carro;

//int le_um_cliente(Cliente*);
//int mostra_um_cliente(Cliente*);
int le_um_carro(Carro*);
int mostra_um_carro(Carro* c);

    int main(){
    char aux[200];
    Carro info;
    Cliente cliente;
    int opcao;
    while(1){
            system("cls");
    printf("-----------------------------------------\n");
    printf("\tCONTROLE DE ESTACIONAMENTO\n");
    printf("-----------------------------------------\n\n");
    printf("1- Cadastrar Cliente\n");
    printf("\n2- Cadastrar Veiculo\n");
    printf("\n3- Listar veiculos cadastrados\n");
    printf("\n4- Creditos\n");
    printf("\n5- Sair\n");
    printf("\nOpcao: ");
    scanf("%d",&opcao);

    switch (opcao)
    {
    case 1:
     /*   le_um_cliente(&cliente);
        mostra_um_cliente(&cliente);
        break;
        */
        
        system("cls");
    printf("Informe o nome do cliente: ");
    fflush(stdin);
    gets(cliente.nome);
    printf("Informe a idade do cliente: ");
    scanf("%d", &cliente.idade);

    printf("Informe o CPF/CNPJ do cliente: ");
    cpf:
    fflush(stdin);
    gets(aux);
    if (strlen(aux) < 11){
    printf("erro quantidade de digitos menor do que o correto\n");
    printf("Digite novamente: \n");
    goto cpf;

    }
    else if (strlen(aux) > 11){
    printf("erro quantidade de digitos maior do que o correto\n");
    printf("Digite novamente: \n");
    goto cpf;

    }
    else{
    strcpy(cliente.CPF_CNPJ,aux);
    }
    printf("Informe o número do CNH do cliente: ");
    cnh:
    fflush(stdin);
    gets(aux);
    if (strlen(aux) < 11){
    printf("erro quantidade de digitos menor do que o correto\n");
    printf("digite novamente: \n");
    goto cnh;

    }
    else if (strlen(aux) > 11){
    printf("erro quantidade de digitos maior do que o correto\n");
    printf("digite novamente: \n");
    goto cnh;

    }
    else{
    strcpy(cliente.CNH,aux);
    }

    printf("Informe o endereco do cliente: ");
    gets(cliente.Endereco);
    system("pause");
    break;
        
    case 2:
        le_um_carro(&info);
        
        break;
    default:
        printf("Opcao inesperada: %d\n", opcao);
        break;
        case 3:
        	mostra_um_carro(&info);
        	system("pause");
        	break;
        	 case 5:
        	 	exit(1);
    }  // switch()
}  
}// main()
     
int le_um_carro(Carro* C)
{
    char aux[200];
    Carro info;
        printf("Informe o numero da placa [8 digitos]: ");
    placa:
        fflush(stdin);
        gets(aux);
        if (strlen(aux) < 8) {
            printf("erro quantidade de digitos menor do que o correto\n");
            printf("Digite novamente: ");
            goto placa;
        }
        else if (strlen(aux) > 8) {
            printf("erro quantidade de digitos maior do que o correto\n");
            printf("Digite novamente: ");
            goto placa;
        }
        else {
            strcpy(info.placa, aux);
        }
        printf("Informe a marca do veiculo: ");
        gets(info.marca);
        printf("Informe o modelo do veiculo: ");
        gets(info.modelo);
        printf("Informe a cor do veiculo: ");
        gets(info.cor);
        printf("Informe o ano do veiculo: ");
        gets(info.ano);
        *C = info;
        return 0;
};  // le_um_carro()


int mostra_um_carro(Carro* c)
{
    printf("Marca/Modelo: %s %s Cor: %s Placa: %s Entrada: %s \n",
        c->marca,
        c->modelo,
        c->cor,
        c->placa,
        c->ano
    );
    return 0;
};

 

  • Amei 1
Postado

image.png.a2ecb219dae4251c4ed0cb3bf032117a.png

 

Que pretende com isso? uma chave antes de main()?

 

o que é

int menu();

Se é um protótipo onde está a função? 

 

E agora tem até DOIS switch(opcao);

 

2 horas atrás, arfneto disse:

Em geral você não muda uma linha sequer sem uma razão. E não escreva uma linha sem uma razão

 

Se leu isso, saiba que estou curioso pelas razões que teve para escrever assim...

 

Postado
8 minutos atrás, herbertbahia disse:

#define  _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//dados cadastrais do cliente
     typedef struct{
    char nome[10];
    int idade;
    char CPF_CNPJ[20];
    char CNH[30];
    char Endereco[50];
    }Cliente;
    
    typedef struct
{
    char placa[10];
    char modelo[20];
    char marca[20];
    char cor[20];
    char ano[5];
}   Carro;

//int le_um_cliente(Cliente*);
//int mostra_um_cliente(Cliente*);
int le_um_carro(Carro*);
int mostra_um_carro(Carro* c);

    int main(){
    char aux[200];
    Carro info;
    Cliente cliente;
    int opcao;
    while(1){
            system("cls");
    printf("-----------------------------------------\n");
    printf("\tCONTROLE DE ESTACIONAMENTO\n");
    printf("-----------------------------------------\n\n");
    printf("1- Cadastrar Cliente\n");
    printf("\n2- Cadastrar Veiculo\n");
    printf("\n3- Listar veiculos cadastrados\n");
    printf("\n4- Creditos\n");
    printf("\n5- Sair\n");
    printf("\nOpcao: ");
    scanf("%d",&opcao);

    switch (opcao)
    {
    case 1:
     /*   le_um_cliente(&cliente);
        mostra_um_cliente(&cliente);
        break;
        */
        
        system("cls");
    printf("Informe o nome do cliente: ");
    fflush(stdin);
    gets(cliente.nome);
    printf("Informe a idade do cliente: ");
    scanf("%d", &cliente.idade);

    printf("Informe o CPF/CNPJ do cliente: ");
    cpf:
    fflush(stdin);
    gets(aux);
    if (strlen(aux) < 11){
    printf("erro quantidade de digitos menor do que o correto\n");
    printf("Digite novamente: \n");
    goto cpf;

    }
    else if (strlen(aux) > 11){
    printf("erro quantidade de digitos maior do que o correto\n");
    printf("Digite novamente: \n");
    goto cpf;

    }
    else{
    strcpy(cliente.CPF_CNPJ,aux);
    }
    printf("Informe o número do CNH do cliente: ");
    cnh:
    fflush(stdin);
    gets(aux);
    if (strlen(aux) < 11){
    printf("erro quantidade de digitos menor do que o correto\n");
    printf("digite novamente: \n");
    goto cnh;

    }
    else if (strlen(aux) > 11){
    printf("erro quantidade de digitos maior do que o correto\n");
    printf("digite novamente: \n");
    goto cnh;

    }
    else{
    strcpy(cliente.CNH,aux);
    }

    printf("Informe o endereco do cliente: ");
    gets(cliente.Endereco);
    system("pause");
    break;
        
    case 2:
        le_um_carro(&info);
        
        break;
    default:
        printf("Opcao inesperada: %d\n", opcao);
        break;
        case 3:
        	mostra_um_carro(&info);
        	system("pause");
        	break;
        	 case 5:
        	 	exit(1);
    }  // switch()
}  
}// main()
     
int le_um_carro(Carro* C)
{
    char aux[200];
    Carro info;
        printf("Informe o numero da placa [8 digitos]: ");
    placa:
        fflush(stdin);
        gets(aux);
        if (strlen(aux) < 8) {
            printf("erro quantidade de digitos menor do que o correto\n");
            printf("Digite novamente: ");
            goto placa;
        }
        else if (strlen(aux) > 8) {
            printf("erro quantidade de digitos maior do que o correto\n");
            printf("Digite novamente: ");
            goto placa;
        }
        else {
            strcpy(info.placa, aux);
        }
        printf("Informe a marca do veiculo: ");
        gets(info.marca);
        printf("Informe o modelo do veiculo: ");
        gets(info.modelo);
        printf("Informe a cor do veiculo: ");
        gets(info.cor);
        printf("Informe o ano do veiculo: ");
        gets(info.ano);
        *C = info;
        return 0;
};  // le_um_carro()


int mostra_um_carro(Carro* c)
{
    printf("Marca/Modelo: %s %s Cor: %s Placa: %s Entrada: %s \n",
        c->marca,
        c->modelo,
        c->cor,
        c->placa,
        c->ano
    );
    return 0;
};

 

Brigadão mano, muito grato!!

 

 

adicionado 13 minutos depois
15 minutos atrás, arfneto disse:

image.png.a2ecb219dae4251c4ed0cb3bf032117a.png

 

Que pretende com isso? uma chave antes de main()?

 

o que é


int menu();

Se é um protótipo onde está a função? 

 

E agora tem até DOIS switch(opcao);

 

 

Se leu isso, saiba que estou curioso pelas razões que teve para escrever assim...

 

Verdade não tinha notado essa chave em cima do main(), quanto ao int menu(); pensei que era pra usar ele acima do menu que havia te mandado, mas afinal das contas nem precisava do int menu(); tava vendo aqui so bastava declarar variavel main e o case1  

/*   le_um_cliente(&cliente);
        mostra_um_cliente(&cliente);
        break;
        */

adicionado 16 minutos depois
15 minutos atrás, Def disse:

Brigadão mano, muito grato!!

 

 

adicionado 13 minutos depois

Verdade não tinha notado essa chave em cima do main(), quanto ao int menu(); pensei que era pra usar ele acima do menu que havia te mandado, mas afinal das contas nem precisava do int menu(); tava vendo aqui so bastava declarar variavel main e o case1  

/*   le_um_cliente(&cliente);
        mostra_um_cliente(&cliente);
        break;
        */

Em geral @arfneto já está finalizado, pois a parte de listar os cadastrados e a parte de fechar o programa outro membro do meu grupo irá fazer, acha que vale a pena eu colocar quanto ficará a diaria/mensalidade do estacionamento?? Acho que assim ficará mais completo né

  • Obrigado 1
Postado
8 minutos atrás, Def disse:

//int le_um_cliente(Cliente*);
//int mostra_um_cliente(Cliente*);

 

8 minutos atrás, Def disse:

/* le_um_cliente(&cliente);
mostra_um_cliente(&cliente);
break; */

 

Em geral é melhor não comentar. Apenas escreva os protótipos e as funções vazias porque vai ter que escrer de qualquer modo...

 

O próprio IDE pode fazer isso pra você. Veja por exemplo


image.png.eb761613ddf696a72bc95fd1eab12a76.png

 

Criei testeX() o protótipo. Como não está aqui e em nenhum .h declarado, aparece a linha verde embaixo. Não é um erro, pode ser de propósito afinal. Mas se for algo que você deveria ter escrito veja lá em "Show potential...." na janela: Você tecla alt-Enter e o IDE cria pra você a função:
 

image.png.b276c5570fe9cd6f4286a09a96ac2798.png

 

E você pode escolher onde! E se eu escolher o primeiro:
 

image.png.d4f5282a1fd477c14c9055af0db4427c.png

 

 

Não só ele cria a função com o valor de retorno certinho e o corpo e tal, como põe na mesma ordem em que estão declarados os protótipos. Como eu sempre declaro em ordem alfabética ele preservou...

 

Basta por um valor qualquer para o argumento, que o IDE não ia adivinhar mesmo, e pronto. E veja que ele abre uma pequena janela dentro da janela de edição, para poder digitar nos dois lugares ao mesmo tempo sem ter que mudar de janela...

 

 

adicionado 2 minutos depois
23 minutos atrás, Def disse:

mas afinal das contas nem precisava do int menu(); tava vendo aqui so bastava declarar variavel main e o case1  

 

Se você diz...

 

as diz porque não entendeu o que te expliquei sobre o menu...

24 minutos atrás, Def disse:

acha que vale a pena eu colocar quanto ficará a diaria/mensalidade do estacionamento?? Acho que assim ficará mais completo né

 

Como te disse dias atrás, devia fazer o mais perto possível da realidade para ter mais facilidade e não tanto trabalho. 

Você apagou a estrutura que marcava o tempo ao invés de aumentar e colocar TAMBÉM a data de saída.

 

Eu te mostrei até um ticket de estacionamento para ver se te inspirava...

adicionado 10 minutos depois

Isso foi o que eu te disse pra escrever

 

    int opcao = 0;
    Carro   info;
    Cliente cliente;
    while (opcao != 5) // sair = 5
    {
        opcao = menu();
        switch (opcao)
        {
        case 1:
            le_um_cliente(&cliente);
            mostra_um_cliente(&cliente);
            break;
        case 2:
            le_um_carro(&info);
            mostra_um_carro(&info);
            break;
        case 5:
            break;
        default:
            printf("Opcao inesperada: %d\n", opcao);
            break;
        };  // switch()
    };   // while();
};  // main()

 

Acho que dá pra ver como é mais simples...

adicionado 11 minutos depois

Ao entrar no loop mostra o menu. O menu devolve a opcao. A opcao controla o switch. A vida segue. 

 

  • Curtir 1
Postado
29 minutos atrás, arfneto disse:

 

 

Em geral é melhor não comentar. Apenas escreva os protótipos e as funções vazias porque vai ter que escrer de qualquer modo...

 

O próprio IDE pode fazer isso pra você. Veja por exemplo


image.png.eb761613ddf696a72bc95fd1eab12a76.png

 

Criei testeX() o protótipo. Como não está aqui e em nenhum .h declarado, aparece a linha verde embaixo. Não é um erro, pode ser de propósito afinal. Mas se for algo que você deveria ter escrito veja lá em "Show potential...." na janela: Você tecla alt-Enter e o IDE cria pra você a função:
 

image.png.b276c5570fe9cd6f4286a09a96ac2798.png

 

E você pode escolher onde! E se eu escolher o primeiro:
 

image.png.d4f5282a1fd477c14c9055af0db4427c.png

 

 

Não só ele cria a função com o valor de retorno certinho e o corpo e tal, como põe na mesma ordem em que estão declarados os protótipos. Como eu sempre declaro em ordem alfabética ele preservou...

 

Basta por um valor qualquer para o argumento, que o IDE não ia adivinhar mesmo, e pronto. E veja que ele abre uma pequena janela dentro da janela de edição, para poder digitar nos dois lugares ao mesmo tempo sem ter que mudar de janela...

 

 

adicionado 2 minutos depois

 

Se você diz...

 

as diz porque não entendeu o que te expliquei sobre o menu...

 

Como te disse dias atrás, devia fazer o mais perto possível da realidade para ter mais facilidade e não tanto trabalho. 

Você apagou a estrutura que marcava o tempo ao invés de aumentar e colocar TAMBÉM a data de saída.

 

Eu te mostrei até um ticket de estacionamento para ver se te inspirava...

adicionado 10 minutos depois

Isso foi o que eu te disse pra escrever

 


    int opcao = 0;
    Carro   info;
    Cliente cliente;
    while (opcao != 5) // sair = 5
    {
        opcao = menu();
        switch (opcao)
        {
        case 1:
            le_um_cliente(&cliente);
            mostra_um_cliente(&cliente);
            break;
        case 2:
            le_um_carro(&info);
            mostra_um_carro(&info);
            break;
        case 5:
            break;
        default:
            printf("Opcao inesperada: %d\n", opcao);
            break;
        };  // switch()
    };   // while();
};  // main()

 

Acho que dá pra ver como é mais simples...

adicionado 11 minutos depois

Ao entrar no loop mostra o menu. O menu devolve a opcao. A opcao controla o switch. A vida segue. 

 

Ahhh, quando você disse de adicionar int menu(); imaginei que era pra declarar o menu inicial que tinha feito como :  printf("-----------------------------------------\n");
    printf("\tCONTROLE DE ESTACIONAMENTO\n");
    printf("-----------------------------------------\n\n");
    printf("1- Cadastrar Cliente\n");
    printf("\n2- Cadastrar Veiculo\n");
    printf("\n3- Listar veiculos cadastrados\n");
    printf("\n4- Creditos\n");
    printf("\n5- Sair\n");
    printf("\nOpcao: ");
    scanf("%d",&opcao);
 

 

Mas esse int menu era apenas pra declarar a opção do case 1?

adicionado 3 minutos depois
29 minutos atrás, arfneto disse:

 

 

Em geral é melhor não comentar. Apenas escreva os protótipos e as funções vazias porque vai ter que escrer de qualquer modo...

 

O próprio IDE pode fazer isso pra você. Veja por exemplo


image.png.eb761613ddf696a72bc95fd1eab12a76.png

 

Criei testeX() o protótipo. Como não está aqui e em nenhum .h declarado, aparece a linha verde embaixo. Não é um erro, pode ser de propósito afinal. Mas se for algo que você deveria ter escrito veja lá em "Show potential...." na janela: Você tecla alt-Enter e o IDE cria pra você a função:
 

image.png.b276c5570fe9cd6f4286a09a96ac2798.png

 

E você pode escolher onde! E se eu escolher o primeiro:

Apertei alt + enter mas não deu em nada

 

adicionado 5 minutos depois
31 minutos atrás, arfneto disse:

 

 

Eu te mostrei até um ticket de estacionamento para ver se te inspirava...

 

 

Onde você mandou? não me lembro exatamente como era

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!