Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Jeovane Carvalho

Comparar variáveis dentro de uma lista encadeada com while

Recommended Posts

Saudações Senhores (as), estou aqui para tentar uma solução, eu desenvolvi uma projeto de menu em C para um trabalho da faculdade, porém estou com um problema dentro dele: eu preciso comparar 2 variáveis tipo: se o  usuário cadastrar uma aluno com uma determinada ela irá ficar armazenada numa lista encadeada, e se ele digitar outra matrícula mas usando o mesmo valor , o programa impede de ele cadastrar, até aí eu conseguir fazer , mas quando o usuário cadastrar outro aluno com outro número de matrícula , na hora de tentar cadastrar a terceira matrícula e suando a mesma segunda matrícula ele deixa fazer o cadastro , pois o certo era impedir e apresentar , MATRÍCULA JÁ FOI CADASTRADA..Exemplo..

 

Cadastrando matricula nº 1 ok , ele não deixa se você tentar usar novamente , mas ao cadastrar a matrícula nº 2 , se tentar usar ele na terceira gravação o programa deixa , e vi que precisava percorrer , pois no while  dando printf ele mostra as matrículas 1 e 2 , e vi quando tento fazer a comparação usando o o while ele compara pelo primeiro  da lista e não percorrer para o segundo, segue o código...

 

#include<stdio.h>
#include<stdlib.h>
#include<locale.h>
#include<string.h>
#define MAX 3

typedef struct lista{
	int matricula;
	int cod;
	int NovaMatricula;
	char aluno[50];
	char disciplina1[50];
	char disciplina2[50];
	char disciplina3[50];
	float nota1;
	float nota2;
	float nota3;
	float nota4;
	float nota5;
	float nota6;
	float nota7;
	float nota8;
	float nota9;
	int vazio;
	struct lista *prox;
	
lista *anterior;
lista *inicio;
lista *novo;
lista *atual;
lista *ultimo;
lista *aux;
	
}Tlista;
 Tlista registros[MAX];

void flush_in(){ 
	int ch;
	while( (ch = fgetc(stdin)) != EOF && ch != '\n' ){} 
	}
	
int verifica_pos( Tlista *dados ) { 
int cont = 0; 
Tlista *aux = dados->inicio; 
while ( aux !=NULL) { 
cont++;
aux = aux->prox; 
} 
return(cont); 
}




void inicializa(Tlista *dados){

	dados-> inicio = NULL;
	dados-> ultimo = NULL;
	dados-> atual = NULL;
    dados-> aux = NULL;
}








// AQUI É O CÓDIGO QUE COMPARA A MATRÍCULA//

//aqui seria a função que teria que comparar todas as matrículas ou códigos se são iguais...//
//FUNÇÃO VERIFICA CÓDIGO
int verifica_cod( Tlista *dados, lista *novo){
    lista *aux=NULL;
	
	printf("\na matricula nova nova  %d\n\n", novo->matricula);
	aux=dados->inicio;

if(aux==NULL){
printf("entrou no primero IF %d",novo->matricula);
return (1);

}



dados->atual=dados->inicio;
if(novo->matricula==aux->matricula){

while(aux!=NULL){


printf("%d",aux->matricula);

aux=aux->prox;

}
return(0);
}

	printf("\n\n  Matricula no FOR: %d\n",dados->atual->matricula);
	printf("entrou no segundo IF %d", novo->matricula);
return (1);


    }//Final da Função Verifica Código








