Return da sottoprogramma

di il
13 risposte

Return da sottoprogramma

Ho un piccolo problema con questo esercizio, vi passo qui sotto il codice che ho scritto:

/*a) Realizzare un sottoprogramma C che riceve come parametri un array di scatole sc, la sua
dimensione dim ed un valore in virgola mobile che rappresenta un peso. Analizzando le scatole
nell’ordine in cui si trovano nell’array, il sottoprogramma valuta e restituisce il numero di scatole che
può essere immagazzinato in un container avente una capienza pari al peso ricevuto come ultimo
parametro.
b) Scrivere un programma C che chiede all’utente i dati contenuti in dieci scatole; per ciascuna scatola
il programma chiede prima quanti oggetti sono contenuti e poi i dati di ciascun oggetto. In seguito il
programma invoca la funzione sopra definita e visualizza il risultato a video.
*/
#include <stdio.h>
#include <string.h>
#define N_OGGETTI 100
#define MAX_STR 100
#define dim1 3



typedef struct{
 char descrizione[MAX_STR+1];
 float peso_per_unita;
 int quanti;
 int codice;
} t_oggetto;
typedef struct{
 t_oggetto oggetti[N_OGGETTI];
 int n_oggetti;
 char descrizione[MAX_STR+1];
 int codice;
} t_scatola;

int partea(t_scatola sc[], int dim, int a ) {
	
	int i;
	int scatole=0;
	
	for(i=0;i<dim;i++){
	
    if(sc[i].oggetti[i].peso_per_unita*sc[i].oggetti[i].quanti<a){
    	scatole++;
    	a=a-(sc[i].oggetti[i].peso_per_unita*sc[i].oggetti[i].quanti);
    	if(a<0){
    		scatole--;
    		return scatole;
		}
	}
		
	}
	
	return scatole;
	
}

int main(){
	
	int i=0;
	
	t_scatola sc[dim1];
	
	for(i=0;i<dim1;i++){
	
		printf("quanti oggetti ci sono nella scatola? ");
		scanf("%d", &sc[i].oggetti[i].quanti);
		
		printf("quanto pesa un singolo oggetto? ");
		scanf("%d", &sc[i].oggetti[i].peso_per_unita);
		
	}
	
	printf("\n");
	printf("il risultato di scatole che possono entrare nel container e': %d", partea(sc,dim1,25));
	
	
	return 0;
}
quando mi stampa il risultato indipendentemente dal peso che metto per il container mi stampa il numero di scatole che ho inserito, mi spiego meglio....
per esempio se il peso che può reggere è: 25kg
se io registro 3 scatole dal peso di 300 kg l'una il programma mi stamperà che dentro il container ci possono stare 3 scatole, cosa non vera, dove sbaglio?


un altra cosa, ho messo dim1 uguale 2 per fare in fretta, e il peso del container è un int perché risulta più facile da fare per una prova.

