Oppure

Loading
13/04/14 10:01
perillitommaso
La i parte da 1 perchè ho 7 righe, 6 dove sono presenti i nomi delle città, e la prima riga con indice 0 è vuota perchè ho un altro array parallelo con sempre 7 righe, solo che la prima riga con indice 0 avrà gli orari delle temperature, infatti quando ho dichiarato l'array temp l'ho dichiarato così:
int  temp [7][4] = {6,12,16,00};

dove 6,12,16,00 sono gli orari delle temperature
aaa
13/04/14 17:36
R0gerBlack
è possibile che una discussione sull'ordinamento delle stringhe si sia portata così avanti? :-|

Detto questo, @perillitommaso, innanzitutto le stringhe in C sono degli array di char
Per motivi di comodità (giustamente) le stai usando con i puntatori.
Ora, sebbene siano formalmente array bidimensionali (perché tu hai dichiarato un array di puntatori di char), i valori delle "stringhe" sono richiamabili da un indice monodimensionale.

char *citta[6];
citta[0] = "Bari";


Se si usa in questo caso l'indice bidimensionale, ci si riferisce al singolo char del valore dell'indice della stringa
citta[0][0] è uguale quindi a 66 (ovvero 'B').
Per questo motivo se vuoi usare un array parallelo delle temperature dovresti dichiararlo così
int temp[6];

Perché ogni temperatura corrisponde a una città, non a ogni sua lettera.

EDIT: Non avevo letto che ogni città ha 4 temperature a orari diversi, in quel caso dichiaralo come array bidimensionale, ma non serve lasciare il primo campo libero dell'indice.

L'utilizzo che vuoi fare del primo elemento dell'array è inusuale, se ci pensi, c'è per forza un altro modo.

Il codice dell'ordinamento che vuoi tu (verifica della prima lettera) diventa quindi
void ordinamento(char *citta[]){
for(i=0;i< max;i++)
     for(j = i+1; j < max; j++)
     if(citta[i][0]>citta[j][0])
     { // Se la prima lettera della città
           // Viene dopo nell'alfabeto rispetto alla seconda, scambiale
           char *stringapp;
           stringapp = citta[i];
           citta[i] = citta[j];
           citta[j] = stringapp;
     }
}

