Manipolazione di array bidimensionali

di il
7 risposte

Manipolazione di array bidimensionali

Ciao,
devo svolgere un esercizio di manipolazione di array bidimensionali dove devo calcolare la media dei voti di alcuni studenti, il voto più alto ed il voto più basso. Vi riporto lo svolgimento scritto sul libro di testo:
// Manipolazione di array bidimensionali
#include <stdio.h>
#define STUDENTS 3 
#define EXAMS 4

// Funzioni
int minimum( const int grades[][EXAMS], size_t pupils, size_t tests) {  // Trova il voto minimo
	int lowGrade = 100;  // Voto il più alto possibile
	for(size_t i = 0; i < pupils; ++i) {  // ciclo per le righe di grades
		for(size_t j = 0; j < tests; ++j) {  // ciclo per le colonne di grades
			if(grades[i][j] < lowGrade) {
				lowGrade = grades[i][j];
			}
		}
	}
	return lowGrade;  // restituisci il voto minimo
}

int maximum(const int grades[][EXAMS], size_t pupils, size_t tests) {  // Trova il voto massimo
	int highGrade = 0;  // voto il più basso possibile
	for(size_t i = 0; i < pupils; ++i) {  // ciclo per le righe di grades
		for(size_t j = 0; j < tests; ++j) {  // ciclo per le colonne di grades
			if(grades[i][j] > highGrade) {
				highGrade = grades[i][j];
			}
		}
	}
	return highGrade;  // restituisci il voto massimo
}

double average(const int setOfGrades[], size_t tests) {  // Determina il voto medio per ogni studente
	int total = 0;  // somma dei voti degli esami
	for(size_t i = 0; i < tests; ++i) {  // totale di tutti i voti per uno studente
		total += setOfGrades[i];
	}
	return (double) total / tests;  // media
}

void printArray(const int grades[][EXAMS], size_t pupils, size_t tests) {  // Stampa l'array
	printf("%s", "                 [0]  [1]  [2]  [3]");  // Stampa le intestazioni delle colonne
	for(size_t i = 0; i < pupils; ++i) {  // Stampa le intestazioni delle colonne
		printf("\nstudentGrades[%u] ", i);  // Stampa l'etichetta per la riga
		for(size_t j = 0; j < tests; ++j) {  // Stampa i voti per uno studente
			printf("%-5d", grades[i][j]);
		}
	}
}

// Main
int main(void) {
	// Inizializza i voti per i 3 studenti (righe)
	int studentGrades[STUDENTS][EXAMS] = { {77, 68, 86, 73}, {96, 87, 89, 78}, {70, 90, 86, 81} };
	// Stampa l'array studentGrades
	puts("The array is:");
	printArray(studentGrades, STUDENTS, EXAMS);
	// Determina i valori minimo e massimo dei voti
	printf("\n\nLowest grade:  %d\nHighest grade:  %d\n", minimum(studentGrades, STUDENTS, EXAMS), maximum(studentGrades, STUDENTS, EXAMS));
	// Calcola la media dei voti per ogni studente
	for(size_t student = 0; student < STUDENTS; ++student) {  // calcola la media dei voti per ogni studente
		printf("The average grade for student %u is %.2f\n", student, average(studentGrades[student], EXAMS));
	}
}
che da come output questo:
The array is:
[0] [1] [2] [3]
studentGrades[0] 77 68 86 73
studentGrades[1] 96 87 89 78
studentGrades[2] 70 90 86 81

Lowest grade: 68
Highest grade: 96
The average grade for student 0 is 76.00
The average grade for student 1 is 87.50
The average grade for student 2 is 81.75
Time elapsed: 000:00:156
Press any key to continue
Il mio problema è però che voglio far inserire da schermo i voti degli studenti ma non so come acquisire i dati per un array bidimensionale. Ho provato con questo codice che però si blocca.
#include <stdio.h>

#define DIM 20
#define RIGHE 10
#define COLONNE 10
#define STUDENTI 3
#define MATERIE 4

