C: Stampa di una stringa contenente Carattere e numero

di il
18 risposte

C: Stampa di una stringa contenente Carattere e numero

Salve

e' il mio primo post su questo splendido forum che ho scoperto per caso nei meandri di internet, diciamo che gia leggendo e utilizzando la funzione cerca ho scoperto molte cose che mi han portato a migliorare molto la mia conoscenza del C.

Mi ritrovo di fronte a questo problema di cui posto il PDF essendo la traccia troppo lunga.



Ho risolto approssimativamente il compito assegnato tranne per un ultima parte, la stampa del "POSTO", sto impazzendo, non so ne come importare ne come stampare una stringa del tipo "A31", se la stampo come char *, mi sostituisce dei numeri con delle lettere, se la stampo come intero, mi sostituisce le lettere con i numeri, c'è un modo per gestire questa roba in C?

Questo e' il mio codice:


/*
 * main.c
 *
 *  Created on: 29/gen/2014
 *      Author: exSnake
 *
*/

#include <stdlib.h>
#include <stdio.h>
#define COLONNE 4
#define MAX 50

typedef enum {true, false} boolean;
typedef struct {
	int data[MAX];
	int ora[MAX];
	int sett[MAX];
	char posto[MAX];
}biglietti;

typedef struct {
	int settore[MAX];
	float prezzo[MAX];
}settori;

int Leggi_biglietti(biglietti *);
int Leggi_settori(settori *);
void Biglietti_venduti(biglietti *, settori *, int, int);

int main(){
	biglietti vett[MAX];
	settori v1[MAX];
	int num_biglietti, num_settori;

	num_biglietti = Leggi_biglietti(vett);
	num_settori = Leggi_settori(v1);
	Biglietti_venduti(vett, v1, num_biglietti, num_settori);

return EXIT_SUCCESS;
}

int Leggi_biglietti(biglietti tickets[]){
	FILE * fp;
	char file[MAX];
	int i=0;

	printf("Inserisci il nome del file contenente i biglietti venduti");
	scanf("%s", file);

	if ( (fp = fopen(file, "r")) == NULL){
		printf("Impossibile aprire il file");
		return EXIT_FAILURE;
	}

	while(!feof(fp) && i<MAX){
		fscanf(fp, "%d", &tickets->data[i]);
		fscanf(fp, "%d", &tickets->ora[i]);
		fscanf(fp, "%d", &tickets->sett[i]);
		fscanf(fp, "%s", &tickets->posto[i]);
		i++;
	}
	fclose(fp);

return i;
}

int Leggi_settori(settori * sector){
	FILE *fp;
	int i=0;

	if ( (fp = fopen("settori.txt", "r")) == NULL){
		printf("Impossibile aprire il file");
		return EXIT_FAILURE;
	}

	while(!feof(fp) && i<MAX){
		fscanf(fp, "%d", &sector->settore[i]);
		fscanf(fp, "%f", &sector->prezzo[i]);
		i++;
	}
	fclose(fp);

	printf("Numero settori: %d\n", i);
	getchar(); getchar();
return i;
}

void Biglietti_venduti(biglietti * tickets, settori * sector, int n_b, int n_s){
	int i, j, biglietti_venduti=0, trovato;
	float somma=0;

	printf("Numero settori: %d, numero biglietti: %d", n_s, n_b);

	for (i=0; i<n_b; i++){
		j=0; trovato=false;
		while(j<n_s && trovato == false){
			if (tickets->sett[i] == sector->settore[j]){
				somma += sector->prezzo[j];
				biglietti_venduti ++;
				trovato=true;
			}
			j++;
		}
		if (trovato == false){
			printf("*** Biglietto numero settore %d posto %s non valido\n\n", tickets->sett[i], &tickets->posto[i]);
		}
	}

	printf("- Biglietti venduti %d\n"
			"- Ricavo Euro: %.2f", biglietti_venduti, somma);

}

Sono ben accetti consigli su come migliorarlo e su errori notati.

