PDA

Visualizza la versione completa : problema ordinamento struct (in C)


jurij7
25-03-2009, 15:12
ciao a tutti
sono nuovo nella programmazione in C e sto avendo alcuni problemi

devi ordinare una struttura secondo un determinato campo

io considero

cognome = cantanti[j].lastname;

ove cognome è di tipo chat mentre cantanti[j].lastname è un campo dela struttura
mi da il seguente errore

cantanti.c:47: error: request for member `lastname' in something not a structure or union

qualcuno sa dirmi perché?

vi ringrazio

YuYevon
25-03-2009, 15:17
Originariamente inviato da jurij7
qualcuno sa dirmi perché?

Senza codice è impossibile aiutarti... quell'errore significa semplicemente che stai richiedendo l'accesso al campo "lastname" in qualcosa che non è né una struttura né una union, ma di più non ti si può dire se non mostri il codice.

jurij7
25-03-2009, 15:32
ok grazie ecco il codice



#include <stdio.h>
#include <stdlib.h>
#define numcar 25
#define massimo 30



/*
*
*/
int main(){

struct cantante {
char lastname[numcar];
char firstname[numcar];
double dischi;
} cantanti[massimo];

int I;
int i;
int j = 0;
char cognome;
char nome;
double disco ;

for (I = 0; I <= massimo; I++){
printf ("Inserire cantante %d :", I );
printf ("Cognome : ");
scanf ("%25s", cantanti[I].lastname);
printf ("Nome : ");
scanf ("%25s", cantanti[I].firstname);
printf ("Totale dischi : ");
scanf ("%f", cantanti[I].dischi);
}


for (i = 0; i < massimo - 1; i++){
for (j = i + 1; j < massimo; j++){
if (cantanti[i].dischi > cantanti[j].dischi){
cognome = cantanti[j].lastname;
cantanti[j].lastname = &cantanti[i].lastname;
cantanti[i].lastname = cognome;
nome = cantanti[j].firstname;
cantanti[j].firstname = cantanti[i].firstname;
cantanti[i].firstname = nome;
disco = cantanti[j].dischi;
cantanti[j].dischi = cantanti[i].dischi;
cantanti[i].dischi = disco;
}

}
}

printf ("Stampa ordinata\n");
printf ("COGNOME\tNOME\tDISCHI\t\n");
for (I = 0; I <= massimo; I++){
printf ("%s%s%f", cantanti[I].lastname, cantanti[I].firstname, cantanti[I].dischi);
}
return 0;
}

MItaly
25-03-2009, 16:14
cognome = cantanti[j].lastname; //Questo non ha senso perché cognome è un char, non una stringa
cantanti[j].lastname = &cantanti[i].lastname; //Questo non ha senso perché lastname è un array di char e non un puntatore
cantanti[i].lastname = cognome; //Questo non ha senso perché stai cercando di assegnare ad un array di char un singolo char
//Idem per gli altri campi

La soluzione corretta:


int I;
int i;
int j = 0;
char buffer[numcar];
double disco ;

for (I = 0; I <= massimo; I++){
printf ("Inserire cantante %d :", I );
printf ("Cognome : ");
scanf ("%25s", cantanti[I].lastname);
printf ("Nome : ");
scanf ("%25s", cantanti[I].firstname);
printf ("Totale dischi : ");
scanf ("%f", cantanti[I].dischi);
}


for (i = 0; i < massimo - 1; i++){
for (j = i + 1; j < massimo; j++){
if (cantanti[i].dischi > cantanti[j].dischi){
strcpy(buffer,cantanti[j].lastname);
strcpy(cantanti[j].lastname,&cantanti[i].lastname);
strcpy(cantanti[i].lastname,buffer);
strcpy(buffer,cantanti[j].firstname);
strcpy(cantanti[j].firstname,cantanti[i].firstname);
strcpy(cantanti[i].firstname,buffer);
strcpy(buffer,cantanti[j].dischi);
strcpy(cantanti[j].dischi,cantanti[i].dischi);
strcpy(cantanti[i].dischi,buffer);
}

}
}

Ricorda: le stringhe si copiano con strcpy (e, se non sei sicuro della lunghezza massima della stringa di origine, si usa strncpy a scanso di buffer overflow).

jurij7
25-03-2009, 17:04
ok grazie tante
quindi '=' si usa solo con le vriabili semplici ?
inoltre come noti nel programmino il campo disco è double...cosa devo utilizzare per copiarlo?

MItaly
25-03-2009, 17:39
Originariamente inviato da jurij7
ok grazie tante
quindi '=' si usa solo con le vriabili semplici ?
Sì, per le variabili non-array. Di conseguenza non si può usare per le stringhe, che sono array di char.


inoltre come noti nel programmino il campo disco è double...cosa devo utilizzare per copiarlo?
Basta un normale =.

jurij7
25-03-2009, 17:51
#include <stdio.h>
#include <stdlib.h>
#define numcar 25
#define massimo 3



/*
*
*/
int main(){

struct cantante {
char lastname[numcar];
char firstname[numcar];
double dischi;
} cantanti[massimo];

int I;
int i;
int j = 0;
char buffer[numcar];
double disco;


for (I = 0; I <= massimo; I++){
printf ("Inserire cantante %d :\n", I );
printf ("Cognome : ");
scanf ("%25s", cantanti[I].lastname);
printf ("Nome : ");
scanf ("%25s", cantanti[I].firstname);
printf ("Totale dischi : ");
scanf ("%30f", cantanti[I].dischi);
}


for (i = 0; i < massimo - 1; i++){
for (j = i + 1; j < massimo; j++){
if (cantanti[i].dischi > cantanti[j].dischi){
strcpy(buffer,cantanti[j].lastname);
strcpy(cantanti[j].lastname,cantanti[i].lastname);
strcpy(cantanti[i].lastname,buffer);
strcpy(buffer,cantanti[j].firstname);
strcpy(cantanti[j].firstname,cantanti[i].firstname);
strcpy(cantanti[i].firstname,buffer);
disco = cantanti[j].dischi;
cantanti[j].dischi = cantanti[i].dischi;
cantanti[i].dischi = disco;

}

}
}

printf ("Stampa ordinata\n");
printf ("COGNOME\tNOME\tDISCHI\t\n");
for (I = 0; I <= massimo; I++){
printf ("%25s%25s%30f", cantanti[I].lastname, cantanti[I].firstname, cantanti[I].dischi);
}
return 0;
}


sembra ok....ma quando lo mando in esecuzione...mi esce uno strano messaggio
potresti provarlo ?
p.s.non so se sia il netbeans che mi da problemi..

YuYevon
25-03-2009, 18:51
L'ultima scanf() è errata



scanf ("%30f", cantanti[I].dischi);


innanzitutto il secondo argomento deve essere un puntatore alla variabile a cui vuoi assegnare un valore leggendolo da tastiera.

Poi, a che ti serve specificare "30" del codice di formato? Tra l'altro, per leggere un valore double (e il campo dischi è proprio di questo tipo) il codice di formato da utilizzare è %lf ("Long Float")



scanf ("%lf", &cantanti[I].dischi);


Ah, già che ti trovi includi pure l'header file string.h per la funzione strcpy().

Una curiosità: perché usi un tipo double per "dischi" che dovrebbe essere un tipo intero? Non penso sia perché hai bisogno di 64 bit per rappresentare il numero dei dischi di un autore :madai!?:

MItaly
25-03-2009, 18:56
#include <stdio.h>
#include <stdlib.h>
#include <string.h> //Necessaria per strcpy
#define NUMCAR 25 //Le macro si solito si scrivono tutte in maiuscolo per distinguerle
#define MASSIMO 3
#define ARRSIZE(arr) (sizeof(arr)/sizeof(*arr)) //Macro che ottiene le dimensioni di un array allocato sullo stack

int main(){

struct cantante {
char lastname[NUMCAR];
char firstname[NUMCAR];
unsigned int dischi; //Non sono necessari i double, non credo che nessuno abbia mai pubblicato frazioni di dischi...
} cantanti[MASSIMO];
//La variabile I non serve, si può riciclare i
int i;
int j = 0;
char buffer[NUMCAR];
double disco;


for (i = 0; i < MASSIMO; i++){ //i deve essere solo minore, mai essere uguale a MASSIMO, altrimenti sfori dall'array
printf ("Inserire cantante %d :\n", i);
printf ("Cognome : ");
scanf ("%24s", cantanti[i].lastname); //Occhio, il numero massimo di caratteri da acquisire è 24, il 25 è riservato al NUL
cantanti[i].lastname[ARRSIZE(cantanti[i].lastname)-1]=0; //Mi assicuro che il buffer sia NUL-terminated
printf ("Nome : ");
scanf ("%24s", cantanti[i].firstname);
cantanti[i].firstname[ARRSIZE(cantanti[i].firstname)-1]=0;
printf ("Totale dischi : ");
scanf ("%u",&cantanti[i].dischi);
//Se cantanti[i].dischi fosse stato un double come era prima avresti dovuto mettere:
//scanf ("%lf", &cantanti[i].dischi);
}


for (i = 0; i < MASSIMO - 1; i++){
for (j = i + 1; j < MASSIMO; j++){
if (cantanti[i].dischi > cantanti[j].dischi){
strcpy(buffer,cantanti[j].lastname);
strcpy(cantanti[j].lastname,cantanti[i].lastname);
strcpy(cantanti[i].lastname,buffer);
strcpy(buffer,cantanti[j].firstname);
strcpy(cantanti[j].firstname,cantanti[i].firstname);
strcpy(cantanti[i].firstname,buffer);
disco = cantanti[j].dischi;
cantanti[j].dischi = cantanti[i].dischi;
cantanti[i].dischi = disco;
}
}
}

printf ("Stampa ordinata\n");
//In questo modo le intestazioni sono allineate come le scritte
printf ("%25s%25s%30s\n","COGNOME","NOME","DISCHI");
for (i = 0; i < MASSIMO; i++){
printf ("%25s%25s%30u", cantanti[i].lastname, cantanti[i].firstname, cantanti[i].dischi);
}
return 0;
}

jurij7
25-03-2009, 19:49
grazie siete tutti molto gentili
una curiosità
perchè scanf ("%lf", &cantanti[I].dischi); e non per gli altri campi ?
forse perchè gli altri sono array di stringhe e quindi senza '&' è già puntatore?

Loading