Visualizzazione dei risultati da 1 a 10 su 10

Discussione: c++ getch e struct

  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    8

    c++ getch e struct

    ho un probblema con il mio progetto
    devo fre una lista di multe
    uso un ciclo di getch inserire la targa in una struct
    fino qua tutto ok...
    poi popolo la lista
    p->link=dato;

    struct DATO{
    char targa[6];
    char info[40],luogo[40],data[7];
    int n;
    float euro;
    }dato;

    struct NODO {
    // PARTE INFORMATIVA
    DATO info;
    // PARTE DI COLLEGAMENTO
    NODO *link;
    };

    a seconda di dove metto targa[6] l'ultima sua lettera viene sostituita o da info o da luogo..perchè???nella struct dato.targa è giusta(ho provato cn un cout) nella lista è sbagliata(provato cn cout e con una trascrizione su file)..non trovo la soluzione..aiutatemi!!

  2. #2
    dato.targa è giusta nella lista è sbagliata
    Se mandi anche il codice che usi è meglio.

    Forse Targa[6] è un pò troppo corta e
    scrivendo oltrepassi il limite dell'array?
    Le targhe moderne sono formate da 2
    lettere 3 numeri 2 lettere, cioè almeno
    2+3+2=7 caratteri, se aggiungi gli spazi,
    tra numeri e lettere e magari un carattere
    di fine stringa arrivi a 10 caratteri.

  3. #3
    dato.targa è giusta nella lista è sbagliata
    Se mandi anche il codice che usi è meglio.

    Forse Targa[6] è un pò troppo corta e
    scrivendo oltrepassi il limite dell'array?
    Le targhe moderne sono formate da 2
    lettere 3 numeri 2 lettere, cioè almeno
    2+3+2=7 caratteri, se aggiungi gli spazi,
    tra numeri e lettere e magari un carattere
    di fine stringa arrivi a 10 caratteri.

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    8
    ecco il codice mi affido a voi geni dell'informatica...cmq targa [6] ha 7 caratteri


    #include <iostream>
    #include <conio.h>
    #include<fstream.h>
    using namespace std;

    //**********************************STRUTTURE******* *************************************

    struct ANAGRAFE{

    char nome[11],cognome[20],via[40],city[20],tel[20],pagamento[10];
    int num_via,n;
    }anagrafe;

    struct DATO{
    char targa[6];
    char info[40],luogo[40],data[7];
    int n;
    float euro;
    }dato;

    struct NODO {
    // PARTE INFORMATIVA
    DATO info;
    // PARTE DI COLLEGAMENTO
    NODO *link;
    };

    NODO *testa= NULL; // lista vuota

    struct NODO1 {
    // PARTE INFORMATIVA
    ANAGRAFE info;
    // PARTE DI COLLEGAMENTO
    NODO1 *link;
    };
    NODO1 *testa1= NULL; // lista vuota


    // ************************************************** PROTOTIPI***************************************** *******
    int InserimentoOrdinato();
    int InserimentoOrdinato1();
    void InserimentoDati();
    void InserimentoDatiAnagrafici();
    void RegistrazionePagamento();
    void ConsultaLista();
    void InizializzaAnagrafe();
    int ControllaEsistenzaMulta(int num);
    void Scrivi();
    void Scrivi1();
    int Menu();

    //************************************************** *MAIN********************************************* *******
    int main() {
    system("cls"); //Pulizia dello schermo
    cout << endl;
    cout << endl;
    cout <<" __________________________________________________ _________________ "<<endl;
    cout <<" | |"<< endl;
    cout <<" | Programma per la registrazione e consultazione di multe |"<< endl;
    cout <<" | |"<< endl;
    cout <<" | |"<< endl;
    cout <<" | Realizzato da: BONACORSI ANDREA Matricola n. 1002594 |"<< endl;
    cout <<" |_________________________________________________ __________________|"<< endl;
    cout << endl;
    cout << endl;
    cout << endl;
    int x=0;
    while (x==0){
    switch (Menu()){
    case (1):{
    InserimentoDati();
    InserimentoOrdinato();
    Scrivi();
    break;
    }
    case (2):{
    InserimentoDatiAnagrafici();
    InserimentoOrdinato1();
    Scrivi1();
    break;
    }
    case (3):{
    RegistrazionePagamento();
    break;
    }
    case (4):{
    ConsultaLista();
    break;
    }
    case (5):{
    x=1;
    break;
    }
    default: cout<<endl<<"digitazione errata"<<endl<<endl;
    break;
    }//Fine switch

    }//Fine While

    system("PAUSE");
    return 0;
    } // fine main




    //********************************FUNZIONI********** *************************************************

    int Menu(){
    int scelta=0,i=0;
    while(scelta==0){
    cout<<"scegli l'operazione da eseguire : "<<endl
    <<"1)registrare una multa; "<<endl
    <<"2)aggiungere i dati anagrafici; "<<endl
    <<"3)registrare l'avvenuto pagamento; "<<endl
    <<"4)consultare la lista; "<<endl
    <<"5) niente."<<endl<<endl<<endl;
    cin>>scelta;
    }//Fine while
    return scelta;
    }//fine Menu()

    void InserimentoDati(){
    cout<<endl<<"inserisci il numero della contravvenzione : "<<endl;
    cin>>dato.n;

    cout<<"inserisci la targa del veicolo : "<<endl;
    strcpy(dato.targa,"-------");
    cout<<endl<<" "<<dato.targa<<endl;
    for(int i=0;i<7;i++){
    if(i<7){
    dato.targa[i]=getch();
    cout<<endl<<" "<<dato.targa<<endl;
    }//fine if
    }//fine for

    cout<<"inserisci il luogo della contravvenzione : "<<endl;
    cin.ignore (40,'\n');
    cin.getline(dato.luogo,40,'\n');
    cin.ignore (40,'\n');
    cout<<"inserisci il tipo di contravvenzione : "<<endl;
    cin.getline(dato.info,40,'\n');
    cin.ignore (40,'\n');

    cout<<"inserisci la data della contravvenzione : "<<endl;
    strcpy(dato.data,"--/--/--");
    cout<<endl<<" "<<dato.data<<endl;
    for(int i=0;i<8;i++){
    if (i==0 or i==1 or i==3 or i==4 or i==6 or i==7){
    dato.data[i]=getch();
    cout<<endl<<" "<<dato.data<<endl;
    }//fine if
    }//fine for
    cout<<"inserisci l'importo della contravvenzione : "<<endl;
    cin>>dato.euro;
    }//fine InserimentoDati()

    int InserimentoOrdinato() {
    NODO *p = new NODO;
    if (p == NULL) {
    cerr << "Memoria esaurita";
    return 1;
    }
    p->info=dato;
    if (testa== NULL) { // PRIMO NODO INSERITO
    testa= p;
    testa->link = NULL;
    }
    else { // NODI SUCCESSIVI
    if (testa->info.n > dato.n) { // VA INSERITO IN TESTA
    p->link = testa;
    testa = p;
    }
    else { // VA INSERITO DOPO LA TESTA
    NODO *q=testa;
    while (q->link != NULL) {
    if (q->link->info.n > dato.n) break;
    q = q->link;
    } // fine while
    p->link = q->link;
    q->link = p;
    } // fine else
    } // FINE else

    return 0;
    } // Fine InserimentoOrdinato()


    int InserimentoOrdinato1() {
    NODO1 *p1 = new NODO1;
    if (p1 == NULL) {
    cerr << "Memoria esaurita";
    return 1;
    }
    p1->info=anagrafe;
    if (testa1== NULL) { // PRIMO NODO INSERITO
    testa1= p1;
    testa1->link = NULL;
    }
    else { // NODI SUCCESSIVI
    if (testa1->info.n > anagrafe.n) { // VA INSERITO IN TESTA
    p1->link = testa1;
    testa1 = p1;
    }
    else { // VA INSERITO DOPO LA TESTA
    NODO1 *q1=testa1;
    while (q1->link != NULL) {
    if (q1->link->info.n > anagrafe.n) break;
    q1 = q1->link;
    } // fine while
    p1->link = q1->link;
    q1->link = p1;
    } // fine else
    } // FINE else

    return 0;
    } // Fine InserimentoOrdinato1


    int ControllaEsistenzaMulta(int num){
    NODO *p=testa;
    int i=0;
    while(p!=NULL){
    if(p->info.n==num)
    i=1;
    p=p->link;
    }//fine while
    return i;
    }//fine ControllaEsistenzaMulta()


    void InserimentoDatiAnagrafici(){
    cout<<"inserisci il numero della contravvenzione : "<<endl;
    cin>>anagrafe.n;
    if(ControllaEsistenzaMulta(anagrafe.n)!=0){
    cout<<" inserisci il nome : "<<endl;
    cin>>anagrafe.nome;
    cout<<" inserisci il cognome : "<<endl;
    cin>>anagrafe.cognome;
    cout<<"inserisci la via : "<<endl;
    cin.ignore (40,'\n');
    cin.getline(anagrafe.via,40,'\n');
    cin.ignore (40,'\n');
    cout<<"inserisci il numero fiscale : "<<endl;
    cin>>anagrafe.num_via;
    cout<<"inserisci la citta' di residenza : "<<endl;
    cin>>anagrafe.city;
    cout<<"inserisci il numero di telefono : "<<endl;
    cin>>anagrafe.tel;
    strcpy(anagrafe.pagamento,"--/--/--");
    }
    else cout<<endl<<"multa inesistente"<<endl<<endl;
    }//fine InserimentoDatiAnagrafici()


    void RegistrazionePagamento(){
    int n;

    cout<<"inserisci il numero di contravvenzione della quale si deve registrare l'avvenuto pagamento"<<endl;
    cin>>n;
    NODO1 *p1 = testa1;
    while(p1 != NULL) {
    if (p1->info.n==n){
    cout<<"inserisci la data di pagamento : "<<endl;

    for(int i=0;i<8;i++){
    if (i==0 or i==1 or i==3 or i==4 or i==6 or i==7){
    p1->info.pagamento[i]=getch();
    cout<<" "<<p1->info.pagamento<<endl;
    }//fine if
    }//fine for
    }//fine if
    else
    cout<<"contravvenzione inesistente"<<endl<<endl;
    p1 = p1->link;
    }//fine while
    }// fine RegistrazionePagamento()


    void ConsultaLista(){
    int scelta,n;
    char nome[20],cognome[20];

    cout<<"inserisci il metodo di consultazione"<<endl
    <<"1)conosco il nome;"<<endl
    <<"2)conosco il numero della contravvenzione;"<<endl;
    cin>>scelta;

    switch (scelta){
    case (1):{
    NODO1 *p1 = testa1;
    NODO *p=testa;

    cout<<"inserisci il nome"<<endl;
    cin>>nome;
    cout<<"inserisci il cognome"<<endl;
    cin>>cognome;
    while(p1 != NULL) {
    if(strcmp(p1->info.nome,nome)==0){
    if(strcmp(p1->info.cognome,cognome)==0){
    while(p != NULL) {
    if(p->info.n==p1->info.n){
    cout <<endl<<"Contravvenzione n^ "<< p->info.n << endl<<endl
    <<"Targa veicolo: "<<p->info.targa<<endl<<endl
    <<"Data : "<<p->info.data<<endl<<endl
    <<"Info multa : "<<p->info.info << endl<<endl

    <<"Luogo : "<<p->info.luogo << endl<<endl
    <<"Importo : "<<p->info.euro <<" euro ";
    }//fine if
    p=p->link;
    }//fine while
    cout <<endl<<"nome : "<<p1->info.nome<<" "<<p1->info.cognome<<endl<<endl
    <<"via : "<<p1->info.via<<" n^ "<<p1->info.num_via<<endl<<endl
    <<"citta' di residenza : "<<p1->info.city<<endl<<endl
    <<"telefono n^ : "<<p1->info.tel<<endl<<endl
    <<"pagamento avvenuto in data :"<<p1->info.pagamento<<endl<<endl;
    }//fine if cognome
    else cout<<endl<<"il nome esiste ma con un cognome diverso"<<endl;
    }//fine if nome
    p1 = p1->link;
    }//fine while
    cout<<endl<<endl<<"ricerca terminata"<<endl<<endl;
    break;
    }//fine case 1

    case (2):{
    int n;
    cout<<"inserisci il numero della contravvenzione"<<endl;
    cin>>n;
    NODO *p = testa;
    while(p != NULL) {
    if(p->info.n==n){
    cout <<endl<<"Contravvenzione n^ "<< p->info.n << endl<<endl
    <<"Data : "<<p->info.data<<endl<<endl
    <<"Info multa : "<<p->info.info << endl<<endl
    <<"Targa veicolo: "<<p->info.targa<<endl<<endl
    <<"Luogo : "<<p->info.luogo << endl<<endl
    <<"Importo : "<<p->info.euro <<" euro "<<endl<<endl;
    }//fine if
    p = p->link;
    }//fine while
    NODO1 *p1 = testa1;
    while(p1 != NULL){
    if(p1->info.n==n){
    cout <<endl<<"nome : "<<p1->info.nome<<" "<<p1->info.cognome<<endl<<endl
    <<"via : "<<p1->info.via<<" n^ "<<p1->info.num_via<<endl<<endl
    <<"citta' di residenza : "<<p1->info.city<<endl<<endl
    <<"telefono n^ : "<<p1->info.tel<<endl<<endl
    <<"pagamento avvenuto in data :"<<p1->info.pagamento<<endl<<endl;
    }//fine if
    p1 = p1->link;
    }//fine while

    break;
    }//fine case 2

    default:{
    cout<<endl<<"digitazione errata."<<endl;
    break;
    }//fine default
    }//fine switch
    }//fine ConsultaLista()

    void InizializzaAnagrafe(){
    strcpy(anagrafe.nome,"non inserito");
    strcpy(anagrafe.cognome,"non inserito");
    strcpy(anagrafe.via,"non inserito");
    strcpy(anagrafe.city,"non inserito");
    strcpy(anagrafe.tel,"-----------");
    strcpy(anagrafe.nome,"non inserito");
    anagrafe.num_via=0;
    anagrafe.n=0;
    }


    void Scrivi(){
    NODO *p=testa;

    ofstream fout("contravvenzioni.txt"); // creazione file

    while(p!=NULL){ // per far scorrere la lista
    fout<<p->info.n<<endl; // stampa su file
    fout<<p->info.data<<endl;
    fout<<p->info.luogo<<endl;
    fout<<p->info.targa<<endl;
    fout<<p->info.info<<endl;
    fout<<p->info.euro<<endl;
    fout<<"#"<<endl;
    p=p->link; // incrementare di un nodo della lista
    }//fine while

    fout.close(); // chiusura file

    }//fine scrivi()

    void Scrivi1(){
    NODO1 *p1=testa1;

    ofstream fout("anagrafe.txt"); // creazione file

    while(p1!=NULL) // per far scorrere la lista
    {
    fout<<p1->info.nome<<endl; // stampa su file
    fout<<p1->info.cognome<<endl;
    fout<<p1->info.city<<endl;
    fout<<p1->info.via<<endl;
    fout<<p1->info.num_via<<endl;
    fout<<p1->info.tel<<endl;
    fout<<"#"<<endl;
    p1=p1->link; // incrementare di un nodo della lista
    }

    fout.close(); // chiusura file

    }//fine Scrivi1

  5. #5
    Originariamente inviato da BonaBg
    ecco il codice mi affido a voi geni dell'informatica...cmq targa [6] ha 7 caratteri
    codice:
    struct DATO{
       char targa[6];
       char info[40],luogo[40],data[7];
       int n;
       float euro;
    }dato;
    
    /* ... */
    
    void InserimentoDati(){
        cout<<endl<<"inserisci il numero della contravvenzione : "<<endl;
        cin>>dato.n;
        
        cout<<"inserisci la targa del veicolo : "<<endl;
        strcpy(dato.targa,"-------");
    /* ... */
        strcpy(dato.data,"--/--/--");
    come minimo "sfori" gli array targa e data, ed è sufficiente per generare un comportamente indefinito.

    Infatti targa è un array con 6 elementi, e tu con la strcpy(dato.targa,"-------"); cerchi di infilarglierne 8!
    Simile discorso per data che è un array di 7 elementi, e tu con strcpy(dato.data,"--/--/--"); cerchi di infilaglierne 9!

    Leggiti bene la documentazione di strcpy.
    ;-)

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    8
    Originariamente inviato da MacApp
    come minimo "sfori" gli array targa e data, ed è sufficiente per generare un comportamente indefinito.

    Infatti targa è un array con 6 elementi, e tu con la strcpy(dato.targa,"-------"); cerchi di infilarglierne 8!
    Simile discorso per data che è un array di 7 elementi, e tu con strcpy(dato.data,"--/--/--"); cerchi di infilaglierne 9!

    Leggiti bene la documentazione di strcpy.
    ;-)
    ok c guardo ma data funge...

  7. #7
    Originariamente inviato da BonaBg
    ma data funge...
    All'insieme dei comportamenti indefiniti che ti ho segnalato, appartengono anche comportamenti, che ad un'analisi molto superficiale, possono sembrano corretti, ma che alla lunga hanno una notevole probabiltà di trasformarsi in disastri.
    ;-)

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    8
    Originariamente inviato da MacApp
    All'insieme dei comportamenti indefiniti che ti ho segnalato, appartengono anche comportamenti, che ad un'analisi molto superficiale, possono sembrano corretti, ma che alla lunga hanno una notevole probabiltà di trasformarsi in disastri.
    ;-)
    hai ragione comunque risolto.Grazie... ma come mai strcpy inseriva 8 caratteri??io pensavo solo 7 cmq grazie...

  9. #9
    Originariamente inviato da BonaBg
    ma come mai strcpy inseriva 8 caratteri??io pensavo solo 7 cmq grazie...
    da
    http://www.openbsd.org/cgi-bin/man.c...rcpy&sektion=3
    codice:
         The strcpy() and strncpy() functions copy the string src to dst (includ-
         ing the terminating `\0' character).
    ;-)

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    8
    Originariamente inviato da MacApp
    da
    http://www.openbsd.org/cgi-bin/man.c...rcpy&sektion=3
    codice:
         The strcpy() and strncpy() functions copy the string src to dst (includ-
         ing the terminating `\0' character).
    ;-)
    vero...stupido io...

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