Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Passaggio vettore di strutture [C]

    Ragazzi ho bisogno del vostro aiuto.
    Mi occorre sapere come passare per riferimento un vettore di strutture!
    Ho visto che ci sono altre discussioni su questo tema ma nessuna mi è stata d'aiuto.

    Avendo:
    codice:
    struct info {
      char nome[N];
      int matricola;
      int voto_laurea;
    };
    
    int main() {
    struct info studenti[];
    ...
    Come posso passare il vettore di strutture per riferimento a 2 funzioni: vote e freshman?
    Ho provato cosi:
    codice:
    void vote(struct info *studenti);
    void freshman(struct info *studenti);
    e rispettivamente:
    codice:
    vote(&studenti);
    freshman(&studenti);
    Ma da:
    codice:
    In function 'main':
    warning: passing argument 1 of 'freshman' from incompatible pointer type [enabled by default]
    note: expected 'struct info *' but argument is of type 'struct info (*)[50]'
    warning: passing argument 1 of 'vote' from incompatible pointer type [enabled by default]
    note: expected 'struct info *' but argument is of type 'struct info (*)[50]'
    Sapreste dirmi dove sbaglio?
    Grazie in anticipo!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    vote(studenti);
    freshman(studenti);


    studenti è già un puntatore
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Mmh non va ancora.. Se non ti spiace potresti dargli un'occhiata oregon?
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX_DIM 50
    #define N 20+1
    #define M 30+1
    
    
    struct info {
    char nome[N];
    int matricola;
    int voto_laurea;
    };
    
    void vote(struct info *studenti);
    void freshman(struct info *studenti);
    void name(struct info *studenti);
    
    int main()
    {
      struct info studenti[MAX_DIM];
      char riga[M];
      int i = 0, cnt = 0, somma_voti = 0, key;
      float media_voti;
    
      FILE* fp;
      fp = fopen("Dati.txt","r");
    
      if(fp == NULL) {
        printf("E' stato commesso un errorenell'apertura del file.");
        exit(0); }
    
      while((fgets(riga,100,fp) != NULL) && (i <= MAX_DIM)) {
    
        sscanf(riga,"%s %d %d",studenti[i].nome, &studenti[i].matricola, &studenti[i].voto_laurea);
        cnt++;
        somma_voti += studenti[i].voto_laurea;
        i++;
    
      }
    
      media_voti= (float) (somma_voti/cnt);
      printf("La media dei voti di laurea e': %.2f\n\n",media_voti);
    
      printf("I dati sono stati acquisiti. Sono possibili le seguenti operazioni:\n\n");
      /* Ordine crescente */
      printf("1. ordinare i dati per nome;\n");
      printf("2. ordinare i dati a seconda della matricola;\n");
      printf("3. ordinare i dati per voto di laurea.\n\n");
    
      printf("Fa' la tua scelta.\n");
    
      while(key != 0) {
        scanf("%d",&key);
        fflush(stdin);
    
            switch(key) {
    
                case(2):
                    freshman(studenti);
                    for(i=0;i<=cnt;i++) {
                    printf("%s %d %d", studenti[i].nome, studenti[i].matricola, studenti[i].voto_laurea); }
                    break;
                case(3):
                    vote(studenti);
                    for(i=0;i<=cnt;i++) {
                    printf("%s %d %d", studenti[i].nome, studenti[i].matricola, studenti[i].voto_laurea); }
                    break;
                default:
                    printf("Scelta non prevista.\n");
                    break;
            }
      }
    
    return 0;
    }
    
    void vote(struct info *studenti)
    {
        int i, i_min, j;
    
        for(i=0;i<N-1;i++) {
            i_min = i;
                for(j=0;j<N;j++) {
                    if(studenti[j].voto_laurea<studenti[i].voto_laurea) {
                    i_min = j; }
                }
        studenti[MAX_DIM] = studenti[i];
        studenti[i] = studenti[i_min];
        studenti[i_min] = studenti[MAX_DIM];
        }
    }
    
    void freshman(struct info *studenti)
    {
        int i, i_min, j;
    
        for(i=0;i<N-1;i++) {
            i_min = i;
                for(j=0;j<N;j++) {
                    if(studenti[j].matricola<studenti[i].matricola) {
                    i_min = j; }
                }
        studenti[MAX_DIM] = studenti[i];
        studenti[i] = studenti[i_min];
        studenti[i_min] = studenti[MAX_DIM];
        }
    }

  4. #4

    Moderazione

    Come già detto qui, il codice va inserito tra tag [CODE] ... [/CODE], altrimenti perde l'indentazione.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5

    Re: Moderazione

    Originariamente inviato da MItaly
    Come già detto qui, il codice va inserito tra tag [CODE] ... [/CODE], altrimenti perde l'indentazione.
    Scusami hai ragione. Non capiterà più!

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Negli ordinamenti perché usi N ?
    Non è detto che leggi N righe dal file ... devi utilizzare il numero effettivo di righe lette.

    E delle righe come

    for(i=0;i<=cnt;i++) {

    devono essere

    for(i=0;i<cnt;i++) {
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Così?

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX_DIM 50
    #define N 20+1
    #define M 30+1
    
    
    struct info {
    char nome[N];
    int matricola;
    int voto_laurea;
    };
    
    void vote(struct info *studenti, int c);
    void freshman(struct info *studenti, int c);
    void name(struct info *studenti);
    
    int main()
    {
      struct info studenti[MAX_DIM];
      char riga[M];
      int i = 0, cnt = 0, somma_voti = 0, key;
      float media_voti;
    
      FILE* fp;
      fp = fopen("Dati.txt","r");
    
      if(fp == NULL) {
        printf("E' stato commesso un errorenell'apertura del file.");
        exit(0); }
    
      while((fgets(riga,100,fp) != NULL) && (i <= MAX_DIM)) {
    
        sscanf(riga,"%s %d %d",studenti[i].nome, &studenti[i].matricola, &studenti[i].voto_laurea);
        cnt++;
        somma_voti += studenti[i].voto_laurea;
        i++;
    
      }
    
      media_voti= (float) (somma_voti/cnt);
      printf("La media dei voti di laurea e': %.2f\n\n",media_voti);
    
      printf("I dati sono stati acquisiti. Sono possibili le seguenti operazioni:\n\n");
      /* Ordine crescente */
      printf("1. ordinare i dati per nome;\n");
      printf("2. ordinare i dati a seconda della matricola;\n");
      printf("3. ordinare i dati per voto di laurea.\n\n");
    
      printf("Fa' la tua scelta.\n");
    
      while(key != 0) {
        scanf("%d",&key);
        fflush(stdin);
    
            switch(key) {
    
                case(2):
                    freshman(studenti,cnt);
                    for(i=0;i<=cnt;i++) {
                    printf("%s %d %d", studenti[i].nome, studenti[i].matricola, studenti[i].voto_laurea); }
                    break;
                case(3):
                    vote(studenti,cnt);
                    for(i=0;i<=cnt;i++) {
                    printf("%s %d %d", studenti[i].nome, studenti[i].matricola, studenti[i].voto_laurea); }
                    break;
                default:
                    printf("Scelta non prevista.\n");
                    break;
            }
      }
    
    return 0;
    }
    
    void vote(struct info *studenti, int c)
    {
        int i, i_min, j;
    
        for(i=0;i<c-1;i++) {
            i_min = i;
                for(j=0;j<c;j++) {
                    if(studenti[j].voto_laurea<studenti[i].voto_laurea) {
                    i_min = j; }
                }
        studentiè[c+1] = studenti[i];
        studenti[i] = studenti[i_min];
        studenti[i_min] = studenti[c+1];
        }
    }
    
    void freshman(struct info *studenti, int c)
    {
        int i, i_min, j;
    
        for(i=0;i<c-1;i++) {
            i_min = i;
                for(j=0;j<c;j++) {
                    if(studenti[j].matricola<studenti[i].matricola) {
                    i_min = j; }
                }
        studenti[c+1] = studenti[i];
        studenti[i] = studenti[i_min];
        studenti[i_min] = studenti[c+1];
        }
    }

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Nella funzione di ordinamento vedo sempre riferimenti all'elemenrto MAX_DIM .... che non si sa se esiste o no ... cosa c'entra?

    Prendi questo codice d'esempio

    codice:
    void vote(struct info *studenti, int c)
    {
    	struct info tmp;
    	int i, j;
    
        for(i=0; i<c-1; i++) 
    	{
    		for(j=i+1; j<c; j++) 
    		{
    			if(studenti[j].voto_laurea<studenti[i].voto_laurea) 
    			{
    				tmp = studenti[i];
    				studenti[i] = studenti[j];
    				studenti[j] = tmp;
    			}
    		}
    	}
    }
    e tieni presente quello che ti ho già detto in precedenza sulla for della visualizzazione.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.