Ir ao conteúdo

Posts recomendados

Postado

Estou fazendo um exercicio de estruturas, mas está com problemas na impressão, está passando direto. Preciso validar o cpf tambem e não sei como faço isso.

/*Exercício:
Fazer o algoritmo e o programa em C para ler N registros de
alunos contendo os seguintes campos:
- código (int)
- nome (caractere)
- cpf (caractere)
- notas dos 4 trimestres (vetor de 4 valores reais)
Obs: Ao ler os dados do aluno verifique se o CPF está
correto, utilize uma função para isto. Imprima os resultados lidos em ordem decrescente
de código do aluno e calcule a média das 4 notas.*/

 

#include <stdio.h>  //biblioteca padrão
#include <stdlib.h>
#include <locale.h> //biblioteca de idiomas
#include <conio.h>  //biblioteca do fflush
#include <string.h> //biblioteca de strings
#define Tam_nome 50
#define N 2

//prototipos de funçoes
char valida_cpf();
void cabecalho();
void leitura();
void ordena();
void imprime();

//definição usunado typedef
typedef struct
{
    int cod;
    char nome[Tam_nome];
    char cpf;
    float notas [4];
} turma;

void leitura(turma reg[], int T)
{
    float media, soma=0;

    int i, j;
    for(i=0; i<T; i++)
    {
        printf("Cod: ");
        scanf("%d", &reg[i].cod);
        fflush(stdin);
        printf("Nome do %do. aluno: ", i+1);
        gets(reg[i].nome);
        fflush(stdin);
        printf("CPF: ");
        scanf("%f", &reg[i].cpf);
        fflush(stdin);
        for(j=0; j<4; j++)
        {
            printf(" %da. NOTA: ", j+1);
            scanf("%f", &reg[i].notas[j]);
        }
        fflush(stdin);

        for(j=0; j<4; j++){
            soma = soma + reg[i].notas[j];
            media = soma / N;
        }

        printf("-----------------------------\n");
    }
}

void ordena(turma reg[], int T)
{
    int i, j;
    turma aux;
    for(i=0; i<T-1; i++)
    {
        for(j=i+1; j<T; j++)
        {
            if ((reg[i].cod, reg[j].cod) > 0)
            {
                aux = reg[i];
                reg[i] = reg[j];
                reg[j] = aux;
            }
        }
    }
}

void imprime(turma reg[], int T)
{
    int i;
    float media;
    system("cls");
    printf("Cod    Nome         CPF    Media\n");
    printf("------------------------------------------------------\n");
    fflush(stdin);
    for(i=0; i<T; i++)
    {
        printf("%-5d %-15s %-5c %5.2f\n",
               reg[i].cod,
               reg[i].nome,
               reg[i].cpf,
               media);
               printf("------------------------------------------------------\n");

    }
}

void cabecalho()
{
    printf(" =============================================================\n"
           " ==================== SISTEMA ESCOLAR ========================\n"
           " =============================================================\n");
}

int main()
{
    turma reg[N];
    cabecalho();
    leitura(reg, N);
    ordena(reg, N);
    cabecalho();
    imprime(reg, N);
    return 0;
}

 

  • Amei 1
Postado
39 minutos atrás, Pietra Ester disse:

Estou fazendo um exercicio de estruturas, mas está com problemas na impressão, está passando direto.

Esse problema e por causa que você está deixando a tecla enter no buffer do teclado.

Quando você faz um

	scanf("%d", &reg[i].cod);

a tecla enter vai ficar no buffer, aí quando você fizer outro scanf ele vai pular porque ele já pegou alguma informação do buffer.

 

Para contornar o problema por hora adicione um "%*c" no scanf dessa maneira.

	scanf("%d%*c", &minha_variavel);

 

e pare de usar gets ele não é mais recomendado, utilize fgets() ao invés de gets.

exemplo de como pegar as informações com fgets().

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

#define TAMANHO_NOME 120
#define TAMANHO_CPF 14
#define QUANTIDADE_NOTAS 4

#define QUANTIDADE_ALUNOS 2

struct aluno
{
    int id;
    char nome[TAMANHO_NOME];
    char cpf[TAMANHO_CPF];
    float notas[QUANTIDADE_NOTAS];
};

