Ir ao conteúdo
  • Cadastre-se

C Crie um programa, em linguagem C, que receba 10 registros contendo: Nome, RU


Ir à solução Resolvido por kgin,

Posts recomendados

Boa Noite pessoal! estou querendo resolver este exercício mas estou em duvida com a lógica

 

Citação

Crie um programa, em linguagem C, que receba 10 registros contendo: Nome, RU, telefone e e-mail. Solicite que sejam digitados todos os dados de todos os registros e ao final salve-os em um arquivo com a extensão CSV, utilize o ; (ponto e vírgula) para separador e campo. O nome do arquivo deve ser o seu número de RU.

 

Abaixo, é a lógica que estou criando: (Ainda não está pronta)

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

int main(void) {
    setlocale(LC_ALL, "portuguese");
    FILE* arquivo;
    errno_t err;
    int nome, matricula, telefone, email;
    int i = 0;
    
    err = fopen_s(&arquivo, "3228231.txt", "a");

    for (i = 0; i <= 10; i++) {
        printf("Digite seu nome: ");
        nome = getchar();
        fputc(nome, arquivo);

        printf("Digite seu RU: ");
        matricula = getchar();
        fputc(matricula, arquivo);

        printf("Digite seu telefone: ");
        telefone = getchar();
        fputc(telefone, arquivo);

        printf("Digite seu email: ");
        email = getchar();
        fputc(email, arquivo);
        

    }
    system("pause");
    return arquivo;
}

 

Alguém pode me ajudar a solucionar ele?

image.png.013e4635f560ff6e3f913e57d263e56c.png

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

@Alexandre Xisto O problema do seu algoritmo e porque você está lendo strings (= cadeia de caracteres) e inteiros como um caractere.

2 horas atrás, Alexandre Xisto disse:
nome = getchar();

você deveria usar fgets() para pegar strings e scanf() para pegar números inteiros e reais.

 

É isso está errado!

2 horas atrás, Alexandre Xisto disse:
int nome, matricula, telefone, email;

o enunciado pede para criar uma struct para os elementos do cadastro.

2 horas atrás, Alexandre Xisto disse:

Crie um programa, em linguagem C, que receba 10 registros contendo: Nome, RU, telefone e e-mail.

exemplo de registro

struct matricula
{
    char nome[255];
    char telefone[30];
    char email[150];
    int ru;
};

fora que você deveria ler todos os 10 registros para só no final do programa criar um arquivo para cada registro.

 

dessa maneira

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

#define TAMANHO_NOME 150
#define TAMANHO_TELEFONE 20
#define TAMANHO_EMAIL 255

#define QUANTIDADE_MATRICULAS 10

/* Estrutura com os dados da matricula */
struct matricula
{
    char nome[TAMANHO_NOME];
    char telefone[TAMANHO_TELEFONE];
    char email[TAMANHO_EMAIL];
    int numero;
};

int main(void)
{
    int contador;
    struct matricula matriculas[QUANTIDADE_MATRICULAS];

    /* Pega as informações */
    for (contador = 0; contador < QUANTIDADE_MATRICULAS; contador++) {
        printf("Digite seu nome:");
        fgets(matriculas[contador].nome, TAMANHO_NOME, stdin);
        printf("Digite seu RU:");
        scanf("%d%*c", &matriculas[contador].numero);
        printf("Digite seu telefone:");
        fgets(matriculas[contador].telefone, TAMANHO_TELEFONE, stdin);
        printf("Digite seu email:");
        fgets(matriculas[contador].email, TAMANHO_EMAIL, stdin);
    }

    /* Mostra as informações */
    for (contador = 0; contador < QUANTIDADE_MATRICULAS; contador++) {
        printf("\n\tInformacoes do aluno\n");
        printf("RU:%d\n", matriculas[contador].numero);
        printf("Nome:%s", matriculas[contador].nome);
        printf("Telefone:%s", matriculas[contador].telefone);
        printf("Email:%s", matriculas[contador].email);
    }
    getchar();      /* Espera a tecla enter */
    return(0);
}

Veja que no meu exemplo ele não pula as entradas

simples_primeiro.thumb.png.d6bc544b45d97a54ba6183455e17a52c.png

analise o jeito que eu pegue a entrada do teclado para sanar o seu problema.

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

Olá, Alexandre, tudo bem?

10 horas atrás, Alexandre Xisto disse:

Boa Noite pessoal! estou querendo resolver este exercício mas estou em duvida com a lógica

[...]

Minha impressão que tuas maiores dúvidas aparecem quando o assunto é a linguagem e suas funções do padrão, e se tu defines uma site|manual|livro da linguagem c de programação para referências rápidas, resolverá a maioria delas.

Veja

image.png.0b6fa82bb1a3445a5bb7685cfd57efcf.png 

getchar — pega 1 'byte' do fluxo stdin (padrão de entrada).

Fonte: opengroup

Logo

image.png.d8c8c3cd91d90914e256a9c07681ea1e.png

10 horas atrás, Alexandre Xisto disse:
nome = getchar();

A variável (int) nome (acima) tem a cópia do primeiro caractere na entrada (stdin), significa que após ler nome não existe o "Alex" na variável, há somente o 'A' de "Alex" e o resto ("lex") permanece no fluxo, no aguarda de nova leitura.

10 horas atrás, Alexandre Xisto disse:

duvida com a lógica

A lógica poderia|foi|é substituir o separador.

Veja

Tua suposição seria|foi|é que durante entrada os campos são separados por 'NOVA LINHA', semelhante à:

