If this is your first visit, be sure to
check out the FAQ by clicking the
link above. You may have to register
before you can post: click the register link above to proceed. To start viewing messages,
select the forum that you want to visit from the selection below.
per passare da ordinamento crescente a decrescente puoi definire una nuova funzione nella quale scambi i segni > e <, oppure definisci un'unica funzione di questo tipo
ordina (...., type)
{
if( type == 'c' ) //metti tutto il codice con il segno <
if( type == 'd' ) //metti tutto il codice con il segno >
}
e poi chiami a seconda dei casi ordina(...'c') e ordina(...'d')
il bello della generalizzazione
più le cose sono astratte(e specializzate) e meglio sono...
Raga ho provato ad aggiungere la parte per il riconoscimento dei maschi e delle femmine e la scrittura su file , nella compilazione non ci sono errori ma non mi scrive i file.
Questo è il listato
Codice:
#include<stdio.h>
#include<conio.h>
struct studente { char cognome[20];char sesso[2];int voto;};
/*il penultimo ; puoi anche toglierlo ma ti da un warning*/
int acquisisci(FILE*,struct studente*);
void ordina (int,struct studente*);
void maschi (int, struct studente*);
main()
{
FILE *fpi;
int N;
struct studente classe [20];
fpi=fopen("studenti.txt","r");
if(fpi==NULL)
printf("Il file non esiste");
else
{
printf("*ELENCO DEGLI STUDENTI ACQUISITO DA FILE* \n\n\n\n");
N=acquisisci(fpi,classe);
ordina(N,classe);
maschi(N,classe);
}
getch();
}
int acquisisci(FILE *A,struct studente *B)
{
int i=0;
while(fscanf(A,"%s%s%d",B[i].cognome,B[i].sesso,&B[i].voto)!=EOF)
{
printf("cognome= %s sesso= %s voto= %d \n\n" ,B[i].cognome,B[i].sesso,B[i].voto);
i++;
}
fclose(A);
return i;
}
void ordina (int A,struct studente *B)
{
int i,j,imin;
struct studente temp;
/*devo dichiarare temp di tipo struct perchè al suo interno ha B[i]
che è di quel tipo */
for (i=0;i<A-1;i++)
{ imin=i;
for(j=i+1;j<A;j++)
{
if(B[j].voto<B[imin].voto)
imin=j;
}
/*dopo aver ordinato le componenti per voto crescente sposto anche tutte le altre
conponenti delllo struct studente quindi uso B[i] e non B[i].voto*/
temp=B[i];
B[i]=B[imin];
B[imin]=temp;
}
/*l'eventuale stampa a video sempre fuori il primo ciclo di for cioè
for (i=0;i<A-1;i++) */
printf("\n\n\n*ORDINAMENTO DEGLI STUDENTI PER VOTO* \n\n\n\n");
for(i=0;i<A;i++)
printf("cognome= %s sesso= %s voto= %d \n\n",B[i].cognome,B[i].sesso,B[i].voto);
}
void maschi(int C, struct studente *D)
{
FILE *fpm,*fpf;
int i,j,k;
struct studente maschio[j],femmina[k];
i=j=k=0;
for(i=0;i<C;i++)
{
if(D[i].sesso=='M')
{
D[i]=maschio[j];
j++;
}
else
{
D[i]=femmina[k];
k++;
}
}
fpm=fopen("maschio.txt","w");
if(fpm==NULL)
printf("Non riesco a scrivere il file");
else
{
for(i=0;i<j;i++)
fprintf(fpm,"%s %s %d \n",maschio[i].cognome,maschio[i].sesso,maschio[i].voto);
}
fclose(fpm);
fpf=fopen("femmina.txt","w");
if(fpf==NULL)
printf("Non riesco a scrivere il file");
else
{
for(i=k;i=0;i--)
fprintf(fpf,"%s %s %d \n",femmina[i].cognome,femmina[i].sesso,femmina[i].voto);
}
fclose(fpf);
}
dove ti da errore di preciso? Ah, io nella dichiarazione delle variabili scriverei FILE* fpm,fpf;
no la dichiarazione dei puntatori a file va bene l'ho usata nella funzione di sopra cn successo.
Per quanto riguarda l'errore esce nel momento in cui va a ricercare se il d contiene M .
mi sa che è questo l'errore, vedo cm ovviare al problema.
o che prima conti tutti i maschi e le femmine e allochi dinamicamente due vettori con la malloc oppure li fai della grandezza del vettore sorgente fregandotene della corrispondenza tra dimensione fisica e logica del vettore (io userei la malloc)
o che prima conti tutti i maschi e le femmine e allochi dinamicamente due vettori con la malloc oppure li fai della grandezza del vettore sorgente fregandotene della corrispondenza tra dimensione fisica e logica del vettore (io userei la malloc)
io malloc ancora non lo ho fatta quindi devo trovare un altra maniera
Adesso ho scoperto un 'altra cosa fantastica che non mi riconosce iol carattere M nel file acquisito.
In pratica considera tutte femmine infatti facendo questa prova mi escono che ha contato tutte femmine.
We process personal data about users of our site, through the use of cookies and other technologies, to deliver our services, personalize advertising, and to analyze site activity. We may share certain information about our users with our advertising and analytics partners. For additional details, refer to our Privacy Policy.
By clicking "I AGREE" below, you agree to our Privacy Policy and our personal data processing and cookie practices as described therein. You also acknowledge that this forum may be hosted outside your country and you consent to the collection, storage, and processing of your data in the country where this forum is hosted.
Commenta