void
pegaAluno(struct aluno *aluno);

void
mostraAluno(struct aluno *aluno);

int main(void)
{
    struct aluno alunos[QUANTIDADE_ALUNOS];
    int contador;
    
    /* Pega os alunos */
    for (contador = 0; contador < QUANTIDADE_ALUNOS; contador++) {
        pegaAluno(&alunos[contador]);
    }
    
    /* Mostra os alunos */
    for (contador = 0; contador < QUANTIDADE_ALUNOS; contador++) {
        mostraAluno(&alunos[contador]);
    }
    return(0);
}

void
pegaAluno(struct aluno *aluno)
{
    int contador;
    
    /* Pega o codigo do aluno */
    printf("Digite o codigo do aluno:");
    scanf("%d%*c", &aluno->id);
    
    /* Pega o nome do aluno */
    printf("Digite o nome do aluno:");
    fgets(aluno->nome, TAMANHO_NOME-1, stdin);
    
    /* Pega o cpf do aluno */
    printf("Digite o cpf do aluno:");
    fgets(aluno->cpf, TAMANHO_CPF-1, stdin);
    
    /* Pega as notas do aluno */
    for (contador = 0; contador < QUANTIDADE_NOTAS; contador++) {
        printf("Digite a nota %d do aluno %s", contador+1, aluno->nome);
        scanf("%f%*c", &aluno->notas[contador]);
    }
}


void
mostraAluno(struct aluno *aluno)
{
    int contador;
    printf("Codigo:%d\n", aluno->id);
    printf("Nome:%s", aluno->nome);
    printf("Cpf:%s", aluno->cpf);
    
    printf("Notas do a luno\n");
    for (contador = 0; contador < QUANTIDADE_NOTAS; contador++) {
        printf("[%d]-Nota:%.2f\n", contador+1, aluno->notas[contador]);
    }
}

 

48 minutos atrás, Pietra Ester disse:

Preciso validar o cpf tambem e não sei como faço isso.

Para validar o cpf e bem simples, segue o link com um tutorial

Algoritmo de Validação do CPF

  • Curtir 2
  • Obrigado 1
Postado

@Pietra Ester Na parte de converter os números do cpf para decimais você pode usar a função atoi() ou subtrair 48 do caractere que vai te dar o numero correspondente ao caractere.

 

Exemplo

#include <stdio.h>

int main(void)
{
    char caractere = '\0';
    printf("Digite um numero na faixa de 0..9:");
    scanf("%c%*c", &caractere);
    if (caractere >= '0' && caractere <= '9') {
        /* Subtrair o caractere '0' e a mesma coisa de subtrair por 48 da tabela ascii */
        printf("O numero que voce digitou foi:%d\n", caractere-'0');
    } else {
        printf("voce digitou um caractere!\n");
    }
    getchar();
    return(0);
}

de uma olhada na tabela ascii

wikipedia ASCII

  • Curtir 2
Postado
5 horas atrás, Pietra Ester disse:

Fazer o algoritmo e o programa em C para ler N registros de
alunos contendo os seguintes campos:

 

É muito, mas muito mais simples mesmo ler de um arquivo do que ler do teclado em C (ou em qualquer linguagem de que eu me lembre). Se o enunciado diz ler registros faça o simples e leia de um arquivo.

 

Veja:

 

123 Nome123 123.456.789-23 5.5 4.4 3.3 2.2
124 Nome124 123.456.789-23 5.5 4.4 3.3 2.2
125 Nome125 123.456.789-23 5.5 4.4 3.3 2.2
126 Nome126 123.456.789-23 5.5 4.4 3.3 2.2

 

Não é muito mais fácil gravar isso num arquivo usando o mesmo editor do IDE e usar para alimentar o programa? scanf foi escrita para isso

 

Validação de CPF

 

eu, entre outros, já postei várias dessas funções de validação de CPF em C e C++ nesse forum. Pode ver os exemplos pesquisando no meu conteudo no forum. Não tenho a referência agora

 

