Risultati da 1 a 14 di 14

Discussione: Sono una frana in C

  1. #1
    Lo Zio L'avatar di Ace of Hearts
    Data Registrazione
    06-01-04
    Località
    Mezzolombardo
    Messaggi
    2,872

    Predefinito Sono una frana in C

    Allora ragazzi ecco il nuovo episodio della serie: "SONO UNA FRANA IN C"


    Ho una matrice
    char punti[100][30];

    devo ordinare questi punteggi

    per farlo ho un numero utenti loggati
    e un numero utenti morti
    int utenti_loggati
    int utenti_finiti

    ho fatto un metodo classificazione

    void classificazione(int numero){
    int i;
    int j = numero;
    numero è il numero di loggati
    for(i =0; i<= numero/2;i++){
    for(j;j>numero/2;j--){
    if(punti[i]<punti[j]){
    char temp = *punti[i];
    *punti[i] = *punti[j];
    *punti[j] = temp;
    char tempc[100];
    strcpy(tempc,*nomi[i]);
    strcpy(*nomi[i],*nomi[j]);
    strcpy(*nomi[j],tempc);
    }
    }
    }

    questo va tutto in segmentation fault non so il perchè....
    Aiutatemi!!

  2. #2
    L'Onesto L'avatar di alfio86
    Data Registrazione
    29-08-04
    Località
    Parma - Torino
    Messaggi
    1,207

    Predefinito Re: Sono una frana in C

    non ho capito molto bene cosa devi fare... di sbagliato cmq credo che ci sia questo: if(punti[i]<punti[j]) perchè scrivendo così confronti come fossero numeri due righe di una matrice di caratteri.

    se ho detto una castroneria chiedo scusa, ma sono anch'io agli inizi

  3. #3
    Lo Zio L'avatar di Ace of Hearts
    Data Registrazione
    06-01-04
    Località
    Mezzolombardo
    Messaggi
    2,872

    Predefinito Re: Sono una frana in C

    No hai ragione... Ho risolto sta notte verso le 5 il problema, ora il mio snake funziona...
    Grazie mille comunque

  4. #4
    Scooterone mon amour L'avatar di Pongo
    Data Registrazione
    28-10-04
    Località
    Altrove
    Messaggi
    7,600

    Predefinito Re: Sono una frana in C

    E l'aritmatica dei puntatori?


    Usavi dei puntatori a char come valori char! O no?

    Codice:
    int test[10][10];
    
    	test[2][1]=666;
    	test[0][0]=12;
    	test[0][1]=123;
    	test[1][2]=999;
    
    	cout << **test << "primo" << endl;
    
    	cout << *(*test+1) << "secondo" << endl;
    
    	cout << *(*(test+1)+2) << "pippo" << endl; //999

  5. #5
    Lo Zio L'avatar di Ace of Hearts
    Data Registrazione
    06-01-04
    Località
    Mezzolombardo
    Messaggi
    2,872

    Predefinito Re: Sono una frana in C

    Contrordine non funziona...
    Come faccio aiutatemi... Che qualcuno mi corregga il mio codice... Mi viene da piangere.. Sto programmando in 4 linguaggi diversi in sto periodo e C è uno di quei linguaggi che mi danno fastidio dato che non sono pratico...

  6. #6
    Scooterone mon amour L'avatar di Pongo
    Data Registrazione
    28-10-04
    Località
    Altrove
    Messaggi
    7,600

    Predefinito Re: Sono una frana in C

    Ace of Hearts ha scritto ven, 09 giugno 2006 alle 17:11
    Contrordine non funziona...
    Come faccio aiutatemi... Che qualcuno mi corregga il mio codice... Mi viene da piangere.. Sto programmando in 4 linguaggi diversi in sto periodo e C è uno di quei linguaggi che mi danno fastidio dato che non sono pratico...
    Allora non ho mai programmato in c, solo in c++, quindi magari la sintassi è diversa, anche se ne dubito, quindi controlla alcuni dei seguenti punti:

    char [][] è una matrice!!! Non puoi confrontare tra loro due array, quali sono punti[j] e punti[i].

    E poi o usi l'aritmetica dei punatatori o gli indici tra le parentesi [] per accedere agli elementi degli array, non fare una frittata.

    E poi se ci dici che deve fare forse riuaciamo ad andarne fuori!


  7. #7
    La Borga L'avatar di Il Nero
    Data Registrazione
    31-12-01
    Messaggi
    12,066

    Predefinito Re: Sono una frana in C

    Allora, ci sono un pacco di domande da fare:
    1) Perchè l'array "punti" (che suppongo debba contenere punteggi) è un char ed è bidimensionale ? Mi sembra strano, per la funzione che deve svolgere.
    2) L'array "nomi" che roba è ? Un array in 3 dimensioni ? Perchè se non è così, allora lo strcpy è sbagliato.
    3) Nel ciclo for:
    Codice:
    for(j;j>numero/2;j--){
    Non inizializzi j ogni volta. Il che significa che il codice viene iterato una volta sola, praticamente.
    4) Quando compari:
    Codice:
    if(punti[i]<punti[j])
    Compari 2 array. Puttanatone megagalattico.
    5) Che diavolo di algoritmo di sorting bislacco hai usato ?
    Il mio consiglio:
    crea una struct
    Codice:
    struct Record
    {
     char Nome[80];
     int Punteggio;
    };
    O una cosa simile. Poi dichiari un'array di queste struct:
    Codice:
    Record Punteggi[200];
    Poi invece di impelagarti nei meandri degli algoritmi di sort(mi sembra che sia un simil-bubblesort il tuo, ma non si capisce troppo bene), usi il quicksort integrato nella libreria stdlib, in questo modo:
    a) Definisci una funzione comparatore:
    Codice:
    int CompareRecords(const void *a, const void *b)
    {
     return (*(*Record)b).Punteggio - (*(*Record)a).Punteggio;
    }
    b) Usi la maggica funzione qsort:
    Codice:
    qsort(Punteggi, 200, sizeof(Record), CompareRecords);
    E amen. Poi, se non puoi operare questa trasformazione, ti posso scrivere il codice del bubblesort.
    Già che ci sono, ti scrivo un "possibile" codice che risolve il tuo problema in modo abbastanza banale (se vuoi scrivo qualcosa di più carino come algoritmo, ma per ordinare dei punteggi non ne vale la pena )

    Codice:
    char Nomi[100][80];
    int Punteggi[100];
    void OrdinaPunteggi(int numero)
    {
     for (int i = 0; i < numero - 1; i++)
     {
      int z = i;
      for (int j = i + 1; j < numero; j++)
       if (Punteggi[j] > Punteggi[z]) 
        z = j;
      int tempPunteggio; char tempNome[80];
      tempPunteggio = Punteggi[z];
      Punteggi[z] = Punteggi[j];
      Punteggi[j] = tempPunteggio;
      strcpy(tempNome, Nomi[z]);
      strcpy(Nomi[z], Nomi[j]);
      strcpy(Nomi[j], tempNome);
     }
    }
    Mmm ... Però sta roba che ho scritto sopra è davvero troppo orenda ... Asp che lo modifico va ... Ecco, così è una goccia meglio.

  8. #8
    Il Nonno L'avatar di vaitrafra
    Data Registrazione
    23-09-01
    Località
    Scandiano
    Messaggi
    6,024

    Predefinito Re: Sono una frana in C

    figa, dopo una risposta così io leccherei il pavimento...

    Il nero ci insegna la programmazione; cap 1 par 1: centra il problema.

  9. #9
    Lo Zio L'avatar di Ace of Hearts
    Data Registrazione
    06-01-04
    Località
    Mezzolombardo
    Messaggi
    2,872

    Predefinito Re: Sono una frana in C

    Grazie mille Il Nero... Ma vorrei chiederti ancora una cosa... Non è che c'è un modo per tenere per punti una matrice di char? Mi servirebbe cosi...

  10. #10
    La Borga L'avatar di Il Nero
    Data Registrazione
    31-12-01
    Messaggi
    12,066

    Predefinito Re: Sono una frana in C

    Ace of Hearts ha scritto sab, 10 giugno 2006 alle 02:08
    Grazie mille Il Nero... Ma vorrei chiederti ancora una cosa... Non è che c'è un modo per tenere per punti una matrice di char? Mi servirebbe cosi...
    Si può fare, ma dipende dal formato in cui ti servono e che cosa ci devi fare.
    Ti serve il punteggio in forma di stringa ? Oppure ti serve di usare i char come se fossero numeri ?
    Ti faccio le due possibilità:
    a) Come stringa:
    a1) Usando struct + qsort:
    Codice:
    struct Record
    {
     char Nome[80];
     char Punteggio[30];
    } Punteggi[200];
    
    int CompareRecords(const void *a, const void *b)
    {
     return atoi((*(*Record)b).Punteggio) - atoi((*(*Record)a).Punteggio);
    }
    Poi, come prima, nel codice:
    Codice:
    qsort(Punteggi, 200, sizeof(Record), CompareRecords);
    a2) Usando la funzione di sort "fatta in casa":
    Codice:
    char Nomi[100][80];
    char Punteggi[100][30];
    void OrdinaPunteggi(int numero)
    {
     for (int i = 0; i < numero - 1; i++)
     {
      int z = i;
      for (int j = i + 1; j < numero; j++)
       if (atoi(Punteggi[j]) > atoi(Punteggi[z])) 
        z = j;
      char tempPunteggio[30]; char tempNome[80];
      strcpy(tempPunteggio, Punteggi[z]);
      strcpy(Punteggi[z], Punteggi[j]);
      strcpy(Punteggi[j], tempPunteggio);
      strcpy(tempNome, Nomi[z]);
      strcpy(Nomi[z], Nomi[j]);
      strcpy(Nomi[j], tempNome);
     }
    }
    b) Come numeri:
    Qui la soluzione varia molto a seconda di quello che vuoi come massimo punteggio possibile. Assumendo che come massimo punteggio ti basti 255, fai semplicemente:
    b1) Con la struct ti limiti a cambiare la definizione della struct da:
    Codice:
    struct Record
    {
     char Nome[80];
     int Punteggio;
    }
    a:
    Codice:
    struct Record
    {
     char Nome[80];
     char Punteggio;
    }
    b2) Invece sempre col sort della nonna fatto in casa con tanto amore ()
    Codice:
    char Nomi[100][80];
    char Punteggi[100];
    void OrdinaPunteggi(int numero)
    {
     for (int i = 0; i < numero - 1; i++)
     {
      int z = i;
      for (int j = i + 1; j < numero; j++)
       if (Punteggi[j] > Punteggi[z]) 
        z = j;
      int tempPunteggio; char tempNome[80];
      tempPunteggio = Punteggi[z];
      Punteggi[z] = Punteggi[j];
      Punteggi[j] = tempPunteggio;
      strcpy(tempNome, Nomi[z]);
      strcpy(Nomi[z], Nomi[j]);
      strcpy(Nomi[j], tempNome);
     }
    }
    Praticamente uguale a quello di prima, ma cambi da char a int.
    C'è anche la possibilità che tu voglia punteggi maggiori di 255. In quel caso ti consiglio di usare un array di diciamo 2 char, e di scrivere il codice come se stessi trattando stringhe (vedi il caso a), sostituendo alla funzione atoi, che ho usato io, una funzione che ti scrivi tu per convertire queste sequenze di char in numeri interi, tipo:
    Codice:
    int CharToInt(char *val);
    {
     return val[0]*256 + val[1];
    }
    Per esempio.
    Poi invece di usare strcpy, ti scrivi una funzioncina tua anche per la copia di questi valori-char:
    Codice:
    void CopyCharVal(char *Dest, char *Source)
    {
     Dest[0] = Source[0];
     Dest[1] = Source[1];
    }
    E la usi al posto di strcpy.
    In conclusione, a grandi linee:
    Con la struct:
    Codice:
    struct Record
    {
     char Nome[80];
     char Punteggio[2];
    } Punteggi[200];
    
    int CharToInt(char *val);
    {
     return val[0]*256 + val[1];
    }
    
    int CompareRecords(const void *a, const void *b)
    {
     return CharToInt((*(*Record)b).Punteggio) - CharToInt((*(*Record)a).Punteggio);
    }
    E poi, come al solito, nel codice:
    Codice:
    qsort(Punteggi, 200, sizeof(Record), CompareRecords);
    Con il sort fatto in casa:
    Codice:
    int CharToInt(char *val);
    {
     return val[0]*256 + val[1];
    }
    void CopyCharVal(char *Dest, char *Source)
    {
     Dest[0] = Source[0];
     Dest[1] = Source[1];
    }
    
    char Nomi[100][80];
    char Punteggi[100][2];
    void OrdinaPunteggi(int numero)
    {
     for (int i = 0; i < numero - 1; i++)
     {
      int z = i;
      for (int j = i + 1; j < numero; j++)
       if (CharToInt(Punteggi[j]) > CharToInt(Punteggi[z])) 
        z = j;
      char tempPunteggio[2]; char tempNome[80];
      CopyCharVal(tempPunteggio, Punteggi[z]);
      CopyCharVal(Punteggi[z], Punteggi[j]);
      CopyCharVal(Punteggi[j], tempPunteggio);
      strcpy(tempNome, Nomi[z]);
      strcpy(Nomi[z], Nomi[j]);
      strcpy(Nomi[j], tempNome);
     }
    }
    E amen.
    Il tutto l'ho scritto un pò di corsa, quindi potrebbero esserci delle buddanate.




  11. #11
    La Borga L'avatar di Il Nero
    Data Registrazione
    31-12-01
    Messaggi
    12,066

    Predefinito Re: Sono una frana in C

    Aragorn ha scritto sab, 10 giugno 2006 alle 00:07
    f**a, dopo una risposta così io leccherei il pavimento...

    Il nero ci insegna la programmazione; cap 1 par 1: centra il problema.

  12. #12
    Lo Zio L'avatar di Ace of Hearts
    Data Registrazione
    06-01-04
    Località
    Mezzolombardo
    Messaggi
    2,872

    Predefinito Re: Sono una frana in C

    Grazie mille ti devo una birra... Anzi magari più di una

  13. #13
    Il Puppies L'avatar di rastan
    Data Registrazione
    05-06-06
    Messaggi
    491

    Predefinito Re: Sono una frana in C

    scusate se cambio argomento ma nn ho voglia di aprire 1 altro topic.....
    mi serve il vostro aiuto .... volevo sapere come inserire 1 immagine in 1 sito... provo a incollare ma nn mi da alcuna operazione... alcuni mi hanno detto k mi serve l url ma nn so proprio cosa sia
    aiutoooooooo

  14. #14
    Il Nonno L'avatar di Given
    Data Registrazione
    17-01-04
    Messaggi
    4,876

    Predefinito Re: Sono una frana in C

    <img src="url">

    L'url non è altro che l'indirizzo, ad esempio quello dell'immagine che hai in sign è http://img149.imageshack.us/img149/3517/ gothic2wp15xi.jpg

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  • Il codice BB è Attivato
  • Le faccine sono Attivato
  • Il codice [IMG] è Attivato
  • Il codice HTML è Disattivato