Il motivo dei for nidificati, è che come ha detto @nessuno, se tu utilizzi i + 1, il valore varierà da 2 a 7, o partendo da 0, da 1 a 5 (la variabile è utilizzabile da 0 a 4, quindi il secondo controllo deve andare da 1 a 4).
Cosa cambia con i for nidificati? Supponendo che max sia uguale a 6, quando i sarà uguale a 5 (ultimo indice dell'array), j + 1 sarà uguale a 6, ma, essendo uguale a max e non minore non farà partire il secondo for.
Per questo motivo non andrai oltre l'indice della matrice.
Ho fatto una prova con l'istruzione main per verificare la funzione

int i, j, q;
int max = 6;
int main(void)
{
    char *citta[max];
    citta[0] = "Palermo";
    citta[1] = "Bari";
    citta[2] = "Ancona";
    citta[3] = "Venezia";
    citta[4] = "Milano";
    citta[5] = "Roma";

    ordinamento(citta);

    for(i = 0; i < max; i++)
    {
        printf("%s\n",citta[i]);
    }

    return 0;
}


E questo è l'output
Ancona
Bari
Milano
Palermo
Roma
Venezia

Direi che funziona. Ora, se proprio vuoi fare una cosa formale prova a mettere utilizzando questo codice queste città
citta[0] = "Bitritto";
citta[1] = "Bari";
citta[2] = "Ancona";
citta[3] = "Bitonto";
citta[4] = "Milano";
citta[5] = "Roma";


Se esegui l'ordinamento l'output sarà
Ancona
Bari
Bitritto
Bitonto
Milano
Roma

Bitonto viene prima di Bitritto in ordine alfabetico però il programma non lo controlla oltre la prima lettera. Come rimediare?
Con questo semplice codice
void ordinamento(char *citta[]){
     for(i=0;i< max;i++)
            for(j = i+1; j < max; j++)
                if(citta[i][0]>=citta[j][0])
                { // Se sono uguali, procedi controllando lettera per lettera
                    int c1 = strlen(citta[i]); // c1 = numero lettere di citta[i]
                    int c2 = strlen(citta[j]); // c2 = numero lettere di citta[j]
                    int length = c2;
                    if(c1 < c2) length = c1; // Dai a length la lunghezza più corta
                    for(q = 0; q < length; q++)
                    {
                        if(citta[i][q]>citta[j][q])
                        { // Se una lettera dopo la prima supera l'altra
                           // es. R di BitRitto e O di BitOnto, scambia i nomi
                            char *stringapp;
                            stringapp = citta[i];
                            citta[i] = citta[j];
                            citta[j] = stringapp;
                            // Non andare oltre, ferma la ricerca terminando il for
                            break;
                        }
                    }
                }
}

otterrai un ordinamento fatto come si deve, infatti in output, con le stesse città, avrai

Ancona
Bari
Bitonto
Bitritto
Milano
Roma

Spero ti possa essere stato d'aiuto! :k:
Ultima modifica effettuata da R0gerBlack 13/04/14 17:45
aaa
13/04/14 19:18
perillitommaso
Grazie molte per la risposta :hail: :hail: :hail:
Quindi il mio codice diventa così:


void ordinamento(char *citta[]){
     for(i=0;i<6;i++){
     for(j=i+1;j<6;j++){
     if(citta[i][0]>citta[j][0]){
     scambio(citta);  }
      {
     }
     return;
     }
     
void scambio(char *citta[]){
     char stringapp;
          stringapp = citta[i];
           citta[i] = citta[j];
           citta[j] = stringapp;
     return;
     }



Anche se quando vado a compilare mi risultano diversi errori :grr: che si sono verificati quando sono andato a utilizzare le procedure, prima non c'erano .. errori di questo tipo:
cannot convert `char (*)[15]' to `char**' for argument `1' to `void inseriscicitta(char**)'
Ultima modifica effettuata da perillitommaso 13/04/14 19:41
aaa
13/04/14 21:25
R0gerBlack
Aggiusta le parentesi graffe in ordinamento

void ordinamento(char *citta[])
{
     for(i=0;i<6;i++)
    {
        for(j=i+1;j<6;j++)
        {
            if(citta[i][0]>citta[j][0])
            { scambio(citta); }
        }
     }
     return;
}


N.B. Se un if o un for ha un'istruzione di una sola riga le parentesi graffe sono opzionali (io non le ho usate infatti), quindi la tua void potresti anche scriverla così

void ordinamento(char *citta[])
{
     for(i=0;i<6;i++)
        for(j=i+1;j<6;j++)
            if(citta[i][0]>citta[j][0])
                scambio(citta); 
}


Detto questo, devi dichiarare stringapp in questo modo
char *stringapp;


Ricorda che se non è dichiarato come puntatore, stringapp rappresenta solo un carattere.
Ultima modifica effettuata da R0gerBlack 13/04/14 22:40
aaa
14/04/14 13:13
perillitommaso
Ho aggiustato:
void ordinamento(char *citta[]){
     for(i=0;i<6;i++){
     for(j=i+1;j<6;j++){
     if(citta[i][0]>citta[j][0]){
     scambio(citta);  }
     }
     }
     return;
     }
     
void scambio(char *citta[]){
     char *stringapp;
          stringapp = citta[i];
           citta[i] = citta[j];
           citta[j] = stringapp;
     return;
     }

Le parentesi graffe le devo inserire perchè, oltre a riordinare le città, devo anche riordinare le temperature per il semplice motivo che, leggo le temperature prima di ordinare le città :
void inseriscitemp(int *temp[],char *citta[]){
     
      for(i=1;i<=6;i++){
       printf("Inserisci la temperatura per %s:\n",citta[i]);
           for(j=0;j<4;j++){
           scanf("%d",&temp[i][j]);
           }                              
       }
     return;
     }

e quindi dopo che vado a riordinare le citta, mi trovo con città che hanno temperature sbagliate.
Quindi ho modificato così:
void ordinamento(char *citta[],int *temp[]){
     for(i=0;i<6;i++){
     for(j=i+1;j<6;j++){
     if(citta[i][0]>citta[j][0]){
     scambiocitta(citta);
     scambiotemp(temp);  }
     }
     }
     return;
     }

void scambiotemp(int *temp[]){
     int intapp[4];
     
     
     return;
     }


di sicuro ho bisogno di un vettore di appoggio per effettuare lo scambio. Ma lo scambio come avviene? Elemento per elemento ( e quindi un for ) oppure assegnazione normale ?
Io ho provato così:

void ordinamento(char *citta[],int *temp[]){
     for(i=0;i<6;i++){
     for(j=i+1;j<6;j++){
     if(citta[i][0]>citta[j][0]){
     scambiocitta(citta);
     scambiotemp(temp);  }
     }
     }
     return;
     }

void scambiotemp(int *temp[]){
     int intapp[4];
     
     for ( j=0; j<4; j++ ){
   intapp[j] = temp[i][j];}
     for(j=0;j<4;j++){
     temp[i+1][j] = intapp[j];                 
     }
     return;
     }
Ultima modifica effettuata da perillitommaso 14/04/14 13:41
aaa
15/04/14 13:43
perillitommaso
Nella compilazione mi da 2 errori:
in questa procedura:
void scambiocitta(char citta[][15]){
     char *stringapp;
          stringapp = citta[i];
           citta[i] = citta[j];
           citta[j] = stringapp;
     return;
     }


Questo errore: ISO C++ forbids assignment of arrays a questo rigo:
citta[i] = citta[j];


e questo erroe: incompatible types in assignment of `char*' to `char[15]' a questo rigo:
 citta[j] = stringapp;

Come si risolvono?:-? :om:
aaa
15/04/14 14:14
R0gerBlack
void scambiocitta(char citta[][15])


Diventa

void scambiocitta(char *citta[])


Dovresti studiarti bene i puntatori.
Qui puoi trovare qualcosa di utile per questo, comunque è consigliabile procurarsi un libro per imparare bene un linguaggio.
thegeekstuff.com/2011/12/c-pointers-fundamentals/
aaa
15/04/14 14:22
perillitommaso
No perchè mi dava errore, infatti oggi l'ho risolto con i miei prof questa cosa...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


/*Variabili Globali*/
int i=0;//indice delle righe
int j=0;//indice delle colonne


/*Prototipi Procedure*/
void inseriscicitta(char citta[][15]);
void inseriscitemp(int temp[][4],char citta[][15]);
void mediatemp(int temp[][4],char citta[][15],float media[]);
void ordinamento(char citta[][15],int temp[][4]);
void scambiocitta(char citta[][15]);
void scambiotemp(int temp[][4]);


/*Programma Principale*/
int main()
{   char citta[7][15];
    int  temp [7][4] = {6,12,16,00};  //Matrici parallele hanno in comune le righe 
    float media[7];
                
       inseriscicitta(&citta[0]);
       inseriscitemp(&temp[0],&citta[0]);
       mediatemp(&temp[0],&citta[0],&media[0]);
       ordinamento(&citta[0],&temp[0]);
       
       
       printf("\n\n");
    system("PAUSE");
    return(0);
}

/*Procedure:*/

void inseriscicitta(char citta[][15]){
     
      for(i=1;i<=6;i++){
       printf("Inserisci una citta': "); 
       gets(citta[i]);                    
       }             

     return;
     }

void inseriscitemp(int temp[][4],char citta[][15]){
     
      for(i=1;i<=6;i++){
       printf("Inserisci la temperatura per %s:\n",citta[i]);
           for(j=0;j<4;j++){
           scanf("%d",&temp[i][j]);
           }                              
       }
     return;
     }

void mediatemp(int temp[][4],char citta[][15],float media[]){
     float M;
     
      for(i=1;i<=6;i++){
       for(j=0;j<4;j++){
       M = M+temp[i][j];
       }
       M = M/4;
       media[i] = M;
       printf("Media Temperature di %s: %2.f\n",citta[i],media[i]);                   
    }
     
     return;
     }
     
void ordinamento(char citta[][15],int temp[][4]){
     for(i=0;i<6;i++){
     for(j=i+1;j<6;j++){
     if(citta[i][0]>citta[j][0]){
     scambiocitta(&citta[0]); 
     scambiotemp(&temp[0]);}
     }
     }
     return;
     }
     
void scambiocitta(char citta[][15]){
     char *stringapp;
          stringapp = citta[i];
           citta[i] = citta[j];
           citta[j] = stringapp;
     return;
     }

void scambiotemp(int temp[][4]){
     int intapp[4];
     
     for(j=0;j<4;j++){
     intapp[j]=temp[i][j];                 
     }
     for(j=0;j<4;j++){
                      
     
     }
                
                      

     
     
     return;
     }

l'ho modificato a tutti perchè mi dava errore in ogni procedura con il passaggio dei parametri
aaa