pumax84
21-09-2005, 16:33
Allora, stavo provando a programmare un compito d'esame passato di tecniche di programmazione (un esame che dovrò sostenere dopodomani) sulle ricette e gli ingredienti. Ma non riesco a spiegarmi alcune cose; tipo perchè mi restituisce errore in un punto del programma (il compilatore invece lo compila senza problemi)?? Chiaro che ci sarà un qualche errore forse di indirizzo, ma non riesco proprio a trovarlo. La cosa poi è strana perchè fino a poco fa funzionava, ora di punto in bianco si blocca... Mah...
Comunque vi allego il programma e se c'è qualcuno di buon cuore spero possa aiutarmi.
Allego inoltre lo screenshot del punto in cui si blocca.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Ingrediente{
char *nome;
int quantita;
char unita[10];
char note[150];
};
typedef struct Ingrediente TipoIngrediente;
struct ListaIngredienti{
TipoIngrediente ingrediente;
struct ListaIngredienti *next;
};
typedef struct ListaIngredienti TipoNodoLista;
typedef TipoNodoLista *TipoListaIngredienti;
struct Ricetta{
TipoListaIngredienti listaIngredienti;
char *descrizione;
};
typedef struct Ricetta TipoRicetta;
// PROTOTIPI FUNZIONI
void inserisciTestaLista(TipoListaIngredienti *, TipoIngrediente);
TipoListaIngredienti creaLista(int);
void stampaLista(TipoListaIngredienti);
int cercaIngrediente(TipoListaIngredienti, TipoIngrediente *, char *);
int eser1(TipoRicetta, TipoIngrediente, char * [], char * []);
void eser2(TipoListaIngredienti *, char *, int, char *, char *);
// MAIN
int main(void)
{
TipoRicetta ricetta;
TipoIngrediente ingrediente_trovato;
char *nome_ingrediente = NULL;
char *cerca_ingrediente = "pasta";
char unita_ingrediente[10], note_ingrediente[150];
char *unita_main;
char *note_main;
int quantita_ingrediente;
int trovato = 0;
int quantita = 0;
int k = 0;
int i = 0;
// Inserimento descrizione ricetta
printf("Inserisci una descrizione per la ricetta: ");
gets(ricetta.descrizione);
printf("\nQuesta e' la descrizione da te assegnata: %s\n\n", ricetta.descrizione);
// Inserimento del numero di ingredienti e creazione lista
printf("Di quanti ingredienti sara' formata la ricetta?\n");
scanf("%d", &k);
ricetta.listaIngredienti = creaLista(k);
// Stampa della lista
printf("Questa e' la lista degli ingredienti da te assegnata\n");
stampaLista(ricetta.listaIngredienti);
// Inserimento di un ingrediente (senza possibilità di scelta) in ordine nella lista
printf("\nDammi il nome dell'ingrediente che si vuole aggiungere in ordine di quantita' nella lista: ");
scanf("%s", nome_ingrediente);
// Dati relativi all'ingrediente
printf("\nQuantita' dell'ingrediente: ");
scanf("%d", &quantita_ingrediente);
printf("\nUnita' di misura adottata: ");
scanf("%s", unita_ingrediente);
printf("\nNote relative all'ingrediente: ");
scanf("%s", note_ingrediente);
// Chiamata della funzione eser2 per l'effettivo inserimento dell'ingrediente
eser2(&ricetta.listaIngredienti, nome_ingrediente, quantita_ingrediente, unita_ingrediente, note_ingrediente);
// Stampa della lista aggiornata
stampaLista(ricetta.listaIngredienti);
// Inserimento di un ingrediente da cercare nella lista
printf("\n\nInserisci il nome dell'ingrediente da cercare: ");
scanf("%s", cerca_ingrediente);
printf("%s", cerca_ingrediente);
trovato = cercaIngrediente(ricetta.listaIngredienti, &ingrediente_trovato, cerca_ingrediente);
// Chiamata di eser1 (soltanto se la ricerca è andata a buon fine) per restituire i dati sull'ingrediente cercato
if(trovato == 1){
quantita = eser1(ricetta, ingrediente_trovato, &unita_main, ¬e_main);
printf("%d %s %s\n", quantita, unita_main, note_main);
}
system("PAUSE");
return 0;
}
// FUNZIONE INSERISCI IN TESTA ALLA LISTA
void inserisciTestaLista(TipoListaIngredienti *lis, TipoIngrediente ingrediente)
{
TipoListaIngredienti nuovo;
nuovo = (TipoListaIngredienti)malloc(sizeof(TipoNodoLista));
if(nuovo == NULL)
printf("Problemi in allocazione\n");
else{
printf("Inserisci il nome dell'ingrediente: ");
scanf("%s", nuovo->ingrediente.nome);
printf("\nInserisci la quantita' dell'ingrediente: ");
scanf("%d", &nuovo->ingrediente.quantita);
printf("\nInserisci l'unita' di misura dell'ingrediente: ");
scanf("%s", nuovo->ingrediente.unita);
printf("\nInserisci le note sull'ingrediente: ");
scanf("%s", nuovo->ingrediente.note);
nuovo->next = *lis;
*lis = nuovo;
}
return;
}
// FUNZIONE CREA LISTA
TipoListaIngredienti creaLista(int numero)
{
int i, j;
char scelta = '\0';
TipoListaIngredienti plis, paux;
TipoIngrediente ingrediente;
if(numero == 0)
plis = NULL;
else{
paux = (TipoListaIngredienti)malloc(sizeof(TipoNodoLista));
if(paux == NULL)
printf("Problemi in allocazione\n");
else{
printf("Inserisci il nome dell'ingrediente: ");
scanf("%s", paux->ingrediente.nome);
printf("\nInserisci la quantita' dell'ingrediente: ");
scanf("%d", &paux->ingrediente.quantita);
printf("\nInserisci l'unita' di misura dell'ingrediente: ");
scanf("%s", paux->ingrediente.unita);
printf("\nInserisci le note sull'ingrediente: ");
scanf("%s", paux->ingrediente.note);
//gets(paux->ingrediente.note);
//for(j = 0; j < 150; j++) scanf("%c", &paux->ingrediente.note[j]);
plis = paux;
for(i = 1; i < numero; i++){
paux->next = (TipoListaIngredienti)malloc(sizeof(TipoNodoLista));
paux = paux->next;
printf("\nInserisci il nome dell'ingrediente: ");
scanf("%s", paux->ingrediente.nome);
printf("\nInserisci la quantita' dell'ingrediente: ");
scanf("%d", &paux->ingrediente.quantita);
printf("\nInserisci l'unita' di misura dell'ingrediente: ");
scanf("%s", paux->ingrediente.unita);
printf("\nInserisci le note sull'ingrediente: ");
scanf("%s", paux->ingrediente.note);
//gets(paux->ingrediente.note);
//for(j = 0; j < 150; j++) scanf("%c", &paux->ingrediente.note[j]);
}
paux->next = NULL;
}
}
printf("Vuoi inserire ulteriori ingredienti? S o N\n");
scelta = getchar();
scanf("%c", &scelta);
if(scelta == 'S' || scelta == 's')
inserisciTestaLista(&plis, ingrediente);
return plis;
}
// FUNZIONE STAMPA LISTA
void stampaLista(TipoListaIngredienti lis){
TipoListaIngredienti paux;
paux = lis;
while(paux != NULL){
printf("Nome ingrediente: %s\n", paux->ingrediente.nome);
printf("Quantita' ingrediente: %d\n", paux->ingrediente.quantita);
printf("Unita' di misura: %s\n", paux->ingrediente.unita);
printf("Note ingrediente: %s\n", paux->ingrediente.note);
paux = paux->next;
}
return;
}
// FUNZIONE CERCA INGREDIENTE
int cercaIngrediente(TipoListaIngredienti li, TipoIngrediente *in, char *no)
{
int trovato = 0;
TipoListaIngredienti paux;
paux = li;
while(paux != NULL && !trovato){
if(strcmp(no, paux->ingrediente.nome) == 0){
trovato = 1;
*in = paux->ingrediente;
}
else
paux = paux->next;
}
return trovato;
}
// FUNZIONE ESER1
int eser1(TipoRicetta rc, TipoIngrediente in, char *un[10], char *no[150])
{
TipoListaIngredienti paux;
paux = rc.listaIngredienti;
while(paux != NULL){
if(strcmp(in.nome, paux->ingrediente.nome) == 0){
*un = paux->ingrediente.unita;
*no = paux->ingrediente.note;
return paux->ingrediente.quantita;
}
paux = paux->next;
}
}
// FUNZIONE ESER2
void eser2(TipoListaIngredienti *li, char *in, int q, char un[10], char nt[150])
{
TipoListaIngredienti paux, corr;
TipoIngrediente ing;
ing.nome = in;
ing.quantita = q;
strcpy(ing.unita, un);
strcpy(ing.note, nt);
paux = (TipoListaIngredienti)malloc(sizeof(TipoNodoLista));
paux->next = *li;
*li = paux;
corr = *li;
while(corr != NULL && corr->next->ingrediente.quantita < ing.quantita)
corr = corr->next;
paux = (TipoListaIngredienti)malloc(sizeof(TipoNodoLista));
paux->ingrediente = ing;
paux->next = corr->next;
corr->next = paux;
paux = *li;
*li = paux->next;
free(paux);
}
http://www.freemodding.it//allegati/75_43317d94565e0.jpg
Comunque vi allego il programma e se c'è qualcuno di buon cuore spero possa aiutarmi.
Allego inoltre lo screenshot del punto in cui si blocca.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Ingrediente{
char *nome;
int quantita;
char unita[10];
char note[150];
};
typedef struct Ingrediente TipoIngrediente;
struct ListaIngredienti{
TipoIngrediente ingrediente;
struct ListaIngredienti *next;
};
typedef struct ListaIngredienti TipoNodoLista;
typedef TipoNodoLista *TipoListaIngredienti;
struct Ricetta{
TipoListaIngredienti listaIngredienti;
char *descrizione;
};
typedef struct Ricetta TipoRicetta;
// PROTOTIPI FUNZIONI
void inserisciTestaLista(TipoListaIngredienti *, TipoIngrediente);
TipoListaIngredienti creaLista(int);
void stampaLista(TipoListaIngredienti);
int cercaIngrediente(TipoListaIngredienti, TipoIngrediente *, char *);
int eser1(TipoRicetta, TipoIngrediente, char * [], char * []);
void eser2(TipoListaIngredienti *, char *, int, char *, char *);
// MAIN
int main(void)
{
TipoRicetta ricetta;
TipoIngrediente ingrediente_trovato;
char *nome_ingrediente = NULL;
char *cerca_ingrediente = "pasta";
char unita_ingrediente[10], note_ingrediente[150];
char *unita_main;
char *note_main;
int quantita_ingrediente;
int trovato = 0;
int quantita = 0;
int k = 0;
int i = 0;
// Inserimento descrizione ricetta
printf("Inserisci una descrizione per la ricetta: ");
gets(ricetta.descrizione);
printf("\nQuesta e' la descrizione da te assegnata: %s\n\n", ricetta.descrizione);
// Inserimento del numero di ingredienti e creazione lista
printf("Di quanti ingredienti sara' formata la ricetta?\n");
scanf("%d", &k);
ricetta.listaIngredienti = creaLista(k);
// Stampa della lista
printf("Questa e' la lista degli ingredienti da te assegnata\n");
stampaLista(ricetta.listaIngredienti);
// Inserimento di un ingrediente (senza possibilità di scelta) in ordine nella lista
printf("\nDammi il nome dell'ingrediente che si vuole aggiungere in ordine di quantita' nella lista: ");
scanf("%s", nome_ingrediente);
// Dati relativi all'ingrediente
printf("\nQuantita' dell'ingrediente: ");
scanf("%d", &quantita_ingrediente);
printf("\nUnita' di misura adottata: ");
scanf("%s", unita_ingrediente);
printf("\nNote relative all'ingrediente: ");
scanf("%s", note_ingrediente);
// Chiamata della funzione eser2 per l'effettivo inserimento dell'ingrediente
eser2(&ricetta.listaIngredienti, nome_ingrediente, quantita_ingrediente, unita_ingrediente, note_ingrediente);
// Stampa della lista aggiornata
stampaLista(ricetta.listaIngredienti);
// Inserimento di un ingrediente da cercare nella lista
printf("\n\nInserisci il nome dell'ingrediente da cercare: ");
scanf("%s", cerca_ingrediente);
printf("%s", cerca_ingrediente);
trovato = cercaIngrediente(ricetta.listaIngredienti, &ingrediente_trovato, cerca_ingrediente);
// Chiamata di eser1 (soltanto se la ricerca è andata a buon fine) per restituire i dati sull'ingrediente cercato
if(trovato == 1){
quantita = eser1(ricetta, ingrediente_trovato, &unita_main, ¬e_main);
printf("%d %s %s\n", quantita, unita_main, note_main);
}
system("PAUSE");
return 0;
}
// FUNZIONE INSERISCI IN TESTA ALLA LISTA
void inserisciTestaLista(TipoListaIngredienti *lis, TipoIngrediente ingrediente)
{
TipoListaIngredienti nuovo;
nuovo = (TipoListaIngredienti)malloc(sizeof(TipoNodoLista));
if(nuovo == NULL)
printf("Problemi in allocazione\n");
else{
printf("Inserisci il nome dell'ingrediente: ");
scanf("%s", nuovo->ingrediente.nome);
printf("\nInserisci la quantita' dell'ingrediente: ");
scanf("%d", &nuovo->ingrediente.quantita);
printf("\nInserisci l'unita' di misura dell'ingrediente: ");
scanf("%s", nuovo->ingrediente.unita);
printf("\nInserisci le note sull'ingrediente: ");
scanf("%s", nuovo->ingrediente.note);
nuovo->next = *lis;
*lis = nuovo;
}
return;
}
// FUNZIONE CREA LISTA
TipoListaIngredienti creaLista(int numero)
{
int i, j;
char scelta = '\0';
TipoListaIngredienti plis, paux;
TipoIngrediente ingrediente;
if(numero == 0)
plis = NULL;
else{
paux = (TipoListaIngredienti)malloc(sizeof(TipoNodoLista));
if(paux == NULL)
printf("Problemi in allocazione\n");
else{
printf("Inserisci il nome dell'ingrediente: ");
scanf("%s", paux->ingrediente.nome);
printf("\nInserisci la quantita' dell'ingrediente: ");
scanf("%d", &paux->ingrediente.quantita);
printf("\nInserisci l'unita' di misura dell'ingrediente: ");
scanf("%s", paux->ingrediente.unita);
printf("\nInserisci le note sull'ingrediente: ");
scanf("%s", paux->ingrediente.note);
//gets(paux->ingrediente.note);
//for(j = 0; j < 150; j++) scanf("%c", &paux->ingrediente.note[j]);
plis = paux;
for(i = 1; i < numero; i++){
paux->next = (TipoListaIngredienti)malloc(sizeof(TipoNodoLista));
paux = paux->next;
printf("\nInserisci il nome dell'ingrediente: ");
scanf("%s", paux->ingrediente.nome);
printf("\nInserisci la quantita' dell'ingrediente: ");
scanf("%d", &paux->ingrediente.quantita);
printf("\nInserisci l'unita' di misura dell'ingrediente: ");
scanf("%s", paux->ingrediente.unita);
printf("\nInserisci le note sull'ingrediente: ");
scanf("%s", paux->ingrediente.note);
//gets(paux->ingrediente.note);
//for(j = 0; j < 150; j++) scanf("%c", &paux->ingrediente.note[j]);
}
paux->next = NULL;
}
}
printf("Vuoi inserire ulteriori ingredienti? S o N\n");
scelta = getchar();
scanf("%c", &scelta);
if(scelta == 'S' || scelta == 's')
inserisciTestaLista(&plis, ingrediente);
return plis;
}
// FUNZIONE STAMPA LISTA
void stampaLista(TipoListaIngredienti lis){
TipoListaIngredienti paux;
paux = lis;
while(paux != NULL){
printf("Nome ingrediente: %s\n", paux->ingrediente.nome);
printf("Quantita' ingrediente: %d\n", paux->ingrediente.quantita);
printf("Unita' di misura: %s\n", paux->ingrediente.unita);
printf("Note ingrediente: %s\n", paux->ingrediente.note);
paux = paux->next;
}
return;
}
// FUNZIONE CERCA INGREDIENTE
int cercaIngrediente(TipoListaIngredienti li, TipoIngrediente *in, char *no)
{
int trovato = 0;
TipoListaIngredienti paux;
paux = li;
while(paux != NULL && !trovato){
if(strcmp(no, paux->ingrediente.nome) == 0){
trovato = 1;
*in = paux->ingrediente;
}
else
paux = paux->next;
}
return trovato;
}
// FUNZIONE ESER1
int eser1(TipoRicetta rc, TipoIngrediente in, char *un[10], char *no[150])
{
TipoListaIngredienti paux;
paux = rc.listaIngredienti;
while(paux != NULL){
if(strcmp(in.nome, paux->ingrediente.nome) == 0){
*un = paux->ingrediente.unita;
*no = paux->ingrediente.note;
return paux->ingrediente.quantita;
}
paux = paux->next;
}
}
// FUNZIONE ESER2
void eser2(TipoListaIngredienti *li, char *in, int q, char un[10], char nt[150])
{
TipoListaIngredienti paux, corr;
TipoIngrediente ing;
ing.nome = in;
ing.quantita = q;
strcpy(ing.unita, un);
strcpy(ing.note, nt);
paux = (TipoListaIngredienti)malloc(sizeof(TipoNodoLista));
paux->next = *li;
*li = paux;
corr = *li;
while(corr != NULL && corr->next->ingrediente.quantita < ing.quantita)
corr = corr->next;
paux = (TipoListaIngredienti)malloc(sizeof(TipoNodoLista));
paux->ingrediente = ing;
paux->next = corr->next;
corr->next = paux;
paux = *li;
*li = paux->next;
free(paux);
}
http://www.freemodding.it//allegati/75_43317d94565e0.jpg