Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - non capisco cosa c'è di sbagliato in questo programma, mi aiutate?
Forum - C/C++ - non capisco cosa c'è di sbagliato in questo programma, mi aiutate?

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
___.benny (Normal User)
Newbie


Messaggi: 1
Iscritto: 04/04/2023

Segnala al moderatore
Postato alle 17:59
Martedì, 04/04/2023
ciao, scusate non capisco cosa ha di sbagliato in questo programma... da quello che ho capito mi prende il passaggio di parametri per riferimento (con le variabili record) come se fosse un'aggiunta alla dichiarazione ma non sono sicura.

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. struct Vendita
  6. {
  7.     int Codice;
  8.     char Nome[20];
  9.     float Prezzo;
  10.     int Venduti;
  11. };
  12.  
  13. void Inserisci(struct Vendita *j);
  14. void Uscita(struct Vendita k);
  15.  
  16. int main()
  17. {
  18.     struct Vendita  x, y, v[100];
  19.     int i=0;
  20.    
  21.    
  22.     Inserisci(&x);
  23.    
  24.     Inserisci(&y);
  25.    
  26.     for(i=0;i<5;i++)
  27.     {
  28.         Inserisci(&v[i]);
  29.     }
  30.    
  31.     Uscita(x);
  32.     Uscita(y);
  33.     for(i=0;i<5;i++)
  34.     {
  35.         Uscita(v[i]);
  36.     }
  37.    
  38.     return 0;
  39. }
  40.  
  41. void Inserisci(struct Vendita *j)
  42. {
  43.     printf("codice: ");
  44.     scanf("%d",j.Codice);
  45.    
  46.     printf("\nnome: ");
  47.     scanf("%s",j.Nome);
  48.    
  49.     printf("\nprezzo: ");
  50.     scanf("%f",j.Prezzo);
  51.    
  52.     printf("\nvenduti: ");
  53.     scanf("%d",j.Venduti);
  54. }
  55.  
  56. void Uscita(struct Vendita k)
  57. {
  58.     printf("\ncodice: %d",k.Codice);
  59.    
  60.     printf("\nnome: %s",k.Nome);
  61.    
  62.     printf("\nprezzo: %f",k.Prezzo);
  63.    
  64.     printf("\nvenduti: %d",k.Venduti);
  65. }



[Error] request for member 'Codice' in 'j', which is of pointer type 'Vendita*' (maybe you meant to use '->' ?)

mi da questo errore qua anche con Nome, Prezzo e Venduti, potreste aiutarmi? mi fareste un grande favore, grazie mille :)

