PDA

Visualizza la versione completa : [C] Cancellare un elemento da una struttura dati


tr_gal
23-11-2014, 12:57
Ciao a tutti! ho riscontrato un problema nello scrivere una funzione che permette di cancellare un elemento scelto da utente nella struttura, qualcuno riesce ad aiutarmi?
Vi posto il codice completo(il problema credo che si trovi nella funzione Cancella_studente):

#include <stdio.h>#include <string.h>
#include <stdlib.h>
typedef struct {
char nome[20];
char cognome[30];
char paese[30];
char nazionalita[30];
int matricola;
int voto_programmazione;
int voto_analisi;
int voto_algebra;
int voto_algoritmi;
int voto_architetture;
}studente;


int aggiungi_studente (studente *stud, int n)
{
printf("Inserisci nome studente %d: ", n+1);
scanf("%20s", &stud[n].nome);
printf("Inserisci cognome studente %d: ", n+1);
scanf("%30s", &stud[n].cognome);
printf("Inserisci paese studente %d: ", n+1);
scanf("%30s", &stud[n].paese);
printf("Inserisci nazionalita\' studente %d: ", n+1);
scanf("%30s", &stud[n].nazionalita);
printf("Inserisci matricola studente %d: ", n+1);
scanf("%d", &stud[n].matricola);
do{
printf("Inserisci voto di programmazione dello studente %d (se il voto non \212 presente inserire 31): ", n+1);
scanf("%d", &stud[n].voto_programmazione);
} while(stud[n].voto_programmazione<18 || stud[n].voto_programmazione>31 );
do{
printf("Inserisci voto di analisi matematica dello studente %d (se il voto non \212 presente inserire 31): ", n+1);
scanf("%d", &stud[n].voto_analisi);
} while(stud[n].voto_analisi<18 || stud[n].voto_analisi>31 );
do{
printf("Inserisci voto di algebra e geometria dello studente %d (se il voto non \212 presente inserire 31): ", n+1);
scanf("%d", &stud[n].voto_algebra);
} while(stud[n].voto_algebra<18 || stud[n].voto_algebra>31 );
do{
printf("Inserisci voto di algoritmi e strutture dati dello studente %d (se il voto non \212 presente inserire 31): ", n+1);
scanf("%d", &stud[n].voto_algoritmi);
} while(stud[n].voto_algoritmi<18 || stud[n].voto_algoritmi>31 );
do{
printf("Inserisci voto di architetture degli elaboratori dello studente %d (se il voto non \212 presente inserire 31): ", n+1);
scanf("%d", &stud[n].voto_architetture);
} while(stud[n].voto_architetture<18 || stud[n].voto_architetture>31 );
return 1;
}


void visualizza_studenti (studente *stud,int n)
{
int i;
for(i=0;i<n;i++)
{
printf("\n\nStudente %d:",i+1);
printf("\nNome: %s",stud[i].nome);
printf("\nCognome: %s",stud[i].cognome);
printf("\nPaese: %s",stud[i].paese);
printf("\nNazionalita\': %s",stud[i].nazionalita);
printf("\nMatricola: %d",stud[i].matricola);
if(stud[i].voto_programmazione==31)
printf("\nL\' esame di programmazione non \212 ancora stato superato!");
else
printf("\nVoto programmazione: %d",stud[i].voto_programmazione);
if(stud[i].voto_analisi==31)
printf("\nL\' esame di analisi matematica non \212 ancora stato superato!");
else
printf("\nVoto analisi matematica: %d",stud[i].voto_analisi);
if(stud[i].voto_algebra==31)
printf("\nL\' esame di algebra e geometria non \212 ancora stato superato!");
else
printf("\nVoto algebra e geometria: %d",stud[i].voto_algebra);
if(stud[i].voto_algoritmi==31)
printf("\nL\' esame di algoritmi e strutture dati non \212 ancora stato superato!");
else
printf("\nVoto algoritmi e strutture dati: %d",stud[i].voto_algoritmi);
if(stud[i].voto_architetture==31)
printf("\nL\' esame di architetture degli elaboratori non \212 ancora stato superato!");
else
printf("\nVoto architetture degli elaboratori: %d",stud[i].voto_architetture);
}
}
int cancella_studente (studente *stud,int n)
{
int i, x;
printf("Quale studente si vuole cancellare dall\'archivio?");
scanf("%d",&x);
for(i=x-1;i<n;i++)
{
strcpy(stud[i].nome,stud[i+1].nome);
strcpy(stud[i].cognome,stud[i+1].cognome);
strcpy(stud[i].paese,stud[i+1].paese);
strcpy(stud[i].nazionalita,stud[i+1].nazionalita);
stud[i].matricola==stud[i+1].matricola;
stud[i].voto_programmazione==stud[i+1].voto_programmazione;
stud[i].voto_analisi==stud[i+1].voto_analisi;
stud[i].voto_algebra==stud[i+1].voto_algebra;
stud[i].voto_algoritmi==stud[i+1].voto_algoritmi;
stud[i].voto_architetture==stud[i+1].voto_architetture;
}
n--;
return n;
}


