Ir ao conteúdo

Posts recomendados

Postado

Oi, pessoal, boa tarde!

Estou começando a programar em C, estou em dúvida nisso:

 

Estou criando um sistema de cadastro de alunos em C, o problema é na parte de pesquisar aluno. Exemplo, se eu cadastrar 2 alunos, Leonardo e Juliana, quando eu for pesquisar pela Juliana que foi a segunda cadastrada, Sempre vem o cadastro do Leonardo, pois ele foi o primeiro que eu cadastrei.

 

esse é o código: 

#include <stdio.h>
#include <string.h>
#define MAX_ALUNOS 50
typedef struct
{
  char nome[50], sobrenome[50], curso[10], email[100], cpf[11], ra[9];
  int ativo;
} Aluno;
Aluno alunos[MAX_ALUNOS];

void menu();
void cadastrar();
void remover();
void pesquisar();
void listar();

int main(int argc, char const *argv[])
{
  menu();
  return 0;
}
void menu()
{
  system("clear");
  int op;
  do
  {
    printf("SISTEMA CADASTRO\n");
    printf("1- cadastrar aluno\n2- remover aluno\n3- pesquisar aluno\n4- Listar alunos\n0- sair\n");
    scanf("%d", &op);
    getchar();
    switch (op)
    {
    case 1:
      cadastrar();
      break;
    case 3:
      pesquisar();
      break;
    case 4:
      listar();
      break;
    }
    getchar();
  } while (op != 0);
}
void cadastrar()
{
  char nome[50], sobrenome[50], curso[10], email[100], cpf[12], ra[12];
  int op;
  do
  {
    system("clear");
    printf("CADASTRAR NOVO ALUNO\n");
    printf("Nome: ");
    fgets(nome, sizeof(nome), stdin);
    printf("Sobrenome: ");
    fgets(sobrenome, sizeof(sobrenome), stdin);
    printf("RA: ");
    fgets(ra, sizeof(ra), stdin);
    printf("Email: ");
    fgets(email, sizeof(email), stdin);
    printf("Curso (Ex: TADS, ENG, BIOMED, etc): ");
    fgets(curso, sizeof(curso), stdin);
    printf("CPF: ");
    fgets(cpf, sizeof(cpf), stdin);
    printf("\n1 - continuar\n0 - sair\n");
    for (int i = 0; i < MAX_ALUNOS; ++i)
    {
      if (alunos[i].ativo == 0)
      {
        strcpy(alunos[i].nome, nome);
        strcpy(alunos[i].sobrenome, sobrenome);
        strcpy(alunos[i].ra, ra);
        strcpy(alunos[i].email, email);
        strcpy(alunos[i].curso, curso);
        strcpy(alunos[i].cpf, cpf);
        alunos[i].ativo = 1;
        break;
      }
    }
    scanf("%d", &op);
  } while (op != 0);
  getchar();
}
void remover()
{
}
void pesquisar()
{
  system("clear");
  char nome[50], sobrenome[50], curso[10], email[100], cpf[12], ra[12];
  printf("Digite o nome do aluno para pesquisar: ");
  fgets(nome, sizeof(nome), stdin);
  for (int i = 0; i < MAX_ALUNOS; ++i)
  {
    if (strpbrk(alunos[i].nome, nome) != NULL)
    {
      printf("\nNome: %s", alunos[i].nome);
      printf("Sobrenome: %s", alunos[i].sobrenome);
      printf("RA: %s", alunos[i].ra);
      printf("Email: %s", alunos[i].email);
      printf("Curso: %s", alunos[i].curso);
      printf("CPF: %s", alunos[i].cpf);
      printf("-----------------------\n");
    }
    else
    {
      printf("NENHUM ALUNO ENCONTRADO");
    }
    break;
  }
}
void listar()
{
  system("clear");
  printf("LISTA DE ALUNOS\n");
  for (int i = 0; i < MAX_ALUNOS; ++i)
  {
    if (alunos[i].ativo == 1)
    {
      printf("\n-----------------------\n");
      printf("Nome: %s", alunos[i].nome);
      printf("Sobrenome: %s", alunos[i].sobrenome);
      printf("RA: %s", alunos[i].ra);
      printf("Email: %s", alunos[i].email);
      printf("Curso: %s", alunos[i].curso);
      printf("CPF: %s", alunos[i].cpf);
      printf("\n-----------------------\n");
    }
  }
}

 