Ultima modifica effettuata da AldoBaldo il 06/04/2023 alle 21:27
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 18:30
Martedì, 04/04/2023
Per la logica del codice ho dei dubbi su cosa vorresti ottenere... ma in C sono proprio scarso, per capire però si possono fare piccoli passi, per esempio tenere sotto controllo se i dati inseriti sono corretti ristampandoli, ho fatto solo un passaggio restituendo la struct e funziona.
So che si potrebbe con il puntatore variare la struct direttamente, ma visto che il passaggio è per riferimento dovrebbe essere la stessa cosa, spero che avrai risposte da chi ne sa più di me.

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. struct Vendita
  6. {
  7.     int Codice;
  8.     char Nome[20];
  9.     float Prezzo;
  10.     int Venduti;
  11. };
  12.  
  13. struct Vendita Inserisci(struct Vendita j);
  14. void Uscita(struct Vendita k);
  15.  
  16. int main()
  17. {
  18.     struct Vendita  x, y, v[100];
  19.     int i=0;
  20.  
  21.     x=Inserisci(x);
  22.  
  23.    // Inserisci(y);
  24.  
  25.    /* for(i=0;i<5;i++)
  26.     {
  27.         Inserisci(v[i]);
  28.     } */
  29.  
  30.     Uscita(x);
  31.    // Uscita(y);
  32.     /*
  33.     for(i=0;i<5;i++)
  34.     {
  35.         Uscita(v[i]);
  36.     }
  37.     */
  38.  
  39.     return 0;
  40. }
  41.  
  42. struct Vendita Inserisci(struct Vendita j)
  43. {
  44.     char c ="";
  45.     printf("codice: ");
  46.     scanf("%d",&j.Codice);
  47.     printf("%d",j.Codice);
  48.     if (c!='\n') while(getchar() != '\n'); // pulisce il buffer se occorre,
  49.                                            // prova a inserire un numero con la virgola
  50.                                            // senza questa riga
  51.  
  52.     printf("\nnome: ");
  53.     scanf("%s",&j.Nome);
  54.     printf("%s",j.Nome);
  55.     if (c!='\n') while(getchar() != '\n');
  56.  
  57.     printf("\nprezzo: ");
  58.     scanf("%f",&j.Prezzo);
  59.     printf("%.2f",j.Prezzo); // due cifre decimali
  60.     if (c!='\n') while(getchar() != '\n');
  61.  
  62.     printf("\nvenduti: ");
  63.     scanf("%d",&j.Venduti);
  64.     printf("%d",j.Venduti);
  65.     if (c!='\n') while(getchar() != '\n');
  66.  
  67.     return j; // restutuisco la struttura con i dati inseriti
  68. }
  69.  
  70. void Uscita(struct Vendita  k)
  71. {
  72.     printf("\ncodice: %d",k.Codice);
  73.  
  74.     printf("\nnome: %s",k.Nome);
  75.  
  76.     printf("\nprezzo: %.2f",k.Prezzo); // due cifre decimali
  77.  
  78.     printf("\nvenduti: %d",k.Venduti);
  79. }


Ultima modifica effettuata da Carlo il 25/04/2023 alle 20:59


in programmazione tutto è permesso
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 22:17
Martedì, 04/04/2023
Ci sono ancora alcune falle.

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define LMAX_NOME       19
  6. #define Q_VENDITE        5
  7. #define QMAX_VENDITE   100
  8.  
  9. typedef struct {
  10.     int Codice;
  11.     char Nome[LMAX_NOME+1];
  12.     float Prezzo;
  13.     int Venduti;
  14. } Vendita;
  15.  
  16. void Inserisci( Vendita *v );
  17. void Uscita( const Vendita *v );
  18.  
  19. int main() {
  20.     Vendita v[QMAX_VENDITE];
  21.     int i;
  22.  
  23.     for( i=0; i<Q_VENDITE; i++ )
  24.         Inserisci( v+i );
  25.  
  26.     for( i=0; i<Q_VENDITE; i++ )
  27.         Uscita( v+i );
  28.  
  29.     return 0;
  30. }
  31.  
  32. void Inserisci( Vendita *v ) {
  33.     if( NULL!=v ) {
  34.         printf( "\ncodice: " );
  35.         scanf( "%d", &v->Codice );
  36.         while( getchar()!='\n' );
  37.  
  38.         printf( "nome: " );
  39.         scanf( "%s", v->Nome );
  40.         while( getchar()!='\n' );
  41.  
  42.         printf( "prezzo: " );
  43.         scanf( "%f", &v->Prezzo);
  44.         while( getchar()!='\n' );
  45.  
  46.         printf( "venduti: " );
  47.         scanf( "%d", &v->Venduti );
  48.         while( getchar()!='\n' );
  49.  
  50.         return;
  51.     }
  52.  
  53.     puts( "Parametro non valido in Inserisci()." );
  54. }
  55.  
  56. void Uscita( const Vendita *v ) {
  57.     if( NULL!=v ) {
  58.         printf( "\ncodice: %d\nnome: %s\nprezzo: %.02f\nvenduti: %d",
  59.                 v->Codice, v->Nome, v->Prezzo, v->Venduti );
  60.         return;
  61.     }
  62.  
  63.     puts( "Parametro non valido in Uscita()." );
  64. }



