Pagina 3 di 3 primaprima 1 2 3
Visualizzazione dei risultati da 21 a 25 su 25
  1. #21
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    636
    cioè se [i] > [j] se verificata mi da come risultato un intero > 0 e quindi mi scambia le stringhe..giusto ?
    però quando stampa..l'ordine è sempre quello dei dati in ingresso..non mi ordina nulla
    come mai?

  2. #22
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    636
    sto provando 1000 soluzioni..ma proprio non riesco a capire come mai non mi ordina alfabeticamente gli elementi

  3. #23
    Originariamente inviato da jurij7
    si infatti...ho fatto attenzione ai risultati..e c'è bisogno della funzione ceil..graziee

    per l'irdinamento..i confronto tra le stringhe cioè
    codice:
    strcmp(studenti[i].cognome,studenti[j].cognome) == 1
    va bene no?
    Dipende da quello che vuoi ottenere... ma se vuoi verificare che la prima stringa sia "maggiore" della seconda, allora sbagli.

    http://www.cppreference.com/wiki/c/string/strcmp
    http://en.wikipedia.org/wiki/Strcmp

    p.s. quando usi una funzione standard o di sistema.. prima leggi sempre la documentazione relativa ;-)

  4. #24
    Utente di HTML.it
    Registrato dal
    Jun 2007
    Messaggi
    636
    ok cosi va bene

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    
    #define maxcar 25
    #define massimo 100
    /*
     * 
     */
    int main() {
    
        struct studente {
            char cognome[maxcar];
            char nome[maxcar];
            int scritto;
            int orale;
            double media;
           } studenti[massimo];
    
    
           int i, j;
           int n, v;
           char buffer [maxcar];
           double oral;
           double scrit;
    
           printf ("inserisci numero studenti : \n");
           scanf ("%d", &n);
    
           if ( n >= 3){
               for (i = 0; i <= massimo && i <= n - 1; i++){
                   printf ("cognome : ");
                   scanf ("%s", studenti[i].cognome);
                   printf ("nome : ");
                   scanf ("%s", studenti[i].nome);
                   printf ("scritto : ");
                   scanf ("%d", &studenti[i].scritto);
                   printf ("orale : ");
                   scanf ("%d", &studenti[i].orale);
               }
    
               for (i = 0; i <= massimo && i <= n - 2; i++){
                   for (j = i + 1; j <= massimo && j <= n - 1; j++){
                       v = strcmp (studenti[i].cognome,studenti[j].cognome);
    
                       if (v > 0){
                           strcpy(buffer,studenti[j].cognome);
                           strcpy(studenti[j].cognome,studenti[i].cognome);
                           strcpy(studenti[i].cognome,buffer);
                           strcpy(buffer,studenti[j].nome);
                           strcpy(studenti[j].nome,studenti[i].nome);
                           strcpy(studenti[i].nome,buffer);
                           scrit = studenti[j].scritto;
                           studenti[j].scritto = studenti[i].scritto;
                           studenti[i].scritto = scrit;
                           oral = studenti[j].orale;
                           studenti[j].orale = studenti[i].orale;
                           studenti[i].scritto = oral;
    
                       }
                   }
                   
                   }
                printf ("\n\ntabella in ordine alfabetico\n");
                    printf ("\n%10s%10s%10s%10s\n","COGNOME","NOME","SCRITTO","ORALE");
                         for (i = 0; i <= massimo && i <= n - 1; i++){
                        printf ("\n%10s%10s%10d%10d", studenti[i].cognome, studenti[i].nome, studenti[i].scritto, studenti[i].orale);
               }
              
    
    
               printf ("\n\nstudenti con media >= 18\n");
               printf ("\n%10s%10s%10s%10s\n","COGNOME","NOME","SCRITTO","ORALE");
               for (j = 0; j <= massimo && j <= n - 1; j++){
                   studenti[j].media = ((double)studenti[j].scritto + (double)studenti[j].orale) / 2;
                   if (studenti[j].media >= 18){
                       
                       printf ("\n%10s%10s%10d%10d", studenti[j].cognome, studenti[j].nome, studenti[j].scritto, studenti[j].orale);
                   }
               }
               printf ("\n\nriepilogo voti\n");
               printf ("\n%10s%10s%10s%10s%10s\n","COGNOME","NOME","SCRITTO","ORALE","MEDIA");
                 for (j = 0; j <= massimo && j <= n - 1; j++){
                     
                    printf ("\n%10s%10s%10d%10d%10.lf", studenti[j].cognome, studenti[j].nome, studenti[j].scritto, studenti[j].orale, ceil(studenti[j].media));
                   }
               }else{
               printf ("n minore di 3\n");
               }
    
    
           
         return 0;
    }
    ma la cosa strana è che cercando in rete ho trovato una istruzione diretta, cioè

    codice:
    strcmp(studenti[i].cognome,studenti[j].cognome) == 1
    oppure
    codice:
    strcmp(studenti[i].cognome,studenti[j].cognome) > 0
    come mai ..non funziona con queste ultime 2 ?

  5. #25
    Originariamente inviato da jurij7
    ma la cosa strana è che cercando in rete ho trovato una istruzione diretta, cioè

    codice:
    strcmp(studenti[i].cognome,studenti[j].cognome) == 1
    oppure
    codice:
    strcmp(studenti[i].cognome,studenti[j].cognome) > 0
    come mai ..non funziona con queste ultime 2 ?
    La seconda dovrebbe funzionare, la prima non necessariamente. La documentazione della strcmp specifica che essa restituisce un numero inferiore di 0 se la prima stringa è inferiore alla seconda, maggiore di 0 se la seconda è inferiore alla prima (quindi non necessariamente 1) e 0 se sono uguali. Questo perché la strcmp in questa maniera si può implementare in maniera più efficiente (vedi qui per un'implementazione di esempio).
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.