int main(void) {
	
	int array[DIM][DIM];
	char materia1[DIM];
	char materia2[DIM];
	char materia3[DIM];
	char materia4[DIM];
	char studente1[DIM];
	char studente2[DIM];
	char studente3[DIM];	
	int i = 0;
	int j = 0;
	
	printf("Questo e' un programma che per ogni studente raffigura le sue votazioni in ciascuna materia, poi ne calcola ");
	printf("il voto piu' alto ed il voto piu' basso tra tutti e per ciascuno studente ne calcola il voto medio.\n\n");
	
	printf("Inserire i nomi delle %d materie:\n", MATERIE);
	printf("\nMateria 1:  ");
	scanf("%s", materia1);
	printf("Materia 2:  ");
	scanf("%s", materia2);
	printf("Materia 3:  ");
	scanf("%s", materia3);
	printf("Materia 4:  ");
	scanf("%s", materia4);	
	
	printf("Inserire i nomi dei %d studenti:", STUDENTI);
	printf("\nStudente 1:  ");
	scanf("%s", studente1);
	printf("Studente 2:  ");
	scanf("%s", studente2);
	printf("Studente 3:  ");
	scanf("%s", studente3);	
	
	puts("\n");	
	
	printf("Inserire i voti di %s in %s, %s, %s, %s:  ", studente1, materia1);
	
	for(i = 0; i < MATERIE; ++i) {
		scanf("%d", &array[0][i]);
	}
	
	for(i = 0; i < MATERIE; ++i) {
		printf("%d", array[0][i]);
	}

	puts("\n");	
	return 0;
}
che da come output questo:
Questo e' un programma che per ogni studente raffigura le sue votazioni in ciascuna materia, poi ne calcola il voto piu' alto ed il voto piu' basso tra tutti e per ciascuno studente ne calcola il voto medio.

Inserire i nomi delle 4 materie:

Materia 1: Italiano
Materia 2: Storia
Materia 3: Geografia
Materia 4: Matematica
Inserire i nomi dei 3 studenti:
Studente 1: Pino
Studente 2: Giuseppe
Studente 3: Peppino


Time elapsed: 000:39:141
Press any key to continue

7 Risposte

  • Re: Manipolazione di array bidimensionali

    Devi scegliere: o usi 250 array o usi una matrice. Poi che ti servono le materie? Se vuoi considerare pure quelle, il rango della matrice non è più 2 bensì…
  • Re: Manipolazione di array bidimensionali

    Anche se volessi usare una matrice per memorizzare le materie e gli studenti (che non so utilizzare, a meno che tu non parli di una "struttura dati" che è nei capitoli successivi) come faccio ad utilizzare la scanf per acquisire un dato di un array bidimensionale? La sintassi è sempre:
    scanf("%d", &array[0][i]);
    oppure è qualcosa di diverso??
  • Re: Manipolazione di array bidimensionali

    JackieJack1207 ha scritto:


    Anche se volessi usare una matrice per memorizzare le materie e gli studenti (che non so utilizzare, a meno che tu non parli di una "struttura dati" che è nei capitoli successivi) come faccio ad utilizzare la scanf per acquisire un dato di un array bidimensionale? La sintassi è sempre:
    scanf("%d", &array[0][i]);
    oppure è qualcosa di diverso??
    Forse (forse si) per matrice intendi proprio un array bidimensionale... ma resta la domanda di scanf....!
  • Re: Manipolazione di array bidimensionali

    Credo di aver trovato la risposta qui:
    https://www.codingcreativo.it/inserire-dati-in-una-matrice/
    Ora ci riprovo. Scusate per il disturbo e l'ignoranza!...
  • Re: Manipolazione di array bidimensionali

    JackieJack1207 ha scritto:


    Credo di aver trovato la risposta qui:
    https://www.codingcreativo.it/inserire-dati-in-una-matrice/
    Ora ci riprovo. Scusate per il disturbo e l'ignoranza!...
    Spero tu abbia risolto. Ma cmq lì si parla di interi mentre qui abbiamo stringhe. Poi ho l'impressione che una struct sarebbe più comoda.
    Aspettiamo gli esperti.
  • Re: Manipolazione di array bidimensionali

    Infatti ho un problema con le stringhe: come creo una stringa del genere?

    [ [ italiano ] [ storia ] [ matematica ] [ geografia ] ]

    cioè di un certo numero di celle dove ogni cella ha una certa dimensione in modo che quando chiamo stringa[0] mi dia italiano, stringa[1] storia, etc...
    Devo ricorrere per forza alle strutture??
  • Re: Manipolazione di array bidimensionali

    JackieJack1207 ha scritto:


    Infatti ho un problema con le stringhe: come creo una stringa del genere?

    [ [ italiano ] [ storia ] [ matematica ] [ geografia ] ]

    cioè di un certo numero di celle dove ogni cella ha una certa dimensione in modo che quando chiamo stringa[0] mi dia italiano, stringa[1] storia, etc...
    Devo ricorrere per forza alle strutture??
    No, è semplicemente un array di stringhe…
Devi accedere o registrarti per scrivere nel forum
7 risposte