Come si vede, ho tolto x e y perché non ho capito la loro utilità.

Ultima modifica effettuata da AldoBaldo il 04/04/2023 alle 22:19


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 9:23
Mercoledì, 05/04/2023
Aldo una domanda.
perché  char Nome[LMAX_NOME+1]; ?

anziché nel define dichiarare direttamente 20?

Non sò il motivo, ma sei indubbiamente più esperto di me su questo codice,
Chiedevo giusto per curiosità.


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 12:02
Mercoledì, 05/04/2023
Anche io ho delle curiosità da chiedere ad Aldo per imparare...

capisco cosa fa: Inserisci( v+i ) ma non perché lo fa, v è un vettore di 100 elementi composti da struct Vendita: perché quel v+i dovrebbe incrementare l'indice?
perché v è un puntatore? allora salta tante locazioni quante ne sono occupate da ogni singloa struct con un semplice +1, +2, +3, ...+n?
perché Inserisci( v[ i ] ) non è equivalente?

La riga di codice: scanf( "%d", &v->Codice );, come si legge? ->punta alle locazioni giuste in base alla struttura?

Quando dichiari la matrice: Vendita v[QMAX_VENDITE];
Non sarebbe corretto pulirla? Vendita v[QMAX_VENDITE] = {0};, se non lo fai e si inserisce una lettera quando viene richiesto l'intero per Vendita.Codice su Uscita verrà mostrato un valore arbitrario invece di zero.

Grazie per la pazienza, ma il C mi piace, solo che non lo uso mai, e quel poco che sapevo scompare con il tempo.

Ho scritto lo stesso codice funzionante senza puntatori, è proprio sbagliato? sarebbe meno efficiente?

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define LMAX_NOME       19
  6. #define Q_VENDITE        2
  7. #define QMAX_VENDITE   100
  8.  
  9. struct Vendita
  10. {
  11.     int Codice;
  12.     char Nome[LMAX_NOME+1];
  13.     float Prezzo;
  14.     int Venduti;
  15. };
  16.  
  17. struct Vendita Inserisci(struct Vendita j);
  18. void Uscita(struct Vendita k);
  19.  
  20. int main()
  21. {
  22.     struct Vendita v[QMAX_VENDITE];
  23.     int i=0;
  24.  
  25.     for( i=0; i<Q_VENDITE; i++ )
  26.         v[i]=Inserisci(v[i]);
  27.  
  28.     for( i=0; i<Q_VENDITE; i++ )
  29.         Uscita(v[i]);
  30.  
  31.     return 0;
  32. }
  33.  
  34. struct Vendita Inserisci(struct Vendita j)
  35. {
  36.     printf("codice: ");
  37.     scanf("%d",&j.Codice);
  38.     printf("\t%d",j.Codice);
  39.     while(getchar() != '\n'); // pulisce il buffer se occorre,
  40.                               // prova a inserire un numero con la virgola
  41.                               // senza questa riga
  42.  
  43.     printf("\nnome:   ");
  44.     scanf("%s",&j.Nome);
  45.     printf("\t%s",j.Nome);
  46.     while(getchar() != '\n');
  47.  
  48.     printf("\nprezzo: ");
  49.     scanf("%f",&j.Prezzo);
  50.     printf("\t%.2f",j.Prezzo); // due cifre decimali
  51.     while(getchar() != '\n');
  52.  
  53.     printf("\nvenduti:");
  54.     scanf("%d",&j.Venduti);
  55.     printf("\t%d\n\n",j.Venduti);
  56.     while(getchar() != '\n');
  57.  
  58.     return j; // restutuisco la struttura con i dati inseriti
  59. }
  60.  
  61.  void Uscita(struct Vendita  k)
  62. {
  63.     printf("\ncodice: %d",k.Codice);
  64.     printf("\nnome: %s",k.Nome);
  65.     printf("\nprezzo: %.2f",k.Prezzo); // due cifre decimali
  66.     printf("\nvenduti: %d",k.Venduti);
  67. }