void cadastrar(Tlista *dados, lista *novo){
	
lista* aux=NULL;	


if (!novo){
printf("\nNao existe espaco na memoria!");
exit(1);
}

printf("\n\t\t  Digite Nome do Aluno: ");
    scanf("%s",&novo->aluno);
    
    
	printf("\n\t\t  Digite a 1º  Disciplina : ");
    scanf("%s",&novo->disciplina1);
    flush_in();
    printf("\n\t\t  Nota do 1º Bimestre: ");
	scanf("%f",&novo->nota1);
    fflush(stdin);
    printf("\n\t\t  Nota do 2º Bimestre: ");
    scanf("%f",&novo->nota2);
    fflush(stdin);
    printf("\n\t\t  Nota do 3º Bimestre: ");
    scanf("%f",&novo->nota3);
	
	printf("\n\t\t  Digite a 2º Disciplina : ");
    scanf("%s",&novo->disciplina2);
    fflush(stdin);
    printf("\n\t\t  Nota do 1º Bimestre: ");
	scanf("%f",&novo->nota4);
    fflush(stdin);
    printf("\n\t\t  Nota do 2º Bimestre: ");
    scanf("%f",&novo->nota5);
    fflush(stdin);
    printf("\n\t\t  Nota do 3º Bimestre: ");
    scanf("%f",&novo->nota6);
    
    printf("\n\t\t  Digite a 3º Disciplina :  ",setlocale(LC_ALL,""));
    scanf("%s",&novo->disciplina3);
    fflush(stdin);
    printf("\n\t\t  Nota do 1º Bimestre: ",setlocale(LC_ALL,""));
	scanf("%f",&novo->nota7);
    fflush(stdin);
    printf("\n\t\t  Nota do 2º Bimestre: ",setlocale(LC_ALL,""));
    scanf("%f",&novo->nota8);
    fflush(stdin);
    printf("\n\t\t  Nota do 3º Bimestre: ",setlocale(LC_ALL,""));
    scanf("%f",&novo->nota9);
    
   printf("NOVA %d\n\n", &aux->matricula);
printf("\nA matricula e : %d\n\n",novo->matricula);
novo->prox=NULL;
		
	if(dados->inicio==NULL){
		dados->inicio=novo;
		dados->ultimo=novo;
	}else{
		dados->ultimo->prox=novo;
		dados->ultimo=novo;
		
	}
	
		printf("\nMatricula Cadastrada com sucesso !\n\n");
		system("pause");
}


void listar(Tlista *dados){
	Tlista*aux;
	aux=dados->inicio;
if(aux==NULL){
	printf("\n Lista Vazia ! \n\n");

}else{

dados->atual=dados->inicio;
while(aux!=NULL){


printf("\n\nMatricula %d\n\n", aux->matricula);
aux=aux->prox;
}
}

system("pause");
}


void consultar(Tlista *dados){
int matbusca,encontrou=0;
printf("\n\nDigite a matricula para busca: ");
scanf("%d",&matbusca);

if (dados->inicio==NULL){

printf("\nLista vazia! Busca nao pode ser processada!\n");
}else{

for (dados->atual=dados->inicio; dados->atual!=NULL;dados->atual=dados->atual->prox){

if (matbusca==dados->atual->matricula){
printf("\n\nMatricula: %d\n",dados->atual->matricula);
encontrou=1;
break; 
}

if (dados->atual->prox==NULL && encontrou==0)
printf("\n\nRegistro nao encontrado!\n\n");

}
} 
system("pause");
}




void excluir(Tlista *dados){
lista *anterior ,*atual;
	int numMatricula,encontrou=0;
	if(dados->inicio==NULL){
		printf("Não existe dados para excluir !\n\n");
		system("pause");
		
	}else{
	int numMatricula;
	printf("\nDigite um numero de matricula : ",setlocale(LC_ALL,""));
	scanf("%d", &numMatricula);
		
	anterior=dados->inicio;
	atual=dados->inicio;
	while(atual!=NULL)
	{
		if(atual->matricula==numMatricula){
			if(atual==dados->inicio){
				dados->inicio=dados->inicio->prox;
				free(atual);
				break;
		
			}else{
				if(atual==dados->ultimo){
					dados->ultimo=anterior;
				}
				
				//refazendo o encadeamento//
				anterior->prox=atual->prox;
				free(atual);
				break;
			
		}
	
	
	}else{
	anterior=atual;
	atual=atual->prox;
}
	
	
}
	printf("\nMatricula excluida com sucesso !\n\n");
	system("pause");

}

}




int main(){
	
	Tlista inicio,*aux, L;
	
		int op=0,posicao,retorno,matricula,NovaMatricula;
	inicializa(&L);
		while(op!=6){
			system("cls");
	printf("---   Digite 1 para cadastrar : ");
	printf("\n\n---   Digite 2 para listar : ");
	printf("\n\n---   Digite 3 para consultar : ");
	printf("\n\n---   Digite 4 para excluir : ");
	scanf("%d", &op);

		
		
	
	switch(op)
	{
		
		
		case 1:
			posicao=verifica_pos(&L);
			printf("%d", posicao);
			
			if(posicao!=MAX){
				lista *novo=NULL;
				novo=(lista*)malloc(sizeof(lista));
			
	printf("\n\t\t  Digite o número da matrícula para o aluno : ",setlocale(LC_ALL,""));
    scanf("%d",&novo->matricula);

	fflush(stdin);
	retorno = verifica_cod(&L,novo);
	
	if ( retorno == 1 ){
			cadastrar(&L,novo);
			
			}else{
			 printf("\n\t\tEste número de Matrícula já existe. Tente Outro !\n\n");
		
    printf("\t\t    ");system("pause\n\n");
		

		
		
			
		}
		
	}else{
			
			printf("\n Voce nao pode realizar mais cadastros !\n\n");
			system("pause");
	
	}
			break;
		
		case 2:
			listar(&L);
			getchar();
			break;
		
		
	
	case 3:
			consultar(&L);
			break;
		
		
		case 4:
			excluir(&L);
			break;
		
		case '5':printf("\nFIM DE EXECUCAO!");

getchar();
exit(1);
default:break;
}
	
	}
	
}