13 Risposte

  • Re: Return da sottoprogramma

    ragazzo1223 ha scritto:


    Ho un piccolo problema con questo esercizio, vi passo qui sotto il codice che ho scritto:
    
    /*a) Realizzare un sottoprogramma C che riceve come parametri un array di scatole sc, la sua
    dimensione dim ed un valore in virgola mobile che rappresenta un peso. Analizzando le scatole
    nell’ordine in cui si trovano nell’array, il sottoprogramma valuta e restituisce il numero di scatole che
    può essere immagazzinato in un container avente una capienza pari al peso ricevuto come ultimo
    parametro.
    b) Scrivere un programma C che chiede all’utente i dati contenuti in dieci scatole; per ciascuna scatola
    il programma chiede prima quanti oggetti sono contenuti e poi i dati di ciascun oggetto. In seguito il
    programma invoca la funzione sopra definita e visualizza il risultato a video.
    */
    #include <stdio.h>
    #include <string.h>
    #define N_OGGETTI 100
    #define MAX_STR 100
    #define dim1 3
    
    
    
    typedef struct{
     char descrizione[MAX_STR+1];
     float peso_per_unita;
     int quanti;
     int codice;
    } t_oggetto;
    typedef struct{
     t_oggetto oggetti[N_OGGETTI];
     int n_oggetti;
     char descrizione[MAX_STR+1];
     int codice;
    } t_scatola;
    
    int partea(t_scatola sc[], int dim, int a ) {
    	
    	int i;
    	int scatole=0;
    	
    	for(i=0;i<dim;i++){
    	
        if(sc[i].oggetti[i].peso_per_unita*sc[i].oggetti[i].quanti<a){
        	scatole++;
        	a=a-(sc[i].oggetti[i].peso_per_unita*sc[i].oggetti[i].quanti);
        	if(a<0){
        		scatole--;
        		return scatole;
    		}
    	}
    		
    	}
    	
    	return scatole;
    	
    }
    
    int main(){
    	
    	int i=0;
    	
    	t_scatola sc[dim1];
    	
    	for(i=0;i<dim1;i++){
    	
    		printf("quanti oggetti ci sono nella scatola? ");
    		scanf("%d", &sc[i].oggetti[i].quanti);
    		
    		printf("quanto pesa un singolo oggetto? ");
    		scanf("%d", &sc[i].oggetti[i].peso_per_unita);
    		
    	}
    	
    	printf("\n");
    	printf("il risultato di scatole che possono entrare nel container e': %d", partea(sc,dim1,25));
    	
    	
    	return 0;
    }
    
    quando mi stampa il risultato indipendentemente dal peso che metto per il container mi stampa il numero di scatole che ho inserito, mi spiego meglio....
    per esempio se il peso che può reggere è: 25kg
    se io registro 3 scatole dal peso di 300 kg l'una il programma mi stamperà che dentro il container ci possono stare 3 scatole, cosa non vera, dove sbaglio?


    un altra cosa, ho messo dim1 uguale 2 per fare in fretta, e il peso del container è un int perché risulta più facile da fare per una prova.
    Ciao, l' errore è una cavolata assurda !
    Hai sbagliato specificatore di formato nella 2 scanf del main, questo è cio che hai scritto:
    scanf("%d", &sc[i].oggetti[i].peso_per_unita);
    questa è quella corretta:
    scanf("%f", &sc[i].oggetti[i].peso_per_unita);
    Se ti posso dare un consiglio comunque indenta meglio il programma e usa la parentesi, cosi è più semplice leggere il codice. Ti faccio un esempio:
    È più semplice e immediato leggere questo:
    
    if( ( (sc[i].oggetti[i].quantita) * (sc[i].oggetti[i].peso_per_unita) ) <= a ){
        		scatole++;
       		a -= ( (sc[i].oggetti[i].quantita) * (sc[i].oggetti[i].peso_per_unita) );
    }
    
    Piuttosto che questo:
    
     if(sc[i].oggetti[i].peso_per_unita*sc[i].oggetti[i].quanti<a){
        	scatole++;
        	a=a-(sc[i].oggetti[i].peso_per_unita*sc[i].oggetti[i].quanti);
    
    stesso discorso vale per l'indentazione, è decisamente più leggibile questo:
    
    for(int i = 0; i < dim ;i ++){
    	
        	if( ( (sc[i].oggetti[i].quantita) * (sc[i].oggetti[i].peso_per_unita) ) <= a ){
        	
        		scatole++;
        		
       		a -= ( (sc[i].oggetti[i].quantita) * (sc[i].oggetti[i].peso_per_unita) );
       			
       		if(a < 0){
       				scatole--;
       				return scatole;
    		}		
    	}
    }
    
    che questo:
    
    	for(i=0;i<dim;i++){
    	
        if(sc[i].oggetti[i].peso_per_unita*sc[i].oggetti[i].quanti<a){
        	scatole++;
        	a=a-(sc[i].oggetti[i].peso_per_unita*sc[i].oggetti[i].quanti);
        	if(a<0){
        		scatole--;
        		return scatole;
    		}
    	}
    		
    	}
    
  • Re: Return da sottoprogramma

    @ragazzo1223 al di là del fatto che il programma funzioni o meno, credo proprio che ci sia un problema logico di base relativamente alla definizione delle struct...
    Per esempio riguardo t_oggetto, dal momento che la generica istanza di una struct si riferisce ad un singolo oggetto, il membro peso_per_unita potrebbe tranquillamente chiamarsi peso, mentre il membro quanti non ha proprio senso di esistere.
    Riguardo t_scatola, invece, bisognerebbe prima di tutto chiarire cosa una generica scatola possa contenere. Presupponendo che essa possa contenere oggetti di diverso tipo e considerando i parametri della funzione, allora ha senso includere i membri oggetti e n_oggetti, ma a quel punto devi anche sfruttarli... non come fai nel main dove confondi il numero di scatole con il numero di oggetti contenuti nella singola scatola. Inoltre i membri descrizione e codice non hanno molto senso in riferimento ad una scatola.

    @Demda sarà sicuramente anche una questione di stile e di abitudine, ma secondo me un uso spropositato di parentesi tonde non aiuta molto la leggibilità del codice. Inoltre secondo me confondi l'indentazione con la spaziatura, infatti il frammento che porti come esempio non è indentato.
  • Re: Return da sottoprogramma

    Per me nessuno dei due esempi è ben leggibile
    sarò strano non farò testo, sarò un "programmatore giocattolo" me per io leggo bene così:
    
    
    for(int i = 0; i < dim ; i ++)
    {
       if(((sc[i].oggetti[i].quantita) * (sc[i].oggetti[i].peso_per_unita)) <= a)
       {
          scatole++;
          a -= ((sc[i].oggetti[i].quantita) * (sc[i].oggetti[i].peso_per_unita));
    
          if(a < 0)
          {
             scatole--;
             return scatole;
          }
       }
    }
    
    
    
  • Re: Return da sottoprogramma

    Nippolo ha scritto:


    @ragazzo1223 al di là del fatto che il programma funzioni o meno, credo proprio che ci sia un problema logico di base relativamente alla definizione delle struct...
    Per esempio riguardo t_oggetto, dal momento che la generica istanza di una struct si riferisce ad un singolo oggetto, il membro peso_per_unita potrebbe tranquillamente chiamarsi peso, mentre il membro quanti non ha proprio senso di esistere.
    Riguardo t_scatola, invece, bisognerebbe prima di tutto chiarire cosa una generica scatola possa contenere. Presupponendo che essa possa contenere oggetti di diverso tipo e considerando i parametri della funzione, allora ha senso includere i membri oggetti e n_oggetti, ma a quel punto devi anche sfruttarli... non come fai nel main dove confondi il numero di scatole con il numero di oggetti contenuti nella singola scatola. Inoltre i membri descrizione e codice non hanno molto senso in riferimento ad una scatola.

    @Demda sarà sicuramente anche una questione di stile e di abitudine, ma secondo me un uso spropositato di parentesi tonde non aiuta molto la leggibilità del codice. Inoltre secondo me confondi l'indentazione con la spaziatura, infatti il frammento che porti come esempio non è indentato.
    ciao, le struct non le ho scritte io ma erano in allegato con l'esercizio, il testo dell'esercizio di per se è piuttosto confusionario e ho svolto ciò che avevo più o meno capito...
  • Re: Return da sottoprogramma

    ragazzo1223 ha scritto:


    ciao, le struct non le ho scritte io ma erano in allegato con l'esercizio, il testo dell'esercizio di per se è piuttosto confusionario e ho svolto ciò che avevo più o meno capito...
    Capisco... giusto per curiosità, si tratta di un esercizio dato dal prof o lo hai trovato in rete?
    In ogni caso rimane l'errore che ti ho segnalato nel precedente post, ossia non utilizzi il membro n_oggetti confondendo il numero di scatole con il numero di oggetti contenuti nella singola scatola.
  • Re: Return da sottoprogramma

    È un esercizio che ha allegato il docente sulla sua pagina.

    forse non ho ben capito, il parametro n_oggetti indica quanti tipi di oggetti ci sono nella scatola?
    per esempio ne n_oggetti fosse uguale a 3, significa che in quella scatola ci sono (per esempio):
    dei bulloni, viti e cacciaviti?
  • Re: Return da sottoprogramma

    A rigor di logica n_oggetti dovrebbe essere la dimensione dell'array oggetti. Che poi i tipi di oggetti contenuti in una scatola debbano essere diversi è un'altra questione.
  • Re: Return da sottoprogramma

    Ah credo di aver capito allora, provo a scrivere qualcosa e sta sera vi aggiorno
  • Re: Return da sottoprogramma

    Nippolo ha scritto:


    @ragazzo1223 al di là del fatto che il programma funzioni o meno, credo proprio che ci sia un problema logico di base relativamente alla definizione delle struct...
    Per esempio riguardo t_oggetto, dal momento che la generica istanza di una struct si riferisce ad un singolo oggetto, il membro peso_per_unita potrebbe tranquillamente chiamarsi peso, mentre il membro quanti non ha proprio senso di esistere.
    Riguardo t_scatola, invece, bisognerebbe prima di tutto chiarire cosa una generica scatola possa contenere. Presupponendo che essa possa contenere oggetti di diverso tipo e considerando i parametri della funzione, allora ha senso includere i membri oggetti e n_oggetti, ma a quel punto devi anche sfruttarli... non come fai nel main dove confondi il numero di scatole con il numero di oggetti contenuti nella singola scatola. Inoltre i membri descrizione e codice non hanno molto senso in riferimento ad una scatola.

    @Demda sarà sicuramente anche una questione di stile e di abitudine, ma secondo me un uso spropositato di parentesi tonde non aiuta molto la leggibilità del codice. Inoltre secondo me confondi l'indentazione con la spaziatura, infatti il frammento che porti come esempio non è indentato.
    Secondo la mia esperienza questo frammento di codice:
    
    for(int i = 0; i < dim ;i ++){
    	
        	if( ( (sc[i].oggetti[i].quantita) * (sc[i].oggetti[i].peso_per_unita) ) <= a ){
        	
        		scatole++;
        		
       		a -= ( (sc[i].oggetti[i].quantita) * (sc[i].oggetti[i].peso_per_unita) );
       			
       		if(a < 0){
       			scatole--;
       			return scatole;
    		}		
    	}
    }
    
    
    è indentato "meglio" rispetto a questo:
    
    	for(i=0;i<dim;i++){
    	
        if(sc[i].oggetti[i].peso_per_unita*sc[i].oggetti[i].quanti<a){
        	scatole++;
        	a=a-(sc[i].oggetti[i].peso_per_unita*sc[i].oggetti[i].quanti);
        	if(a<0){
        		scatole--;
        		return scatole;
    		}
    	}
    		
    	}
    
  • Re: Return da sottoprogramma

    Certamente, e se io capissi come evitare che per ogni tab il browser mi metta 8 spazi, sarebbe anche meglio,
    rimane il fatto che io preferisco rientri "piccoli" (per risparmiare spazio a video) e parentesi graffe ben visibili
    ma qui si entra nei gusti personali
  • Re: Return da sottoprogramma

    Demda ha scritto:


    Secondo la mia esperienza questo frammento di codice:
    
    for(int i = 0; i < dim ;i ++){
    	
        	if( ( (sc[i].oggetti[i].quantita) * (sc[i].oggetti[i].peso_per_unita) ) <= a ){
        	
        		scatole++;
        		
       			a -= ( (sc[i].oggetti[i].quantita) * (sc[i].oggetti[i].peso_per_unita) );
       			
       			if(a < 0){
       				scatole--;
       				return scatole;
    			}		
    		}
    	}
    
    
    è indentato "meglio" rispetto a questo:
    
    	for(i=0;i<dim;i++){
    	
        if(sc[i].oggetti[i].peso_per_unita*sc[i].oggetti[i].quanti<a){
        	scatole++;
        	a=a-(sc[i].oggetti[i].peso_per_unita*sc[i].oggetti[i].quanti);
        	if(a<0){
        		scatole--;
        		return scatole;
    		}
    	}
    		
    	}
    
    Al di là della spaziatura, proprio non capisco perchè a livello di indentazione le righe
    a -= ...
    e
    if(a < 0){
    non si trovano sullo stesso piano di
    scatole++;
  • Re: Return da sottoprogramma

    Nippolo ha scritto:


    Demda ha scritto:


    Secondo la mia esperienza questo frammento di codice:
    
    for(int i = 0; i < dim ;i ++){
    	
        	if( ( (sc[i].oggetti[i].quantita) * (sc[i].oggetti[i].peso_per_unita) ) <= a ){
        	
        		scatole++;
        		
       			a -= ( (sc[i].oggetti[i].quantita) * (sc[i].oggetti[i].peso_per_unita) );
       			
       			if(a < 0){
       				scatole--;
       				return scatole;
    			}		
    		}
    	}
    
    
    è indentato "meglio" rispetto a questo:
    
    	for(i=0;i<dim;i++){
    	
        if(sc[i].oggetti[i].peso_per_unita*sc[i].oggetti[i].quanti<a){
        	scatole++;
        	a=a-(sc[i].oggetti[i].peso_per_unita*sc[i].oggetti[i].quanti);
        	if(a<0){
        		scatole--;
        		return scatole;
    		}
    	}
    		
    	}
    
    Al di là della spaziatura, proprio non capisco perchè a livello di indentazione le righe
    a -= ...
    e
    if(a < 0){
    non si trovano sullo stesso piano di
    scatole++;
    Chiedo venia, non me ne ero accorto. Correggo subito
  • Re: Return da sottoprogramma

    Demda ha scritto:


    Nippolo ha scritto:


    @ragazzo1223 al di là del fatto che il programma funzioni o meno, credo proprio che ci sia un problema logico di base relativamente alla definizione delle struct...
    Per esempio riguardo t_oggetto, dal momento che la generica istanza di una struct si riferisce ad un singolo oggetto, il membro peso_per_unita potrebbe tranquillamente chiamarsi peso, mentre il membro quanti non ha proprio senso di esistere.
    Riguardo t_scatola, invece, bisognerebbe prima di tutto chiarire cosa una generica scatola possa contenere. Presupponendo che essa possa contenere oggetti di diverso tipo e considerando i parametri della funzione, allora ha senso includere i membri oggetti e n_oggetti, ma a quel punto devi anche sfruttarli... non come fai nel main dove confondi il numero di scatole con il numero di oggetti contenuti nella singola scatola. Inoltre i membri descrizione e codice non hanno molto senso in riferimento ad una scatola.

    @Demda sarà sicuramente anche una questione di stile e di abitudine, ma secondo me un uso spropositato di parentesi tonde non aiuta molto la leggibilità del codice. Inoltre secondo me confondi l'indentazione con la spaziatura, infatti il frammento che porti come esempio non è indentato.
    Secondo la mia esperienza questo frammento di codice:
    
    for(int i = 0; i < dim ;i ++){
    	
        	if( ( (sc[i].oggetti[i].quantita) * (sc[i].oggetti[i].peso_per_unita) ) <= a ){
        	
        		scatole++;
        		
       		a -= ( (sc[i].oggetti[i].quantita) * (sc[i].oggetti[i].peso_per_unita) );
       			
       		if(a < 0){
       			scatole--;
       			return scatole;
    		}		
    	}
    }
    
    
    è indentato "meglio" rispetto a questo:
    
    	for(i=0;i<dim;i++){
    	
        if(sc[i].oggetti[i].peso_per_unita*sc[i].oggetti[i].quanti<a){
        	scatole++;
        	a=a-(sc[i].oggetti[i].peso_per_unita*sc[i].oggetti[i].quanti);
        	if(a<0){
        		scatole--;
        		return scatole;
    		}
    	}
    		
    	}
    
    C++ Core Guidelines, ES. 41: If in doubt about operator precedence, parenthesize

    “[...]Note You should know enough not to need parentheses for: [CODE] if (a < 0 || a <= max) { // ... }
Devi accedere o registrarti per scrivere nel forum
13 risposte