[C] Correzione esercizio

di il
1 risposte

[C] Correzione esercizio

Salve a tutti,
sono alle primissime armi, ho fatto un esercizio, qualcuno ha la pazienza di dargli un'occhiata?
Ecco il testo:

******************************
Negozio dei cellulari

Si consideri un archivio dei cellulari contenente 100 modelli conservato in un archivio S:
Codice numerico del modello (progressivo univoco da 1 a 100)
Durata batteria
Peso
Prezzo acquisto
Numero totale di pezzi

Esistano 2 negozi, ognuno con il suo archivio del magazzino (rispettivamente N1, N2 di MAX 1.000 elementi l'uno) dei cellulari arrivati:
Codice numerico del modello (lo stesso dell'archivio S)
Prezzo di vendita unitario
Numero pezzi arrivati di questo modelli

N.B.: di un modello possono arrivare anche 2 stock con differente numero di pezzi

ESERCIZIO BASE

Scrivere in C un programma che:
1) Legge da tastiera le informazioni relative ai 100 modelli di cellulari mettendo il numero totale a 0.
2) Legge da tastiera il nome del negozio e chiama una funzione "magazzino" che legge da tastiera, in ordine casuale, ed inserisce nell'archivio gli arrivi.
3) Chiama una funzione "aggiorna" S che aggiorna il numero totale di pezzi arrivati nel negozio precedente nell'archivio dei cellulari S.
4) Chiama una funzione "ordina" che ordina gli archivi N1 ed N2 in base al Prezzo di vendita unitario e rende il valore totale dei cellulari presenti in quel magazzino.


ESERCIZIO 1

Inserire nel programma una funzione “Merce” che crea un vettore ordinato in base al prezzo di vendita unitario in cui sono presenti gli articoli di entrambi i negozi.

ESERCIZIO 2

Scrivere una funzione che costruisce 2 liste (L1 ed L2) contenenti rispettivamente tutti cellulari presenti nel magazzino N1 con peso superiore a 100 e minore di 100.

NB: le variabili usate devono essere locali e non è necessario controllare la correttezza dei dati in input.
*************************************************************

mia soluzione:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
int codice_modello;
int durata_batteria;
int peso;
float prezzo_acquisto;
int tot_pezzi_modello;} scheda_cellulare;

typedef struct {
scheda_cellulare c;
float prezzo_vendita;
int pezzi_arrivati_modello;} scheda_magazzino;

#define Smax 2
#define Nmax 2

typedef scheda_cellulare S[Smax];
typedef scheda_magazzino N[Nmax];

void leggi(S S1);
int magazzino(N Neg);
void stampaS(S S1);
void stampaN(N Neg);
void aggiorna(S S1,N Neg,int pezzi_arrivati_modello );
void ordinaInsertionSort(N Neg, int numero_arrivi);
void merce(N N1,N N2,int numero_arriviN1, int numero_arriviN2 );
void crealista(N Neg, int numero_arrivi);

int main() {
S S1={0};
N N1={0},N2={0};
char nome_negozio[3];
int numero_arriviN1=0;
int numero_arriviN2=0;
int done=0;
leggi(S1);
stampaS(S1);
do {
printf("Digita il nome del negozio nel quale vuoi inserire gli arrivi\n");
scanf("%s",nome_negozio);
if(strcmp(nome_negozio,"N1")==0) {
numero_arriviN1=magazzino(N1);
done=1;}
else if(strcmp(nome_negozio,"N2")==0) {
numero_arriviN2=magazzino(N2);
done=1;}
else printf("Nome negozio errato, ridigitare\n");
} while(!done);
aggiorna(S1, N1, numero_arriviN1);
stampaS(S1);
ordinaInsertionSort(N1,numero_arriviN1);
stampaN(N1);
merce(N1,N2,numero_arriviN1,numero_arriviN2);
crealista(N1, numero_arriviN1);
system("PAUSE");
return 0;
}

void leggi(S S1) {
int i;
for(i=0;i<Smax;i++) {
S1.codice_modello=i+1;
printf("Inserire la durata batteria del modello cell %d\n",i+1);
scanf("%d",&S1.durata_batteria);
printf("Inserire il peso del modello cell %d\n",i+1);
scanf("%d",&S1.peso);
printf("Inserire il prezzo di acquisto del modello cell %d\n",i+1);
scanf("%f",&S1.prezzo_acquisto);}
}

int magazzino(N Neg) {
int done=0;
char conferma[3];
int numero_arrivi=0;
int i=0;
do {
printf("Ci sono degli arrivi da inserire in magazzino? dgt SI per conferma\n");
scanf("%s",conferma);
if(!strcmp(conferma,"SI")) {
printf("Inserire codice numerico dell'arrivo Nro %d\n",i+1);
scanf("%d",&Neg.c.codice_modello);
printf("Inserire il prezzo di vendita dell'arrivo Nro %d\n",i+1);
scanf("%f",&Neg.prezzo_vendita);
printf("Inserire il num di pezzi arrivati dell'arrivo Nro %d\n",i+1);
scanf("%d",&Neg.pezzi_arrivati_modello);
numero_arrivi++;
i++;}
else
done=1;
} while(!done);
return numero_arrivi;
}