Deixei comentado no código para melhor entendimento... Obrigado !

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Sharank
      Strcat Function In C++
       
      I'm new to C and C++ programming, can anyone give me a hint on what I'm doing wrong here. I'm trying to write to concat function that takes to pointers to chars and concatenates the second to the first. The code does do that, but the problem is that it adds a bunch of junk at the end.
       
      For instance, when passing the arguments - "green" and "blue", the output will be "greenblue" plus a bunch of random characters. I also wrote the strlen function that strcat uses, which I will provide below it for reference. I'm using the online compiler at InterviewBit The exact instructions and specification is this:
       
      int main(int argc, char** argv)
      {
      const int MAX = 100;
       
      char s1[MAX];
      char s2[MAX];
       
      cout << "Enter your first string up to 99 characters. ";
      cin.getline(s1, sizeof(s1));
      int size_s1 = strlen(s1);
      cout << "Length of first string is " << size_s1 << "\n";
       
      cout << "Enter your second string up to 99 characters. ";
      cin.getline(s2, sizeof(s2));
      int size_s2 = strlen(s2);
      cout << "Length of second string is " << size_s2 << "\n";
      cout << " Now the first string will be concatenated with the second
      string ";
      char* a = strcat(s1,s2);
       
      for(int i = 0; i<MAX; i++)
      cout <<a;
       
      // system("pause");
      return 0;
      }
       
      //strcat function to contatenate two strings
      char* strcat(char *__s1, const char *__s2)
      {
      int indexOfs1 = strlen(__s1);
      int s2L = strlen(__s2);
      cout <<s2L << "\n";
      int indexOfs2 = 0;
      do{
      __s1[indexOfs1] = __s2[indexOfs2];
      indexOfs1++;
      indexOfs2++;
      }while(indexOfs2 < s2L);
       
       
      return __s1;
      }
       
      //Returns length of char array
      size_t strlen(const char *__s)
      {
      int count = 0;
      int i;
      for (i = 0; __s != '\0'; i++)
      count++;
      return (count) / sizeof(__s[0]);
       
      }
    • Por roberson abalaid
      #include <stdio.h>
      #include <stdlib.h>
      int arr[3][5];
      int main(){
          
          printf("Favor inserir os dados...\n");
          
          for(int i = 0; i < 3; i++){
              for(int j = 0; j < 5; j++){
                  scanf("%d", &arr[j]);
              }
          }
          
            printf("os valores inseridos foram...\n");
          
          for(int i = 0; i < 3; i++){
              for(int j = 0; j < 5; j++){
                  printf("  %d  ", arr[j]);
              }
              printf("\n");
          }
          return 0;
      }
    • Por Lyozeu
      Faça um programa em C com uma função para verificar se um número é positivo ou negativo. Sendo que  o valor de retorno será 1 se positivo, -1 se negativo e 0 se for igual a 0. Faça o programa principal para  chamar e testar a função.
    • Por iguulima
      Bom dia a todos, tenho em meu banco de dados uma tabela de pedidos, onde nesse pedidos estão salvos as id's dos produtos que foram selecionados pelo usuário, gostaria de saber se tem alguma forma utilizando um while que possa selecionar os produtos mais pedidos dessa tabela, não tenho ideia por onde começar. Consigo listar todos apenas mas não sei como selecionar os que são mais pedidos.
    • Por lucassilvaeq
      Alguém poderia me ajudar com essa questão ?
       
      Implemente um algoritmo utilizando a linguagem C, que leia um numero indeterminado de valores inteiros. 
      O valor 0 (zero) finaliza a entrada de dados. Para cada valor lido, determinar se ele e um número par ou ímpar. 
      Se o numero for par, então incluí-lo na FILA PAR; caso contrario, incluí-lo na FILA ÍMPAR. 
      Apos o término da entrada de dados, retirar um elemento de cada fila alternadamente (iniciando-se pela FILA ÍMPAR) ate que ambas as filas estejam vazias. Se o elemento retirado de uma das filas for um valor positivo, entao incluí-lo em uma PILHA; caso contrario, remover um elemento da PILHA. 
      Finalmente, imprimir o conteúdo da pilha.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.