Non mi aspetto che ___.benny si farà risentire...

Ultima modifica effettuata da Carlo il 05/10/2023 alle 0:44


in programmazione tutto è permesso
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 15:42
Mercoledì, 05/04/2023
Ciao. Ho scritto quel che ho scritto dopo una giornata di lavoro che mi ha lasciato estenuato, quindi sono stato piuttosto grezzo (avevo fretta di buttarmi nel letto). Ora son più "fresco", quindi torno sul tema con calma.

The Juster: "perché  char Nome[LMAX_NOME+1]; anziché dichiarare direttamente il valore completo?"

La questione sta nella scelta del nome nel #define. Avendo usato LMAX_NOME (per "lunghezza massima del nome") anziché, che so, DIM_BUFFER_NOME (per "dimensioni del buffer per il nome") ho voluto aggiungere lo spazio per il terminatore, che effettivamente non fa parte della lunghezza massima del nome. E' una pignoleria senza fondamento? Può darsi, ma mi è venuta così.

Carlo: "capisco cosa fa: Inserisci( v+i ) ma non perché lo fa, v è un vettore di 100 elementi composti da struct Vendita: perché quel v+i dovrebbe incrementare l'indice?"

E' uno dei princìpi dell'aritmetica dei puntatori, come hai osservato tu stesso scrivendo che "salta tante locazioni quante ne sono occupate da ogni singola struct".

Carlo: "perché Inserisci( v[ i ] ) non è equivalente?"

Sarebbe equivalente se fosse Inserisci(&v[ i ]), perché con v[ i ] identifichi un certo elemento dell'array, ma è con & che fornisci l'indirizzo di quell'elemento. Usare &v[ i ] oppure v+i è, in sostanza, la stessa cosa.

Carlo: "La riga di codice: scanf( "%d", &v->Codice );, come si legge? -> punta alle locazioni giuste in base alla struttura?"

Dunque... v->Codice individua direttamente il campo codice nell'ambito della struttura Vendita puntata da v, in sostanza ne fornisce direttamente il valore. Invece, &v->Codice fornisce il puntatore allo spazio di memoria nel quale si trova quel valore. Spero sia chiaro... è oggettivamente una cosa che può confondere (da autodidatta ignorante, mi ci sono spaccato ben bene la testa, anni fa, prima di capira cosa c'era dietro).

Carlo: "Quando dichiari la matrice: Vendita v[QMAX_VENDITE]; non sarebbe corretto pulirla con Vendita v[QMAX_VENDITE] = {0};?"

Sì! Da quel che ho letto pare sia sempre una buona pratica azzerare le variabili (o comunque inizializzarle con valori significativi) nel momento in cui le si dichiara. La stanchezza mi annebbiava e non ci ho pensato, in quel momento.

Carlo: "Ho scritto lo stesso codice funzionante senza puntatori, è proprio sbagliato? sarebbe meno efficiente?"

"Sbagliato" non credo proprio. In merito all'efficienza, mi verrebbe da dire che passare un puntatore può evitare l'allocazione di una certa quantità di spazio per le "copie" delle strutture, ma credo che il grado di efficienza dipenda da cosa c'è DENTRO a quelle strutture (se le strutture sono piccoline non credo che le differenze siano significative; se sono millemila byte forse è meglio evitare le copie e usare i puntatori).

Ovviamente il discorso cambia radicalmente se le strutture contengono puntatori ad aree di memoria allocate dinamicamente... in quel caso è parecchio più complicato (se valutato entro i limiti delle mie limitatissime competenze).

Comunque sia, non pensate neppure lontanamente che io sia un esperto. Per me queste cose sono un passatempo, un'occasione di svago. Proprio per questo, son contento di vedere (finalmente!) un po' di movimento nell'area "C/C++" del forum.

Carlo: "Non mi apetto che ___.benny si farà risentire..."