void aggiorna(S S1, N Neg, int pezzi_arrivati_modello) {
int i,j=0;

for(i=0;i<Smax;i++)
for(j=0;j<pezzi_arrivati_modello;j++)
if(Neg[j].c.codice_modello==i+1)
S1.tot_pezzi_modello+=Neg[j].pezzi_arrivati_modello;
}


void ordinaInsertionSort(N Neg, int numero_arrivi) {
int i,j;
N tmp;
int num_cell_totali=0;
for (i=1;i<numero_arrivi;i++)
{
tmp=Neg;
for (j= i-1;(j>=0) && (Neg[j].prezzo_vendita>tmp[i].prezzo_vendita);j--)
Neg[j+1]=Neg[j];
Neg[j+1]=tmp[i];
}
for(i=0;i<numero_arrivi;i++)
num_cell_totali+=Neg[i].pezzi_arrivati_modello;
printf("Il numero totale di cellulari arrivati in magazzino è: %d\n",num_cell_totali);
}

void merce(N N1,N N2,int numero_arriviN1, int numero_arriviN2 ) {
int arrivi_totali=numero_arriviN1+numero_arriviN2;
int v[arrivi_totali];
int i,j;
scheda_magazzino Neg[arrivi_totali];
scheda_magazzino tmp[arrivi_totali];
for(i=0;i<numero_arriviN1;i++)
Neg[i]=N1[i];
for(i=numero_arriviN1;i<arrivi_totali;i++)
Neg[i]=N2[i-numero_arriviN1];
for(i=0;i<arrivi_totali;i++) {
printf("\n\nCodice modello:%d, prezzo vendita:%f, tot pezzi:%d\n\n",

Neg[i].c.codice_modello,Neg[i].prezzo_vendita,Neg[i].pezzi_arrivati_modello);}
for (i=1;i<arrivi_totali;i++)
{
tmp[i]=Neg[i];
for (j= i-1;(j>=0) && (Neg[j].prezzo_vendita>tmp[i].prezzo_vendita);j--)
Neg[j+1]=Neg[j];
Neg[j+1]=tmp[i];
}
for(i=0;i<arrivi_totali;i++)
v[i]=Neg[i].c.codice_modello;
}


struct nodo{
scheda_magazzino cellulare;
struct nodo *next;};


void crealista(N Neg, int numero_arrivi) {
struct nodo *testaL1;
struct nodo *nuovoElementoL1;
testaL1=NULL;
struct nodo *testaL2;
struct nodo *nuovoElementoL2;
testaL2=NULL;
int i;
for(i=0;i<numero_arrivi;i++) {
if(Neg[i].c.peso>100)
{
nuovoElementoL1=(struct nodo*)malloc(sizeof(struct nodo));
nuovoElementoL1->cellulare=Neg[i];
nuovoElementoL1->next=testaL1;
testaL1=nuovoElementoL1;
}
else if(Neg[i].c.peso<100)
{
nuovoElementoL2=(struct nodo*)malloc(sizeof(struct nodo));
nuovoElementoL2->cellulare=Neg[i];
nuovoElementoL2->next=testaL2;
testaL2=nuovoElementoL2;
}
}
struct nodo *tmp;
tmp=testaL1;
while(tmp!=NULL)
{
printf("%d ",tmp->cellulare.c.codice_modello);
tmp=tmp->next;
}
}


void stampaS(S S1) {
int i=0;
for(i=0;i<Smax;i++) {
printf("\n\nCodice modello:%d, durata batteria:%d, peso:%d, prezzo acquisto:%f, tot pezzi:%d\n\n",

S1[i].codice_modello,S1[i].durata_batteria,S1[i].peso,S1[i].prezzo_acquisto,S1[i].tot_pezzi_modello);}
}

void stampaN(N Neg) {
int i=0;
for(i=0;i<Nmax;i++) {
printf("\n\nCodice modello:%d, prezzo vendita:%f, tot pezzi:%d\n\n",

Neg[i].c.codice_modello,Neg[i].prezzo_vendita,Neg[i].pezzi_arrivati_modello);}
}


La funzione "crealista" non funziona, deve esserci un errore negli if ma non sono riuscito a trovarlo.
Per il resto funziona anche se sicuramente ci saranno state soluzioni migliori per risolvere l'esercizio.
Grazie ciao

1 Risposte

  • Re: [C] Correzione esercizio

    Non si capisce niente, ci vuole un ora per capire quel che hai fatto. Inserisci il codice attraverso il pulsantino code apposito. Riporta gli errori warning e eccezioni che ottieni e incolla solo il codice che ritieni errato.
Devi accedere o registrarti per scrivere nel forum
1 risposte