PDA

Visualizza versione completa : [C++] Un problema con i record


Downloader
21-12-2004, 20.13.58
Sto scrivendo un programmino che sia in grado di, una volta inseriti un numero n di utenti fare ordinamento o ricerca.
Pero non so il perchè ma durante la fase di ordinamento del nome (visto che è l'unica funzione che ho implementato per ora) l'ultio utente che viene stampato ha tutte le stringhe sballate e i numeri azzerati.

Cosa ho sbagliato?


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

struct studente
{
char nome[20];
char cognome[20];
int anni;
char sesso;
float media_voti;
};
studente classe[10];
studente appo;

void svuota()
{
char leggi_car;
do{
leggi_car=cin.get();
} while (leggi_car!='\n');
}

void stampa(studente classe[10],int &num)
{
for (int i=0;i<num;i++)
{
cout<<"Nome: "<<classe[i].nome<<endl;
cout<<"Cognome: "<<classe[i].cognome<<endl;
cout<<"Anni: "<<classe[i].anni<<endl;
cout<<"Media voti: "<<classe[i].media_voti<<endl;
cout<<"Sesso: "<<classe[i].sesso<<endl;
cout<<endl;
}
}

// Ordinamento per NOME
void ordina_nome(studente classe[10],int &num)
{
int i;

for(i=0;i<num;i++)
{
int a = stricmp (classe[i].nome, classe[i+1].nome);
if (a>0)
{
appo=classe[i];
classe[i]=classe[i+1];
classe[i+1]=appo;
}
}
}


void popola (studente classe[10],int &num)
{
cout<<"Numero di utenti da inserire: ";
cin>>num;
for (int i=0;i<num;i++)
{
cout<<"Completare la "<<i+1<<"a tabella!!"<<endl;
cout<<"Inserisci il nome:"<<endl;
gets(classe[i].nome);
//cin.get (classe[i].nome,15,'\n');
//svuota();
cout<<"Inserisci il cognome: "<<endl;
gets(classe[i].cognome);
//cin.get (classe[i].cognome,15,'\n');
//svuota();
cout<<"Inserire gli anni: ";
cin>>classe[i].anni;
cout<<"Inserisci la media voti: ";
cin>>classe[i].media_voti;
cout<<"Inserire il sesso: ";
cin>>classe[i].sesso;
clrscr();
//svuota;
}
}
void main()
{
clrscr();
int scelta;
int num;

cout<<"MENU: "<<endl;
cout<<"1) Esegui ORDINAMENTO "<<endl;
cout<<"2) Esegui RICERCA "<<endl;
cout<<endl;
cout<<"Scelta operazione: ";
cin>>scelta;
switch(scelta)
{
case 1:{
popola (classe,num);
ordina_nome(classe,num);
stampa(classe,num);
break;
}

default: cout<<"Errore"<<endl;
}
getch();
}

SkAkKo
21-12-2004, 21.12.00
hum..la funzione ordina non mi sembra che puo funzionare..
metti che confronti i primi due e non scambia.. poi il primo lo lascia stare e passa al secondo che lo confronta con il terzo.. e scambia ..ma metti il caso che il terzo è anche + grande del primo ??? poi il ciclo for non puoi farlo arrivare a num perchè strcmp (classe[i].nome, classe[i+1].nome) dove classe[i] supponiamo sia l' ultimo..classe[i+1] vai fuori dall array quindi metti num-1...
devi fare una cosa del genere
int scambio;
do
{
scambio=0;
for (int i=0;i<n-1;i++)
if (v[i]>v[i+1])
{
Scambia(v[i],v[i+1]);
scambio=1;
}
}
while (scambio);
prova cosi..
ciao :p

SkAkKo
21-12-2004, 21.13.37
logicamente al posto di if v[i]>v[i+1] devi mettere la strcmp :D

Downloader
22-12-2004, 16.15.28
Altra cosa:
il programma usa praticamente le stesse funzioni per esempio per ordinare il nome o il cognome.

Voglio ottimizzare il codice in modo tale da dover usare una sola funzione per entrambi i casi, ma non so come fare.
Consigli?

SkAkKo
22-12-2004, 18.28.13
int a;
do
{
scambio=0;
for (int i=0;i<n-1;i++)
{
if (flag)
a=strcmp(classe[i].nome,classe[i+1].nome);
else a=strcmp(classe[i].cognome,classe[i+1].cognome);
if (a)
{
Scambia(classe[i],classe[i+1]);
scambio=1;
}
}
}
while (scambio);
per il momento mi è venuto in mente questo..praticamente metti un altro parametro alla funzione oltre che a studente classe[] e int num
int flag
poi la richiami settando flag a 1 o 0 a seconda che devi ordinare
es.
ordina(classe,10,0) per il cognome
ordina(classe,10,1) per il nome

SkAkKo
22-12-2004, 18.28.57
prova se funziona :p

Downloader
22-12-2004, 19.19.09
Una cosa che non centra nulla:
un errore di runtime si verifica se io immetto un valore che non è compatibile con il formato che ho dichiarato?
es dichiaro una variabile int e durante l'esecuzione ci immetto un carattere.

SkAkKo
22-12-2004, 19.26.31
no..non si verifica ma sicuramente il tuo programma non funzionerà bene :p

Downloader
22-12-2004, 19.30.05
E allora puoi elencarmi le situzioni in cui su puo verificare un errore di runtime?

SkAkKo
22-12-2004, 19.39.34
a me errori di runtime eccetto sui puntatori non gli ho mai riscontrati..non so..ma sicuramente ci sono :p

Downloader
28-12-2004, 16.07.11
void avvio(int &cont)
{
int scelta;
int num;

do{
clrscr();
cout<<"MENU: "<<endl;
cout<<"1) Esegui ORDINAMENTO "<<endl;
cout<<"2) Esegui RICERCA "<<endl;
cout<<endl;
cout<<"Scelta operazione: ";
cin>>scelta;
switch(scelta)
{
case 1:{
cout<<"1) Ordina per NOME"<<endl;
cout<<"2) Ordina per COGNOME"<<endl;
cout<<"3) Ordina per ETA"<<endl;
cout<<"4) Ordina per MEDIA VOTI"<<endl;
cout<<endl;
cout<<"Scelta operazione: ";
cin>>scelta;
switch(scelta)
{
case 1:{
if(cont==1)
{
ordina_nome(classe,num);
stampa(classe,num);
}
else
{
popola(classe,num);
ordina_nome(classe,num);
stampa(classe,num);
}
break;
}

case 2:{
popola (classe,num);
//ordina_nome(classe,num);
//stampa(classe,num);
break;
}

case 3:{
if(cont==1)
{
ordina_nome(classe,num);
stampa(classe,num);
}
else
{
popola(classe,num);
ordina_anni(classe,num);
stampa(classe,num);
}
break;
}

case 4:{
popola (classe,num);
//ordina_nome(classe,num);
//stampa(classe,num);
break;
}
default:cout<<"Errore!"<<endl;

break;
}
case 2:{
cout<<"1) Ricerca per NOME"<<endl;
cout<<"2) Ricerca per COGNOME"<<endl;
cout<<"3) Ricerca per ETA"<<endl;
cout<<"4) Ricerca per MEDIA VOTI"<<endl;
cout<<endl;
cout<<"Scelta operazione: ";
cin>>scelta;
switch(scelta)
{
case 1:{
if(cont==1)
{
ricerca_nome(classe,num);
}
else
{
popola(classe,num);
ricerca_nome(classe,num);
}
break;
}
default: cout<<"Errore!"<<endl;
}
}
}
default: cout<<"Errore"<<endl;

}

cout<<"1) Per rieseguire l'applicazione senza reinserire i dati premere"<<endl;
cout<<"0) Per rieseguire l'applicazione con reinserimento dati premere"<<endl;
cout<<"2) Per terminare l'applicazione premere"<<endl;
cout<<"Scelta operazione: ";
cin>>cont;
} while (cont!=2);
}


Non so il perchè ma ogni volta che finisco di eseguire una operazione ho sempre la schermata per effettuare una ricerca quando io invece non la voglio.
Forse ho impiastricciato un po' troppo con lo switch...

SkAkKo
28-12-2004, 18.19.20
sicuramente mancherà un break da qualche parte :p controlla

Downloader
28-12-2004, 18.20.46
Lo so, ma sinceramente non lo vedo :p

SkAkKo
28-12-2004, 18.24.49
case 4:{
popola (classe,num);
//ordina_nome(classe,num);
//stampa(classe,num);
break;
}
default:cout<<"Errore!"<<endl;

break;
}
break; <----prova qui
case 2:{
cout<<"1) Ricerca per NOME"<<endl;
cout<<"2) Ricerca per COGNOME"<<endl;
cout<<"3) Ricerca per ETA"<<endl;
cout<<"4) Ricerca per MEDIA VOTI"<<endl;
cout<<endl;
cout<<"Scelta operazione: ";
cin>>scelta;
switch(scelta)

Downloader
28-12-2004, 18.29.12
Funziona!!

Azz non sapevo che potevo impostare un break anche fuori dal case.

tnx! :)

SkAkKo
28-12-2004, 18.30.13
di nulla :p

SkAkKo
28-12-2004, 18.31.32
cmq non servono per forza le parentesi...tra un case e l' altro...basta che le metti per aprire e chiudere lo switch