Fico no aguardo da ajuda de vocês...

Abraço!

Postado
11 minutos atrás, Flávio Pedroza disse:

O que você acha que a função strpbrk faz?

Então, eu queria poder pesquisar ou pelo nome completo ou por algumas palavras, exemplo, escrever Leo e encontrar o cadastro do Leonardo, eu estava usando a função strstr mas ela só encontrava a palavra completa, me falaram pra usar a strpbrk, e deu certo, mas teve esse problema de só mostrar o primeiro cadastro.

Postado

 

Essa função não serve para o seu propósito. Rode o código abaixo e observe o resultado:

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

int main()
{
    char* s = strpbrk("Leonardo", "Juliana");
    printf("%s", s);

    return 0;
}

 

Perceba que são palavras completamente diferentes, mas ainda assim a função retornou um resultado não nulo.

Na realidade, se pelo menos uma letra coincidir, não importa a posição, a função retornar um resultado não nulo.

A função que procura é char *strstr(const char *str1, const char *str2)

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

int main()
{
    char* s = strstr("Leonardo", "Juliana");
    printf("%s", s);

    return 0;
}

Retorna nulo, como você espera 

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

int main()
{
    char* s = strstr("Leonardo", "Leo");
    printf("%s", s);

    return 0;
}

Retorna não nulo, pois, "Leo" está contido na palavra "Leonardo"

Postado

Olá

 

Antes de se preocupar com critérios de pesquisa acho que devia se preocupar em ter um modelo consistente e rodando.

 

Sobre seu programa:

 

Escreva em torno dos dados.

Não está nada conveniente do modo como escreveu. 

E não escreva um programa interativo. Não vai aprender nada e só vai perder tempo. Quanto tempo leva a cada vez que vai testar isso? Para que um menu? Seis campos de aluno?

 

Compare isso do original

 

#define MAX_ALUNOS 100
typedef struct
{
    char nome[50], sobrenome[50], curso[10], email[100], cpf[11], ra[9];
    int  ativo;
} Aluno;
Aluno alunos[MAX_ALUNOS];

void menu();
void cadastrar();
void remover();
void pesquisar();
void listar();

 

Com essa possibilidade

 

Esse é o normal em C

 

typedef struct
{
    char nome[50];
    char sobrenome[50];
    char curso[10];
    char email[100];
    char CPF[15] char RA[9];
    int               ativo;

} Aluno;

typedef struct
{
    int   n;           // quantos tem agora
    int   capacidade;  // maximo desta turma
    char  nome[50];    // nome da turma
    Aluno aluno[MAX_ALUNOS];

} Turma;

Turma* apagar_turma(Turma*);
Turma* criar_turma(int limite);

int cadastrar(Aluno* al, Turma* T);
int listar(Turna*);
int pesquisar(Aluno* al, Turma* T);
int remover(Aluno* al, Turma* T);

 

  • Seu modelo gira em torno de uma Turma mas não tem esse conceito no seu programa, então fica tudo mais difícil. Um vetor é muito pouco. Vai precisar de um contador e daquela constante MAX toda hora e isso deixa o programa frágil e chato.
  • Suas funções usam apenas dados globais e são pouco úteis assim. E muito frágeis. Tudo pode dar errado. NUNCA use globais. Imagine se tiver que tratar várias turmas... 
  • Evite void e em especial evite funções sem argumentos. Compare com as funções no segundo modelo e imagine a diferença. Se não vê diferença não continue programando isso enquanto não ver.
  • por exemplo veja sua função listar() que só lista os alunos de um único vetor... Não escreva assim.
            printf("\n-----------------------\n");
            printf("Nome: %s", alunos[i].nome);
            printf("Sobrenome: %s", alunos[i].sobrenome);
            printf("RA: %s", alunos[i].ra);
            printf("Email: %s", alunos[i].email);
            printf("Curso: %s", alunos[i].curso);
            printf("CPF: %s", alunos[i].cpf);
            printf("\n-----------------------\n");

 

  • Entenda que um printf de 8 linhas é dezenas de vezes melhor que 8 printf() de uma linha....
  • E está repetindo os nomes dos campos toda hora e tudo desalinhado. Não vai ficar bom.
  • não use system(). Nunca. Para nada. Não vai aprender nada. Não vai estar fazendo nada exceto passar uma string para o sistema na esperança de que seja o sistema que esteja lá para rodar o que espera.
     

 

 

 

 

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!