Salve a tutti. Mi sto da poco avvicinando al linguaggio C. Non ne necessito in maniera professionale, ma mi bastano solo alcune infarinature di base. Sto scrivendo un programma di gestione degli abbonamenti ad una palestra. Il programma in se stesso funziona (almeno nelle parti già scritte). Come unico problema, di cui non riesco a venire a capo, è che cercando di cancellare il primo elemento di una lista formata così:
struct nodo
{
char nome [30];
char cognome [30];
char abbonamento [11];
int giorno;
int mese;
int anno;
struct nodo *next;
};
il programma cancella solo la parte relativa al nome. Mantenendo in lista cognome, abbonamento, ecc... La funzione con cui cancello è questa:
void canc1(struct nodo **head)
{
struct nodo *q;
q=(*head);
(*head)=(*head)->next;
free(q);
}
E questa è invece quella in cui richiamo canc1
void abbonamenti(struct nodo *head, int g, int m, int a)
{
FILE *fp;
fp=fopen("scaduti", "a");
printf("\n\n Oggi scadono i seguenti abonamenti:\n ");
while(head!=NULL){
if((head->giorno==g)&&(head->mese==m)&&(head->anno==a))
{
printf("%s %s %s %d/%d/%d\n", head->nome, head->cognome, head->abbonamento, head->giorno, head->mese, head->anno);
fprintf(fp,"%s %s %s %d/%d/%d\n", head->nome, head->cognome, head->abbonamento, head->giorno, head->mese, head->anno);
canc1(&head);
head=head->next;
} else head=head->next;
}
fclose(fp);
printf("\n\n");
system("pause");
}
Per completezza, anche se non so se ce ne sia davvero motivo copio anche il programma per intero. Dove sbaglio? Per compilare utilizzo codeblock
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct nodo
{
char nome [30];
char cognome [30];
char abbonamento [11];
int giorno;
int mese;
int anno;
struct nodo *next;
};
struct nodo *head;
void canc1 (struct nodo **);
void aggiungiAlfile ();
void aggiungi (struct nodo **, char *, char *, char *, int, int, int);
struct nodo *Inlista();
void print (struct nodo *);
void cancella (struct nodo **, char *, char *, char *, int, int, int);
void filescaduti (struct nodo *);
void abbonamenti (struct nodo*, int, int, int);
main()
{
struct nodo *head;
head=(struct nodo*)malloc(sizeof(struct nodo));
int g,m,a,x;
aggiungiAlfile();
head=Inlista();
printf("Inserisci il giorno di oggi (1/1/1): ");
scanf("%d/%d/%d", &g, &m, &a);
canc1(&head);
abbonamenti(head, g, m, a);
filescaduti (head);
while(x!=0)
{
system("cls");
printf("\n\n\n\t\t\t********************");
printf("\n\t\t\t**MENU' PRINCIPALE**");
printf("\n\t\t\t********************\n\n");
printf(" Inserisci:\n 1. Per visualizzare tutti gli abbonati.\n 2. Per visualizzare gli introiti di questo mese.\n 3. Per visualizzare il menu' gestione abonamenti scaduti.\n 0. Per uscire.\n\n\t");
scanf("%d", &x);
switch(x)
{
case 1: system("cls");
print(head);
printf("\n\n");
system("pause");
break;
case 2: system("cls");
printf("\n\n");
system("pause");
break;
case 3: system("cls");
printf("\n\n");
system("pause");
break;
case 0: system("cls");
printf("\n\n\n Grazie per aver utilizzato il nostro programma, arrivederci.\n\n\n");
printf("\n\n");
system("pause");
break;
default: printf(" Il programma non ha un riscontro dei casi inseriti, si prega di reinserire il\n dato di comando\n");
printf("\n\n");
system("pause");
break;
}
}
}
void canc1(struct nodo **head)
{
struct nodo *q;
q=(*head);
(*head)=(*head)->next;
free(q);
}
void aggiungiAlfile()
{
FILE *fp;
char a, b, nom[30], cog[30], abb[11];
int x, i=0, gio, mes, ann;
fp=fopen("abbonati","a");
printf("\n\n Vuoi aggiungere uno o piu' abbonati non presenti nell'archivio? (si no): ");
scanf("%c", &a); fflush(stdin);
system("cls");
if(a=='s')
{
printf("\n\n Quanti nuovi abbonati vuoi catalogare? ");
scanf("%d", &x); fflush(stdin);
while (i<x)
{
printf("\n Inserisci il nome del nuovo abbonato: ");
scanf("%s", nom); fflush(stdin);
printf("\n Inserisci il cognome del nuovo abbonato: ");
scanf("%s", cog); fflush(stdin);
printf("\n Inserisci il tipo di abonamento scelto: ");
scanf("%s", abb); fflush(stdin);
printf("\n Inserisci da data di scadenza dell'abonamento nella forma: gg/mm/aa (1/1/12):\n ");
scanf("%d/%d/%d", &gio,&mes,&ann); fflush(stdin);
system("cls");
printf("\n\n Hai inserito: %s, %s, %s, %d/%d/%d.\n\n E' tutto corretto? (si no): ", nom, cog, abb, gio, mes, ann);
scanf("%c", &b);
switch(b)
{
case 's': fprintf(fp,"%s %s %s %d/%d/%d\n", nom, cog, abb, gio, mes, ann);
break;
case 'n': i--;
break;
default: printf("\n\nNon hai scritto ne sì ne no, riprova!\n\n\n");
system ("pause");
break;
}
i++;
fflush(stdin);
}
}
fclose(fp);
return;
}
void aggiungi(struct nodo **head, char *nom, char *cog, char *abb, int gio, int mes, int ann)
{
struct nodo *p;
struct nodo *temp;
p=(struct nodo*)malloc(sizeof(struct nodo));
strcpy(p->nome, nom);
strcpy(p->cognome, cog);
strcpy(p->abbonamento, abb);
p->giorno=gio;
p->mese=mes;
p->anno=ann;
p->next=NULL;
temp=(*head);
while (temp->next != NULL)
temp = temp->next;
temp->next = p;
}
struct nodo *Inlista()
{
FILE *fp;
char nom[30], cog[30], abb[11];
int gio, mes, ann;
struct nodo *head;
head=(struct nodo*)malloc(sizeof(struct nodo));
fp=fopen("abbonati","r");
strcpy(head->nome, "NOME");
strcpy(head->cognome, "COGNOME");
strcpy(head->abbonamento, "ABBONAMENTO");
head->giorno=0;
head->mese=0;
head->anno=0;
head->next=NULL;
while(!feof(fp))
{
fscanf(fp,"%s %s %s %d/%d/%d\n", nom, cog, abb, &gio, &mes, &ann);
aggiungi (&head, nom, cog, abb, gio, mes, ann);
}
fclose(fp);
return head;
}
void print(struct nodo *head)
{
system("cls");
printf("\n\n");
while(head!=NULL)
{
printf(" %s %s %s %d/%d/%d\n", head->nome, head->cognome, head->abbonamento, head->giorno, head->mese, head->anno);
head=head->next;
}
}
void filescaduti (struct nodo *head)
{
FILE *fp;
fp=fopen("*****","w");
while(head!=NULL)
{
printf("%s %s\n", head->nome, head->cognome);
fprintf(fp,"%s %s %s %d/%d/%d\n", head->nome, head->cognome, head->abbonamento, head->giorno, head->mese, head->anno);
head=head->next;
}
fclose(fp);
}
void abbonamenti(struct nodo *head, int g, int m, int a)
{
FILE *fp;
fp=fopen("scaduti", "a");
printf("\n\n Oggi scadono i seguenti abonamenti:\n ");
while(head!=NULL){
if((head->giorno==g)&&(head->mese==m)&&(head->anno==a))
{
printf("%s %s %s %d/%d/%d\n", head->nome, head->cognome, head->abbonamento, head->giorno, head->mese, head->anno);
fprintf(fp,"%s %s %s %d/%d/%d\n", head->nome, head->cognome, head->abbonamento, head->giorno, head->mese, head->anno);
canc1(&head);
head=head->next;
} else head=head->next;
}
fclose(fp);
printf("\n\n");
system("pause");
}
struct nodo
{
char nome [30];
char cognome [30];
char abbonamento [11];
int giorno;
int mese;
int anno;
struct nodo *next;
};
il programma cancella solo la parte relativa al nome. Mantenendo in lista cognome, abbonamento, ecc... La funzione con cui cancello è questa:
void canc1(struct nodo **head)
{
struct nodo *q;
q=(*head);
(*head)=(*head)->next;
free(q);
}
E questa è invece quella in cui richiamo canc1
void abbonamenti(struct nodo *head, int g, int m, int a)
{
FILE *fp;
fp=fopen("scaduti", "a");
printf("\n\n Oggi scadono i seguenti abonamenti:\n ");
while(head!=NULL){
if((head->giorno==g)&&(head->mese==m)&&(head->anno==a))
{
printf("%s %s %s %d/%d/%d\n", head->nome, head->cognome, head->abbonamento, head->giorno, head->mese, head->anno);
fprintf(fp,"%s %s %s %d/%d/%d\n", head->nome, head->cognome, head->abbonamento, head->giorno, head->mese, head->anno);
canc1(&head);
head=head->next;
} else head=head->next;
}
fclose(fp);
printf("\n\n");
system("pause");
}
Per completezza, anche se non so se ce ne sia davvero motivo copio anche il programma per intero. Dove sbaglio? Per compilare utilizzo codeblock
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct nodo
{
char nome [30];
char cognome [30];
char abbonamento [11];
int giorno;
int mese;
int anno;
struct nodo *next;
};
struct nodo *head;
void canc1 (struct nodo **);
void aggiungiAlfile ();
void aggiungi (struct nodo **, char *, char *, char *, int, int, int);
struct nodo *Inlista();
void print (struct nodo *);
void cancella (struct nodo **, char *, char *, char *, int, int, int);
void filescaduti (struct nodo *);
void abbonamenti (struct nodo*, int, int, int);
main()
{
struct nodo *head;
head=(struct nodo*)malloc(sizeof(struct nodo));
int g,m,a,x;
aggiungiAlfile();
head=Inlista();
printf("Inserisci il giorno di oggi (1/1/1): ");
scanf("%d/%d/%d", &g, &m, &a);
canc1(&head);
abbonamenti(head, g, m, a);
filescaduti (head);
while(x!=0)
{
system("cls");
printf("\n\n\n\t\t\t********************");
printf("\n\t\t\t**MENU' PRINCIPALE**");
printf("\n\t\t\t********************\n\n");
printf(" Inserisci:\n 1. Per visualizzare tutti gli abbonati.\n 2. Per visualizzare gli introiti di questo mese.\n 3. Per visualizzare il menu' gestione abonamenti scaduti.\n 0. Per uscire.\n\n\t");
scanf("%d", &x);
switch(x)
{
case 1: system("cls");
print(head);
printf("\n\n");
system("pause");
break;
case 2: system("cls");
printf("\n\n");
system("pause");
break;
case 3: system("cls");
printf("\n\n");
system("pause");
break;
case 0: system("cls");
printf("\n\n\n Grazie per aver utilizzato il nostro programma, arrivederci.\n\n\n");
printf("\n\n");
system("pause");
break;
default: printf(" Il programma non ha un riscontro dei casi inseriti, si prega di reinserire il\n dato di comando\n");
printf("\n\n");
system("pause");
break;
}
}
}
void canc1(struct nodo **head)
{
struct nodo *q;
q=(*head);
(*head)=(*head)->next;
free(q);
}
void aggiungiAlfile()
{
FILE *fp;
char a, b, nom[30], cog[30], abb[11];
int x, i=0, gio, mes, ann;
fp=fopen("abbonati","a");
printf("\n\n Vuoi aggiungere uno o piu' abbonati non presenti nell'archivio? (si no): ");
scanf("%c", &a); fflush(stdin);
system("cls");
if(a=='s')
{
printf("\n\n Quanti nuovi abbonati vuoi catalogare? ");
scanf("%d", &x); fflush(stdin);
while (i<x)
{
printf("\n Inserisci il nome del nuovo abbonato: ");
scanf("%s", nom); fflush(stdin);
printf("\n Inserisci il cognome del nuovo abbonato: ");
scanf("%s", cog); fflush(stdin);
printf("\n Inserisci il tipo di abonamento scelto: ");
scanf("%s", abb); fflush(stdin);
printf("\n Inserisci da data di scadenza dell'abonamento nella forma: gg/mm/aa (1/1/12):\n ");
scanf("%d/%d/%d", &gio,&mes,&ann); fflush(stdin);
system("cls");
printf("\n\n Hai inserito: %s, %s, %s, %d/%d/%d.\n\n E' tutto corretto? (si no): ", nom, cog, abb, gio, mes, ann);
scanf("%c", &b);
switch(b)
{
case 's': fprintf(fp,"%s %s %s %d/%d/%d\n", nom, cog, abb, gio, mes, ann);
break;
case 'n': i--;
break;
default: printf("\n\nNon hai scritto ne sì ne no, riprova!\n\n\n");
system ("pause");
break;
}
i++;
fflush(stdin);
}
}
fclose(fp);
return;
}
void aggiungi(struct nodo **head, char *nom, char *cog, char *abb, int gio, int mes, int ann)
{
struct nodo *p;
struct nodo *temp;
p=(struct nodo*)malloc(sizeof(struct nodo));
strcpy(p->nome, nom);
strcpy(p->cognome, cog);
strcpy(p->abbonamento, abb);
p->giorno=gio;
p->mese=mes;
p->anno=ann;
p->next=NULL;
temp=(*head);
while (temp->next != NULL)
temp = temp->next;
temp->next = p;
}
struct nodo *Inlista()
{
FILE *fp;
char nom[30], cog[30], abb[11];
int gio, mes, ann;
struct nodo *head;
head=(struct nodo*)malloc(sizeof(struct nodo));
fp=fopen("abbonati","r");
strcpy(head->nome, "NOME");
strcpy(head->cognome, "COGNOME");
strcpy(head->abbonamento, "ABBONAMENTO");
head->giorno=0;
head->mese=0;
head->anno=0;
head->next=NULL;
while(!feof(fp))
{
fscanf(fp,"%s %s %s %d/%d/%d\n", nom, cog, abb, &gio, &mes, &ann);
aggiungi (&head, nom, cog, abb, gio, mes, ann);
}
fclose(fp);
return head;
}
void print(struct nodo *head)
{
system("cls");
printf("\n\n");
while(head!=NULL)
{
printf(" %s %s %s %d/%d/%d\n", head->nome, head->cognome, head->abbonamento, head->giorno, head->mese, head->anno);
head=head->next;
}
}
void filescaduti (struct nodo *head)
{
FILE *fp;
fp=fopen("*****","w");
while(head!=NULL)
{
printf("%s %s\n", head->nome, head->cognome);
fprintf(fp,"%s %s %s %d/%d/%d\n", head->nome, head->cognome, head->abbonamento, head->giorno, head->mese, head->anno);
head=head->next;
}
fclose(fp);
}
void abbonamenti(struct nodo *head, int g, int m, int a)
{
FILE *fp;
fp=fopen("scaduti", "a");
printf("\n\n Oggi scadono i seguenti abonamenti:\n ");
while(head!=NULL){
if((head->giorno==g)&&(head->mese==m)&&(head->anno==a))
{
printf("%s %s %s %d/%d/%d\n", head->nome, head->cognome, head->abbonamento, head->giorno, head->mese, head->anno);
fprintf(fp,"%s %s %s %d/%d/%d\n", head->nome, head->cognome, head->abbonamento, head->giorno, head->mese, head->anno);
canc1(&head);
head=head->next;
} else head=head->next;
}
fclose(fp);
printf("\n\n");
system("pause");
}