void ricerca_studente (studente *stud,int n)
{
int mat, i;
printf("Inserire la matricola dello studente da cercare: ");
scanf("%d",&mat);
for(i=0;i<n;i++)
if(stud[i].matricola==mat)
{
printf("Lo studente cercato \212 in posizione %d.",i+1);
printf("I voti dello studente %s %s sono: ",stud[i].nome,stud[i].cognome);
if(stud[i].voto_programmazione==31)
printf("\nL\' esame di programmazione non \212 ancora stato superato!");
else
printf("\nVoto programmazione: %d",stud[i].voto_programmazione);
if(stud[i].voto_analisi==31)
printf("\nL\' esame di analisi matematica non \212 ancora stato superato!");
else
printf("\nVoto analisi matematica: %d",stud[i].voto_analisi);
if(stud[i].voto_algebra==31)
printf("\nL\' esame di algebra e geometria non \212 ancora stato superato!");
else
printf("\nVoto algebra e geometria: %d",stud[i].voto_algebra);
if(stud[i].voto_algoritmi==31)
printf("\nL\' esame di algoritmi e strutture dati non \212 ancora stato superato!");
else
printf("\nVoto algoritmi e strutture dati: %d",stud[i].voto_algoritmi);
if(stud[i].voto_architetture==31)
printf("\nL\' esame di architetture degli elaboratori non \212 ancora stato superato!");
else
printf("\nVoto architetture degli elaboratori: %d",stud[i].voto_architetture);
return;
}
printf("Non esiste nessuno studente in archivio corrispondente alla matricola inserita!");
return ;
}
void ricerca_esame (studente *stud, int n)
{
int i,cod;
printf("Cod 1=Programmazione\nCod2=Analisi matematica\nCod3=Algoritmi e strutture dati\nCod 4=Algebra e geometria\nCod 5=Architetture degli elaboratori\n");
do{
printf("Inserisci il codice corrispondente all'esame da cercare: ");
scanf("%d",&cod);
}while(cod<1 || cod>5);


if (cod==1)
{
printf("Lista degli studenti che non hanno sostenuto l'esame di programmazione");
for(i=0;i<n;i++)
if(stud[i].voto_programmazione==31)
printf("%s %s",stud[i].nome,stud[i].cognome);
}
if (cod==2)
{
printf("Lista degli studenti che non hanno sostenuto l'esame di analisi matematica");
for(i=0;i<n;i++)
if(stud[i].voto_analisi==31)
printf("%s %s",stud[i].nome,stud[i].cognome);
}
if (cod==3)
{
printf("Lista degli studenti che non hanno sostenuto l'esame di algoritmi e strutture dati");
for(i=0;i<n;i++)
if(stud[i].voto_algoritmi==31)
printf("%s %s",stud[i].nome,stud[i].cognome);
}
if (cod==4)
{
printf("Lista degli studenti che non hanno sostenuto l'esame di algebra e geometria");
for(i=0;i<n;i++)
if(stud[i].voto_algebra==31)
printf("%s %s",stud[i].nome,stud[i].cognome);
}
if (cod==5)
{
printf("Lista degli studenti che non hanno sostenuto l'esame di architetture degli elaboratori");
for(i=0;i<n;i++)
if(stud[i].voto_architetture==31)
printf("%s %s",stud[i].nome,stud[i].cognome);
}
}
void main()
{
studente *stud;
int n=0, cod;
printf("Cod 1: Aggiungi studente.\nCod 2: Visualizza studente.\nCod 3: Cancella studente.\nCod 4: Ricerca studente per matricola.\nCod 5: Ricerca studenti che non hanno dato un esame inserito.\n");
do{
printf("Inserisci il codice corrispondente alla funziuone da eseguire: \n");
scanf("%d",&cod);
}while(cod<=0 || cod>9);
stud=(studente*)malloc(1*sizeof(studente));
if(stud==NULL)
{
printf("Allocazione non riuscita!");
return;
}
do{
switch (cod)
{
case 1: if (aggiungi_studente(stud,n)==1)
n++;
stud=(studente*)realloc(stud,(n+1));
if(stud==NULL)
{
printf("Allocazione non riuscita!");
return;
}
break;
case 2: visualizza_studenti (stud,n);
break;
case 3: cancella_studente(stud,n);
break;
case 4: ricerca_studente (stud,n);
break;
case 5: ricerca_esame (stud,n);
break;
}
do{
printf("\nInserisci un altro codice (per uscire inserire 0): \n");
scanf("%d",&cod);
}while(cod<0 || cod>9);
}while(cod!=0);

return;
}

torn24
24-11-2014, 11:56
== diverso da = ;)
stud[i].matricola==stud[i+1].matricola;

tr_gal
24-11-2014, 19:54
Ah se sono dura :facepalm: grazie mille!! :o

Loading