18 Risposte

  • Re: C: Stampa di una stringa contenente Carattere e numero

    Scusa, in quale parte del programma devi visualizzare A31 ? E a quale variabile che contiene questo dato ti riferisci?
  • Re: C: Stampa di una stringa contenente Carattere e numero

    oregon ha scritto:


    Scusa, in quale parte del programma devi visualizzare A31 ? E a quale variabile che contiene questo dato ti riferisci?
    Ciao, grazie della risposta.

    Nella stampa del biglietto errato, l'ultima parte del codice (if trovato == false), la variabile e' un pezzo della struttura biglietti, ovvero tickets->posto, il file di esempio e' presente nel PDF ed e' quello che ho utilizzato io.
  • Re: C: Stampa di una stringa contenente Carattere e numero

    Perché hai usato il & nella printf ?

    Deve essere
    
    printf("*** Biglietto numero settore %d posto %s non valido\n\n", tickets->sett[i], tickets->posto[i]);
    
  • Re: C: Stampa di una stringa contenente Carattere e numero

    oregon ha scritto:


    Perché hai usato il & nella printf ?

    Deve essere
    
    printf("*** Biglietto numero settore %d posto %s non valido\n\n", tickets->sett[i], tickets->posto[i]);
    
    Perche' e' un puntatore a char, se non uso la & il compilatore mi restituisce un errore.(???)
  • Re: C: Stampa di una stringa contenente Carattere e numero

    Posto
    è un char.

    %s stampi una stringa %c stampi un carattere
  • Re: C: Stampa di una stringa contenente Carattere e numero

    ale99 ha scritto:


    posto
    è un char.

    %s stampi una stringa %c stampi un carattere


    Con %c mi stampa solo posto "A" e non mi stampa il numero del posto (A32), ancora non ho capito come fare...
  • Re: C: Stampa di una stringa contenente Carattere e numero

    exSnake ha scritto:


    Perche' e' un puntatore a char, se non uso la & il compilatore mi restituisce un errore.(???)
    No, cosa c'entra? ... semmai è un errore usare il & ... fai attenzione
  • Re: C: Stampa di una stringa contenente Carattere e numero

    oregon ha scritto:


    exSnake ha scritto:


    Perche' e' un puntatore a char, se non uso la & il compilatore mi restituisce un errore.(???)
    No, cosa c'entra? ... semmai è un errore usare il & ... fai attenzione
    Senza & il programma non continua, si blocca, non so neanche cosa faccia in realtà.

    C'e' qualche errore e non riesco a trovarlo perche' se stampo il tutto nel while di importazione, (sempre con &) funziona correttamente, ma appena fuori dal while di importazione si sballa tutto, quindi sbaglio qualcosa nell'importazione, ovvero nella funzione Leggi_biglietti, forse mi sovrascrive ogni volta il biglietto.

  • Re: C: Stampa di una stringa contenente Carattere e numero

    typedef struct
    {
        int data[MAX];
        int ora[MAX];
        int sett[MAX];
        char posto[MAX][MAX];
    } biglietti;
            fscanf(fp, "%s", tickets->posto[i]);
    Biglietti_venduti:
    printf("*** Biglietto numero settore %d posto %s non valido\n\n", tickets->sett[i], tickets->posto[i]);
    devi dichiarare posto come doppio puntatore, o lavorare con un'array di strutture.
    Come facevi tu, sovrascrivevi il posto di ciascun biglietto sulla stessa variabile(tutti i biglietti avevano la stessa zona di memoria per il posto).
    ricorda che una stringa è un vettore di char (char*), e quindi un vettore di stringhe è (char**)


    @Oregon
    Funzionava con la '&' proprio perchè era un puntatore singolo.
    altrimenti valutava posto come char.

    Cmq grazie per la tua vecchia spiegazione sui puntatori
  • Re: C: Stampa di una stringa contenente Carattere e numero

    No .... guardate che è tutto sbagliato ... sin dalle strutture che dovrebbero essere
    
    typedef struct {
       char data[9];
       char ora[5];
       int sett;
       char fila;
       int posto;
    } biglietto;
    
    typedef struct {
       int numero;
       float prezzo;
    } settore;
    
    e di conseguenza tutto il resto del codice ... completamente.
  • Re: C: Stampa di una stringa contenente Carattere e numero

    Il codice dovrebbe essere
    
    #include <stdlib.h>
    #include <stdio.h>
    
    #define MAX 50
    
    
    typedef struct {
       int data[9];
       int ora[5];
       int sett;
       char filaposto[4];
    } biglietto;
    
    typedef struct {
       int numero;
       float prezzo;
    } settore;
    
    int Leggi_biglietti(biglietto *);
    int Leggi_settori(settore *);
    void Biglietti_venduti(biglietto *, settore *, int, int);
    
    int main()
    {
    	biglietto biglietti[MAX];
    	settore settori[MAX];
    	int num_biglietti, num_settori;
    
    	num_biglietti = Leggi_biglietti(biglietti);
    	num_settori = Leggi_settori(settori);
    	Biglietti_venduti(biglietti, settori, num_biglietti, num_settori);
    
    	return EXIT_SUCCESS;
    }
    
    int Leggi_biglietti(biglietto *tickets)
    {
       FILE * fp;
       char file[MAX];
       int i=0;
    
       printf("Inserisci il nome del file contenente i biglietti venduti \n");
       scanf("%s", file);
    
       if ( (fp = fopen(file, "r")) == NULL){
          printf("Impossibile aprire il file");
          return EXIT_FAILURE;
       }
    
       while(!feof(fp) && i<MAX)
       {
          fscanf(fp, "%s", tickets[i].data);
          fscanf(fp, "%s", tickets[i].ora);
          fscanf(fp, "%d", &tickets[i].sett);
    	  fscanf(fp, "%s", tickets[i].filaposto);
          i++;
       }
       fclose(fp);
    
    	return i;
    }
    
    int Leggi_settori(settore *sector)
    {
       FILE *fp;
       int i=0;
    
       if ( (fp = fopen("settori.txt", "r")) == NULL){
          printf("Impossibile aprire il file");
          return EXIT_FAILURE;
       }
    
       while(!feof(fp) && i<MAX)
       {
          fscanf(fp, "%d", &sector[i].numero);
          fscanf(fp, "%f", &sector[i].prezzo);
          i++;
       }
       fclose(fp);
    
       return i;
    }
    
    void Biglietti_venduti(biglietto *tickets, settore *sector, int n_b, int n_s)
    {
       int i, j, biglietti_venduti=0, trovato;
       float somma=0;
    
       for (i=0; i<n_b; i++)
       {
    		j=0; trovato=false;
            while(j<n_s && trovato == false)
    		{
    			if (tickets[i].sett == sector[j].numero)
    			{
    				somma += sector[j].prezzo;
                    biglietti_venduti ++;
                   trovato=true;
                }
               j++;
            }
            if (trovato == false)
               printf("*** Biglietto numero settore %d posto %s non valido\n\n", tickets[i].sett, tickets[i].filaposto);
       }
    
       printf("- Biglietti venduti %d\n- Ricavo Euro: %.2f\n", biglietti_venduti, somma);
    }
    
    @ale99 ... rivedi ancora i puntatori ...
  • Re: C: Stampa di una stringa contenente Carattere e numero

    @Oregon
    Sinceramente non avevo capito, e continuo a non capire, il senso del suo programma...
    Avendo guardato le funzioni (e non il main) pensavo volesse salvare i dati di ogni biglietto nella stess struttura ( str-> elem [n] accede al dato elem del biglietto n), e per questo avevo pensato a un doppio puntatore (in effetti nel suo codice funzionava).

    Come hai scritto tu mi è molto più chiaro e logico.

    Due domande:
    perché hai deciso di trattare data e ora come puntatori a int?

    Il mio codice ( con la mia modifica) con nel main un solo puntatore a struttura( nel senso *punt=new struct biglietto; )
    è sbagliato? (Lo so che non è il massimo dal punto di vista logico ma dovrebbe funzionare ugualmente senza errori)
  • Re: C: Stampa di una stringa contenente Carattere e numero

    ale99 ha scritto:


    @Oregon
    Sinceramente non avevo capito, e continuo a non capire, il senso del suo programma...
    Avendo guardato le funzioni (e non il main) pensavo volesse salvare i dati di ogni biglietto nella stess struttura ( str-> elem [n] accede al dato elem del biglietto n), e per questo avevo pensato a un doppio puntatore (in effetti nel suo codice funzionava).

    Come hai scritto tu mi è molto più chiaro e logico.

    Due domande:
    perché hai deciso di trattare data e ora come puntatori a int?

    Il mio codice ( con la mia modifica) con nel main un solo puntatore a struttura( nel senso *punt=new struct biglietto; )
    è sbagliato? (Lo so che non è il massimo dal punto di vista logico ma dovrebbe funzionare ugualmente senza errori)
    Correggetemi se sbaglio, se definisco un typedef char stringa[100],

    poi definisco un tipo stringa vett[100], e' come avere un array bidimensionale di [100][100].

    Con le strutture non funziona cosi? Se definisco una struttura biglietti che contiene posti[100] e poi chiamo un tipo di "nomestruttura" vett[100] e poi salvo nella posizione vett.posti[0] non posso salvare nella posizione
    vett[0].posti[da 0 a 10]
    vett[1].posti[da 0 a 10]
    ?

    Si vede che non ho capito bene le strutture giusto?

    Perche' invece con gli interi funziona perfettamente? Il numero 203 occupa o no 3 spazi nell'array? (da 0 a 2)
  • Re: C: Stampa di una stringa contenente Carattere e numero

    ale99 ha scritto:


    @Oregon

    perché hai deciso di trattare data e ora come puntatori a int?
    Errore di copia incolla ... sono due vettori di char ...
Devi accedere o registrarti per scrivere nel forum
18 risposte