De seu código

 

      printf("Nome do %do. aluno: ", i+1);
        gets(reg[i].nome);
        fflush(stdin);
        printf("CPF: ");
        scanf("%f", &reg[i].cpf);
        fflush(stdin);
        for(j=0; j<4; j++)
        {
            printf(" %da. NOTA: ", j+1);
            scanf("%f", &reg[i].notas[j]);
        }
        fflush(stdin);

        for(j=0; j<4; j++){
            soma = soma + reg[i].notas[j];
            media = soma / N;
        }

 

Seu programa não está bom e vai ter um trabalho do inf3rno para concluir assim. Por exemplo

  • leia de arquivo e não do teclado
  • não use fflush() na entrada. Sequer está definido.
  • TESTE o retorno de scanf. É ingenuo não testar em um programa de iniciante que pode cancelar a qualquer momento e não precisa tratar todos os erros
  • declare as variáveis de controle do loop NO loop. Em especial com esses nominhos como um simples j
  • use funções. É muito mais simples
  • não escreva tudo antes de testar: vai perder muito tempo
  • Curtir 3
Postado
2 horas atrás, Pietra Ester disse:

você tem um canal no youtube com conteúdos de programação? Ou algum material fora seus tópicos aqui no forum que possam me ajudar em programação?

 

Acho que em geral eu escrevo mais sobre programação do que sobre as linguagens aqui. 

 

De todo  modo acho que é muito difícil falar sobre programação sem alguma linguagem ao menos para exemplos. Muitos tópicos sem linguagem ficam difíceis de discutir, coisas como estruturas de dados por exemplo em geral são discutidas com alguma linguagem em foco.

 

E nessa linha C e C++ são das melhores linguagens para se discutir. C é a linguagem, a que move as coisas. C++ é enorme e tem os objetos e a performance. java tem a performance. Python sai bem na foto, desde que se tenha as corretas bibliotecas --- escritas todas em C --- disponíveis. Linguagens "web" como javascript são parte de um ecossistema em que se preenche mais formulários do que se programa, com coisas como HTML, DOM, servidores, CSS e tal. Uma simples aplicação em React tem ao menos 34.000 linhas e centenas de pacotes (antes de mostrr sequer uma linha na console, assim que se roda um createApp)  e assim é muito difícil/chato para se discutir programação nesse tipo de ambiente. (minha opinião).

 

De que conteúdo sente falta? 

 

 

  • Curtir 1
Postado

@arfneto Esse fórum é mais destinado para universitários em geral, então são conteúdos mais elaborados, não sinto falta de contéudo aqui não porque geralmente as pessoas respondem os tópicos, não é um fórum "morto". Só queria mesmo saber se você tinha algum trabalho em outra plataforma sobre programação, como um canal no youtube por exemplo. 

  • Curtir 1
Postado
4 minutos atrás, Pietra Ester disse:

@arfneto Esse fórum é mais destinado para universitários em geral, então são conteúdos mais elaborados, não sinto falta de contéudo aqui não porque geralmente as pessoas respondem os tópicos, não é um fórum "morto". Só queria mesmo saber se você tinha algum trabalho em outra plataforma sobre programação, como um canal no youtube por exemplo. 

 

Não, não tenho nada assim. Quando tenho tempo livre e vejo alguma questão interessante escrevo aqui e em outros desses forums só. 🙂 Tenho até umas regras, como não mudar nada nos computadores que eu uso, evitar instalar coisas, não escrever sobre a API do Windows diretamente, resistir a ataques de ego de um ou outro usuário, e controlar o tempo gasto nessas coisas 😉  

Para mim era pra ser um canal pra discutir coisas sobre programas e algoritmos e linguagens e tal, para passar o tempo e quem sabe ajudar alguém. Não com alguém que trabalhe para mim ou alguém que tenha me contratado para trabalhar 🤔

 Claro que não há muito disso porque 

  • muitos usuários querem só uma resposta rápida
  • muitos querem responder rapidamente, mesmo sem conteúdo. E se ressentem muito de qualquer solução alternativa ou algo que pareça crítico a eles
  • outros parecem dedicados a mostrar conhecimento rapidamente, sem  tentar explicar o que estão fazendo ou porque

Mas pode ser divertido. Aqui diz que já postei mais de 4.400 coisas 🙂 

  • Curtir 2

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!