10 horas atrás, Alexandre Xisto disse:

Nome, RU, telefone e e-mail

Ler nome .....  : Blah[ENTER]
Ler RU ........ : Blah[ENTER]
Ler telefone .. : Blah[ENTER]
Ler e-mail ...  : Blah[ENTER]

Ou seja, fora as instruções ao usuário (humano) resta (a máquina) entrada semelhante à:

Blah[ENTER]Blah[ENTER]Blah[ENTER]Blah[ENTER]

Após entrada (inputs), espera-se um resultado (outputs) semelhante à:

10 horas atrás, Alexandre Xisto disse:

utilize o ; (ponto e vírgula) para separador e campo

Blah;Blah;Blah;Blah;

Daí o porquê duma lógica que substitui caractere.

Para isso, escolha|construa o método|função|rotina de entrada e saída ideais|perfeitas.

🙂 

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

13 horas atrás, kgin disse:

você deveria usar fgets() para pegar strings e scanf() para pegar números inteiros e reais.

Agora eu entendi porque não estava recebendo meus números!

 

13 horas atrás, kgin disse:

o enunciado pede para criar uma struct para os elementos do cadastro.

Eu havia até criado uma struct anteriormente, mas estava com duvida de como iria criar um arquivo CSV com ela, por isso tentei fazer apenas com as variáveis.

 

13 horas atrás, kgin disse:
#define TAMANHO_NOME 150
#define TAMANHO_TELEFONE 20
#define TAMANHO_EMAIL 255

Aqui você já definiu o tamanho delas logo no inicio.

13 horas atrás, kgin disse:
for (contador = 0; contador < QUANTIDADE_MATRICULAS; contador++)

com o define ficou bem mais claro, vou procurar fazer dessa forma, já definindo no inicio.

 

Ficou perfeito e consegui entender bem a lógica! Eu Agradeço muito a explicação e a atenção!

 

Mas acho que faltou apenas criar o arquivo CSV, eu não sei dizer se é da mesma forma que fiz.

16 horas atrás, Alexandre Xisto disse:

final salve-os em um arquivo com a extensão CSV, utilize o ; (ponto e vírgula) para separador e campo.

 

Link para o comentário
Compartilhar em outros sites

Pessoal, eu acrescentei algumas sintaxes no código com base no código que o @kgin me enviou, porque ainda preciso tentar gravar os arquivos em um formato CSV;

 

Mas está dando um pequeno erro no Fopen_s (usado em Visual Studio)

queria saber também se o que eu acrescentei esta certo pra vocês.

 

Citação

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <conio.h> //Acrescentando esta biblioteca para pausar o programa.

 

#define TAMANHO_NOME 150
#define TAMANHO_TELEFONE 20
#define TAMANHO_EMAIL 255

#define QUANTIDADE_MATRICULAS 10

// Estrutura com os dados da matricula
struct matricula
{
    char nome[TAMANHO_NOME];
    char telefone[TAMANHO_TELEFONE];
    char email[TAMANHO_EMAIL];
    int numero;
};

int main(void)
{
    FILE* pont_arq;
    pont_arq = fopen_s("3228231.csv", "a");

    setlocale(LC_ALL, "portuguese");


    int contador;
    struct matricula matriculas[QUANTIDADE_MATRICULAS];

    // Pega as informações 
    for (contador = 0; contador < QUANTIDADE_MATRICULAS; contador++) {
        printf("Digite seu nome:");
        fgets(matriculas[contador].nome, TAMANHO_NOME, stdin);
        printf("Digite seu RU:");
        scanf_s("%d%*c", &matriculas[contador].numero);
        printf("Digite seu telefone:");
        fgets(matriculas[contador].telefone, TAMANHO_TELEFONE, stdin);
        printf("Digite seu email:");
        fgets(matriculas[contador].email, TAMANHO_EMAIL, stdin);
    }

    // Mostra as informações
    for (contador = 0; contador < QUANTIDADE_MATRICULAS; contador++) {
        printf("\n\tInformacoes do aluno\n");
        printf("RU:%d\n", matriculas[contador].numero);
        fprintf(pont_arq, matriculas[contador].numero);
        printf("Nome:%s", matriculas[contador].nome);
        fprintf(pont_arq, matriculas[contador].nome);
        printf("Telefone:%s", matriculas[contador].telefone);
        fprintf(pont_arq, matriculas[contador].telefone);
        printf("Email:%s", matriculas[contador].email);
        fprintf(pont_arq, matriculas[contador].email);
    }

    getchar();
    return(0);
}

image.thumb.png.e73f01e15e75993d16b3783ea1601351.png

 

Link para o comentário
Compartilhar em outros sites

  • Solução

@Alexandre Xisto Eu recomendo você começar novamente e dar uma boa lida no tópico do @mauro_b

 

A ideia do algoritmo e basicamente isso.

  1. Pegue todos os 10 registros do usuário
  2. Salve o registro usando RU como nome do arquivo
  3. Faça o passo 2 novamente até completar os 10 registros

Se não compreendeu muito bem, então veja o executável final que eu fiz para demonstrar

testes.zip

 

7 horas atrás, Alexandre Xisto disse:

Mas está dando um pequeno erro no Fopen_s (usado em Visual Studio)

Se você puder trocar de ferramenta recomendo fortemente, o visual studio não suporta (não sei ao certo, já faz tempo que eu testei) nenhuma versão decente da linguagem C.

agora quanto ao erro foi porque você usou o fopen_s() igual ao fopen()

veja a sintaxe correta aqui fopen_s, _wfopen_s

 

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!