Questo, invece, mi rattrista. Porca miseria, possibile che nessuno si appassioni più a questo genere di cose? (Ora salterà su nessuno a tirarmi le orecchie! :rotfl: ) Il C è dunque morto?

Ultima modifica effettuata da AldoBaldo il 05/04/2023 alle 15:47


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 16:22
Mercoledì, 05/04/2023
Sei stato chiarissimo, forse perché non sono proprio a zero...

In altri forum vedo che c'è più fermento, ma anche li i post per la maggior parte sono di utenti alla prima domanda alla ricerca di codice scritto. Come dici tu Aldo è triste che uno studente sia solo a caccia di un voto sufficiente, mentre di imparare non gli interessa nulla.

ChaptGPT come verrà scoperto dagli studenti i forum si spopoleranno, per ora è un buon strumento se usato come fosse un manuale di riferimento ma il cammino è segnato, le nuove versioni di ChaptGPT o altre IA scriveranno codice funzionante.


in programmazione tutto è permesso
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 16:50
Mercoledì, 05/04/2023
Testo quotato

Postato originariamente da Carlo:

Sei stato chiarissimo, forse perché non sono proprio a zero...

In altri forum vedo che c'è più fermento, ma anche li i post per la maggior parte sono di utenti alla prima domanda alla ricerca di codice scritto. Come dici tu Aldo è triste che uno studente sia solo a caccia di un voto sufficiente, mentre di imparare non gli interessa nulla.

ChaptGPT come verrà scoperto dagli studenti i forum si spopoleranno, per ora è un buon strumento se usato come fosse un manuale di riferimento ma il cammino è segnato, le nuove versioni di ChaptGPT o altre IA scriveranno codice funzionante.



Dipende carlo...
Ricordi quel mio algoritmo famoso del nasting?
Ho provato a farlo a fare a gpt ma senza successo.
oddio, qualcosa è riuscita a tirarla fuori, ma non è in grado e non sarà mai in grado (almeno penso) di elaborare un codice perfettamente specifico a determinate esigenze.

Certo si scrivi, come disegno un cerchio, come leggo una stringa, sono cose banalissime.
può anche scriverti una sorta di mini programmino.
Ma realizzare determinati programmi con algoritmi abbastanza laboriosi, la vedo dura.
Fatto sta, che non è riuscito a risolvermi il problema :rofl:

alla fine ho continuato per la mia strada, e seguendo quello che la testa mi suggeriva.
Ovvero fare diversi algoritmi, con diversi passaggi in determinate situazioni.
cose che gpt non poteva nemmeno immaginare.

Per come la penso io, gpt non è una vera e propria IA.
Può risponderti in modo realistico tipo come un umano, seguendo dei modelli su cui è stato addestrato.

Per come la penso io, un IA dovrebbe essere in grado di contare su se stessa generando risposte o risolvere problemi anche scrivendo delle soluzioni proprie pensate da se stessa, e non basandosi su testi già scritti.

gpt funziona tipo come una catena.
se esempio deve risponderti: calcola area del cerchio

[calcola] ?  cosa
[area] ? di cosa
[cerchio]

ad ogni word, susseguono dei modelli che a loro volta punteranno a risposte differenti.
Penso che funzioni in questo modo.

Immagina tutto come un grafico di nodi.
C'è il primo nodo che è il word di input, e svariate diramazioni che sussegguono in base alle risposte.

Ultima modifica effettuata da Thejuster il 05/04/2023 alle 16:59


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 18:06
Mercoledì, 05/04/2023
Concordo. ChatGPT-3 è un manuale di riferimento facilmente sfogliabile. ChatGPT-4 va più in la. Siamo agli inizi tra un anno e più l'evoluzione a cosa porterà non si sa.
Uno studente a caccia della sufficienza senza nessuna voglia di imparare, con ChatGPT ha lo strumento quasi perfetto per non imparare nulla.

Ultima modifica effettuata da Carlo il 05/04/2023 alle 23:54


in programmazione tutto è permesso
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo