Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1

    aiutoo

    sono un nuovo iscritto e un principiante del c...
    non riesco a compilare questo codice...
    qualcuno può darmi una mano???
    ci sono 2 errorini...
    codice:
    #include <stdlib.h>
    #include <ctype.h>
    #include <stdio.h>
    #include <string.h>
    
    #define MAX_STRING 55
    #define MAX_LINE 512
    
    typedef enum tagEnumStati
    {
    	STATO_COGNOME,
    	STATO_MATRICOLA,
    	STATO_VOTO,
    	STATO_ERRORE
    } EnumStati;
    
    typedef struct tagStudenti
    {
    	char Cognome[MAX_STRING];
    	int Matricola;
    	int Voto;
    } Studenti;
    
    int OttieniNumRecordsDaFileTesto(const char* szNomeFile)
    {
    	FILE *fp;
    
    	char c;
    	int nCountRighe = 0;
    
    	fp = fopen(szNomeFile, "r");
    	if ( !fp )
    	{
    		printf("Errore nell'apertura del file %s\n", szNomeFile);
    		return 0;
    	}
    
    	while ( fread((void*)&c,  1, 1, fp) == 1 )
    	{
    		if ( c == '\n' )
    		{
    			nCountRighe++;
    		}
    	}
    
    	fclose(fp);
    
    	return nCountRighe - 1; /* -1 perchè la prima riga contiene i nomi dei campi */
    }
    
    int LeggiRecords(const char* szNomeFile, Studenti * pStud)
    {
    	EnumStati stato = STATO_COGNOME;
    	int z = 0;
    	int nRec = 0;
    
    	FILE *fp; 
    
    	char str[MAX_STRING];
    	char c;
    
    	/* Apriamo il file per la lettura */
    	fp = fopen(szNomeFile, "r");
    	if ( !fp )
    	{
    		printf("Errore nell'apertura del file\n");
    		return 0;
    	}
    
    	/* Saltiamo la prima riga perchè contiene i nomi dei campi */
    	while ( fread((void*)&c,  1, 1, fp) == 1 )
    	{
    		if ( c == '\n' )
    			break;
    	}
    
    	while ( fread((void*)&c,  1, 1, fp) == 1 )
    	{
    		if ( (c != '\r') && (c != '\n') && (c != ';') )
    		{
    			str[z++] = c;
    		}
    		else if ( c == ';' || c == '\n')
    		{
    			str[z] = '\0';
    
    			switch ( stato )
    			{
    			case STATO_COGNOME:
    				strcpy(pStud[nRec].Cognome, str);
    				stato = STATO_MATRICOLA;
    				printf("%s;", pStud[nRec].Cognome);
    				break;
    			case STATO_MATRICOLA:
    				pStud[nRec].Matricola = atoi(str);
    				stato = STATO_VOTO;
    				printf("%d;", pStud[nRec].Matricola);
    				break;
    			case STATO_VOTO:
    				pStud[nRec].Voto = atoi(str);
    				stato = STATO_COGNOME;
    				printf("%d\n", pStud[nRec].Voto);
    				break;
    			default:
    				stato = STATO_ERRORE;
    				break;
    			}
    			
    			z = 0;
    			str[0] = '\0';
    
    			if ( c == '\n' )
    				nRec++;
    		}
    	}
    
    	fclose(fp);
    	fp = NULL;
    
    	return 1;
    }
    
    int ScriviRecords(const char* szNomeFile, const Studenti* pStud, int nRighe)
    {
    	int y;
    
    	char *szNomiCampi = "Cognome;Matricola;Voto\n";
    
    	FILE *fp; 
    
    	char str[MAX_LINE];
    
    	/* Apriamo il file per la scrittura */
    	fp = fopen(szNomeFile, "w");
    	if ( !fp )
    	{
    		printf("Errore nell'apertura del file %s\n", szNomeFile);
    		return 0;
    	}
    
    	/* La prima riga del file deve contenere i nomi dei campi */
    	fwrite(szNomiCampi, strlen(szNomiCampi), 1, fp);
    
    	/* Scriviamo i record nel file */
    	for (y = 0; y < nRighe; y++)
    	{
    		sprintf(str, "%s;%d;%d\n", pStud[y].Cognome, pStud[y].Matricola, pStud[y].Voto);
    		fwrite(str, strlen(str), 1, fp);
    	}
    
    	fclose(fp);
    	fp = NULL;
    
    	return 1;
    }
    
    void mergesort(Studenti *a, Studenti *b, int l, int r, int nOrdinaPer)
    {
    	int i, j, k, m;
    
    	if ( r > l )
    	{
    		m = (r+l)/2;
    
    		mergesort(a, b, l, m, nOrdinaPer);
    		mergesort(a, b, m+1, r, nOrdinaPer);
    
    		for (i = m+1; i > l; i--)
    			b[i-1] = a[i-1];
    
    		for(j = m; j < r; j++)
    			b[r+m-j] = a[j+1];
    
    		switch ( nOrdinaPer )
    		{
    		case 'c':
    		case 'C':
    			for(k = l; k <= r; k++)
    				a[k] = (strcmp(b[i].Cognome, b[j].Cognome) < 0) ? b[i++] : b[j--];
    			break;
    		case 'm':
    		case 'M':
    			for(k = l; k <= r; k++)
    			{
    				if ( (b[i].Matricola < b[j].Matricola) )
    					a[k] = b[i++];
    				else if ( (b[i].Matricola > b[j].Matricola) )
    					a[k] = b[j--];
    				else
    					a[k] = (strcmp(b[i].Cognome, b[j].Cognome) < 0) ? b[i++] : b[j--];
    			}
    			break;
    		case 'v':
    		case 'V':
    			for(k = l; k <= r; k++)
    				if ( (b[i].Voto < b[j].Voto) )
    					a[k] = b[i++];
    				else if ( (b[i].Voto > b[j].Voto) )
    					a[k] = b[j--];
    				else
    					a[k] = (strcmp(b[i].Cognome, b[j].Cognome) < 0) ? b[i++] : b[j--];
    			break;
    		}
    	}
    }
    
    int main(void)
    {
    	char *szNomeFileIn = "Studenti.txt";
    	char *szNomeFileOut = "StudentiOut.txt";
    	int c;
    	int NumRecords;
    
    	Studenti *pStud, *pStudTemp;
    
    	NumRecords = OttieniNumRecordsDaFileTesto(szNomeFileIn);
    	if ( NumRecords <= 0 )
    	{
    		printf("Il file %s non contiene records.", szNomeFileIn);
    		return -1;
    	}
    
    	pStud = malloc(NumRecords * sizeof(Studenti));
    	if(!pStud)
    	{
    		printf("Memoria insufficiente.\n");
    		return -1;
    	}
    
    	pStudTemp = malloc(NumRecords * sizeof(Studenti));
    	if(!pStudTemp)
    	{
    		printf("Memoria insufficiente.\n");
    		return -1;
    	}
    
    	if ( !LeggiRecords(szNomeFileIn, pStud) )
    	{
    		printf("Errore nella lettura dei records.\n");
    		return -1;
    	}
    
    	while ( 1 )
    	{
    		printf("\n\nInserisci una delle seguenti lettere:\n");
    		printf("C -> ordina per Cognome\n");
    		printf("M -> ordina per Matricola\n");
    		printf("V -> ordina per Voto\n");
    		printf("Una qualunque altra lettera per uscire.\n");
    		printf("Scelta: ");
    		fflush(stdin);
    		c = getchar();
    
    		mergesort(pStud, pStudTemp, 0, NumRecords-1, c);
    		if ( !ScriviRecords(szNomeFileOut, pStud, NumRecords) )
    		{
    			printf("Errore nella scrittura dei records.\n");
    			return -1;
    		}
    		else
    		{
    			switch ( c )
    			{
    			case 'c':
    			case 'C':
    				printf("I records, ordinati per cognome, sono stati scritti nel file %s\n", szNomeFileOut);
    				break;
    			case 'm':
    			case 'M':
    				printf("I records, ordinati per matricola, sono stati scritti nel file %s\n", szNomeFileOut);
    				break;
    			case 'v':
    			case 'V':
    				printf("I records, ordinati per voto, sono stati scritti nel file %s\n", szNomeFileOut);
    				break;
    			default:
    				return 0;
    			}
    		}
    	}
    
    	if ( pStud )
    		free(pStud);
    
    	if ( pStudTemp )
    		free(pStudTemp);
    	
    	return 0;
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    92
    Dicci dove si presenta l'errore..

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304

    Moderazione

    Prima di tutto benvenuto.
    C'è un regolamento, fra le discussioni in rilievo: ti consiglio di leggerlo, specialmente la parte riguardante i titoli.

    E' obbligatorio specificare un titolo che sia decente: esso deve rappresentare un sunto del contenuto della discussione (aiuto non vuol dire assolutamente nulla).

    E' obbligatorio indicare nel titolo (fra parentesi quadre) il linguaggio utilizzato.

    E' necessario postare il codice all'interno dei tag [code] e [/code] in modo da renderlo leggibile: senza questo espediente il codice risulta un'accozzaglia indistinta di caratteri.

    Inoltre, è sempre buona norma specificare il tipo di errore e, possibilmente, la sua posizione nel codice: questo per evitare di costringere la gente a prendersi il codice e compilarselo in locale.


    Questa discussione la sistemo io.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it L'avatar di preben
    Registrato dal
    Mar 2008
    Messaggi
    78
    Principiante del C, e devi compilare un codice di 100 righe...
    Di solito un principiante scrive il classico "Hello world"
    Ciao!

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462

    Re: aiutoo

    Originariamente inviato da elyyloz
    ci sono 2 errorini...
    E' una caccia al tesoro?

    Comunque ... mi sembra che devi modificare solamente queste due righe

    pStud = (Studenti *)malloc(NumRecords * sizeof(Studenti));


    pStudTemp = (Studenti *)malloc(NumRecords * sizeof(Studenti));
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    92

    Re: Re: aiutoo

    Originariamente inviato da oregon
    E' una caccia al tesoro?
    Ahahahahah

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.