PROBLEMA problema risoluzione esercizio gestione agenda linguaggio c

Pubblicità

MarcoRonca

Nuovo Utente
Messaggi
15
Reazioni
0
Punteggio
25
Salve, avrei bisogno del vostro aiuto. Mi viene richiesto di creare questo programma che permetta di inserire impegni in un'agenda mensile. Ora vi posto il codice sorgente:
#include<stdio.h>#include<iostream>
#include<stdlib.h>
#include<string.h>


#define MAX_ORA 23
#define MAX_MINUTO 59
#define MAX_IMPEGNI 5
#define MAX_GIORNI 31
#define MAX_LUNGHEZZA_STRINGA 100


typedef struct{
char description[MAX_LUNGHEZZA_STRINGA];
int ora[MAX_ORA],minuto[MAX_MINUTO];
} impegno;


typedef struct{
impegno commission[MAX_IMPEGNI];
int num_impegni;
}giorno;

typedef struct{
giorno date[MAX_GIORNI];
int num_giorni;
}agenda;

void inserisci_impegno(impegno *i);
void inserisci_giorno(giorno *g);
void crea_agenda(agenda *a);
void stampa_impegno(impegno i);
void stampa_giorno(giorno g);
void stampa_agenda(agenda a);
//inserisco un impegno
void inserisci_impegno(impegno *i){
fflush(stdin);
printf("Che impegno devo inserire?\n");
fflush(stdout);
gets(i->description);

printf("A che ora hai questo impegno? (formato hh/mm)\n");
fflush(stdout);
scanf("%d,%d",i->ora,i->minuto);
printf("Appuntamento inserito!!\n");
}
//inserisco un numero di impegni per un giorno
void inserisci_giorno(giorno *g, int number_commissions){
for(int j=0;j<number_commissions;j++){
inserisci_impegno(&g->commission[j]);
g->num_impegni++;
}
}
//inserisco i giorni che compongono l'agenda
void componi_agenda(agenda *a){
int i=0,num_giorno,num_impegni;
char *s1,*s2="si";
do{
printf("In quale giorno vuoi inserire uno o piu impegni?\n");
scanf("%d",&num_giorno);
fflush(stdout);
while(num_giorno>MAX_GIORNI){
printf("Questo giorno non esiste!!!!\n");
system("PAUSE");
exit(0);
}
printf("Quanti impegni devo inserire per il giorno %d luglio?\n",num_giorno);
scanf("%d",&num_impegni);
fflush(stdout);
while(num_impegni>MAX_IMPEGNI){
printf("Non puoi prendere tutti questi impegni, rischi un collasso!!\n");
system("PAUSE");
exit(0);
}
inserisci_giorno(&a->date[num_giorno],num_impegni);
printf("Vuoi inserire un nuovo impegno?\n");
scanf("%s",&s1);
}while(strcmp(s1,s2)==0);
}


int main(){
agenda a;
componi_agenda(&a);
system("PAUSE");
return 0;
}

ovviamente manca molto per ultimarlo, ma lo provo poco alla volta per identificare immediatamente i vari errori: credo che l'errore sia nella strcmp poichè il programma esegue tutto, ma alla domanda di voler ricominciare il processo oppure no, qualsiasi cosa io digiti in input, ottengo la chiusura forzata dell'intera finestra, con l'apertura della nota finestra: si è verificato un errore...
chi può farmi il grande favore di darmi una mano?
 
ho risolto così:
while (num_pag==0||num_pag>MAX_NUM_PAGINE||isalpha(num_pag)) {
getchar();
printf("Numero non valido\n");
scanf("%d",&num_pag);
}
il problema non era nel puntatore, quanto il fatto che la scanf era nella condizione;inoltre se non fosse verificata la condizione,una volta entrato nel ciclo while, non avevo modo di uscirne, se non interrompendo il processo con getchar; così invece non creo nessuna interruzione

- - - Updated - - -

ho risolto eliminando lo stringcompare e sostituendolo con un comodo do while :)

- - - Updated - - -

Il problema ora è un altro:
#include<stdio.h>#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>


#define MAX_ORA 23
#define MAX_MINUTO 59
#define MAX_IMPEGNI 5
#define MAX_GIORNI 31
#define MAX_LUNGHEZZA_STRINGA 100


typedef struct{
char description[MAX_LUNGHEZZA_STRINGA];
int ora[MAX_ORA],minuto[MAX_MINUTO];
} impegno;


typedef struct{
impegno commission[MAX_IMPEGNI];
int num_impegni;
}giorno;

typedef struct{
giorno date[MAX_GIORNI];
int num_giorni;
}agenda;

void inserisci_impegno(impegno *i);
void inserisci_giorno(giorno *g);
void crea_agenda(agenda *a);
void stampa_impegno(impegno i);
void stampa_giorno(giorno g);
void stampa_agenda(agenda a);








//inserisco un impegno
void inserisci_impegno(impegno *i){
fflush(stdin);
printf("Che impegno devo inserire?\n");
fflush(stdout);
gets(i->description);

printf("A che ora hai questo impegno?(inserisci solo l'ora) (formato hh/**)\n");
fflush(stdout);
scanf("%d",i->ora);
while(*i->ora>MAX_ORA){
printf("Ora non supportata,reinserisci ora valida\n");
scanf("%d",i->ora);
}
printf("A che ora hai questo impegno? (inserisci solo i minuti)(formato **/mm)\n");
scanf("%d",i->minuto);
while(*i->ora>MAX_ORA){
printf("Minuto non supportato,reinserisci minuto valido\n");
scanf("%d",i->minuto);
}
printf("Appuntamento inserito!!\n\n\n");
}
//inserisco un numero di impegni per un giorno
void inserisci_giorno(giorno *g, int number_commissions){
for(int j=0;j<number_commissions;j++){
inserisci_impegno(&g->commission[j]);
g->num_impegni++;
}
}
//inserisco i giorni che compongono l'agenda
void componi_agenda(agenda *a){
int i=0,num_giorno,num_impegni,ripeti;
do{
printf("In quale giorno vuoi inserire uno o piu impegni?\n");
scanf("%d",&num_giorno);
while(num_giorno>MAX_GIORNI||num_giorno==0||isalpha(num_giorno)){ //evito di inserire numeri errati o caratteri
getchar();
printf("Questo giorno non esiste, inseriscine uno corretto!!!!\n");
scanf("%d",&num_giorno);
}

printf("Quanti impegni devo inserire per il giorno %d luglio?\n",num_giorno);
scanf("%d",&num_impegni);
fflush(stdout);

while(num_impegni==0||isalpha(num_impegni)){ //evita inserimenti di numeri errati
printf("Non hai inserito un numero valido\n");
fflush(stdin);
scanf("%d",&num_impegni);
}

while(num_impegni>MAX_IMPEGNI){ //evita di inserire un numero troppo alto
printf("Non puoi prendere tutti questi impegni, rischi un collasso da stress!!\n");
fflush(stdin);
scanf("%d",&num_impegni);
}

inserisci_giorno(&a->date[num_giorno],num_impegni);
printf("Digita 1 per inserire un nuovo impegno, altrimenti digita un tasto qualsiasi\nper visualizzare l'agenda\n");
scanf("%d",&ripeti);
}while(ripeti==1);
}


void stampa_impegno(impegno i){
printf("********** Alle ore %d/%d **********\n",i.ora,i.minuto);
printf(" %s \n",i.description);
printf("******************************\n\n");
}
//stampa il giorno prescelto
void stampa_giorno(giorno g){
for(int j=0;j<g.num_impegni;j++){
stampa_impegno(g.commission[j]);
}
}
//stampa l'agenda
void stampa_agenda(agenda a){
for(int i=1;i<=MAX_GIORNI;i++){
printf("-------------%d LUGLIO-------------\n\n",i);
if(a.date==){
printf("Sei libero, vai al mare!\n");
}
}
}





int main(){
agenda a;
componi_agenda(&a);
//system("CLS");
stampa_agenda(a);
system("PAUSE");
return 0;
}



nella specifica parte:
void stampa_agenda(agenda a){ for(int i=1;i<=MAX_GIORNI;i++){
printf("-------------%d LUGLIO-------------\n\n",i);
if(a.date==){
printf("Sei libero, vai al mare!\n");
}
}
}

in poche parole vorrei far si che quando l'elemento dell'array date(cioè la struttura contenente il giorno) è vuota, venga stampato "oggi sei libero vai a mare"; mentre, laddove venga trovato un elemento(cioè la struttura date), venga stampata mediante le altre due funzioni di stampa, così da averle anche già in ordine, mediante il for che le richiama ordinatamente da 1 a 31.. sono forse fuori strada??
 
Ok, infatti non avevo controllato il resto.

Comunque, l'errore che ti ho segnalato è logico, te ne accorgeresti nella fase di lettura degli impegni.

'*puntatore' è il valore
'puntatore' è l'indirizzo puntato, presso il quale viene memorizzato il valore
'&puntatore' è l'indirizzo del puntatore
 
Prima di tutto una domanda: nella struct 'impegno' perché 'ora' e 'minuto' sono impostati come degli array?

Ho visto che quando aggiungi una 'commision', incrementi 'num_impegni'. 'num_giorni' invece che funzione ha? Se contasse i giorni in cui hai un impegno, basterebbe impostare la condizione così: 'num_giorni==0'. Altrimenti, come hai fatto tu, ogni giorno dovrebbe essere nullo affinché sia verificata la libertà di andare al mare: [C++] void stampa_agenda(agenda a){ for(int i=1;i<=MAX_GIORNI;i++){ prin - Pastebin.com

Per grandi porzioni di codice ti consiglio di incollare il tutto su pastebin.com e impostare come sintassi c/c++.
 
Per quanto riguarda il fatto di implementare array per gli interi minuti e ora, è stata una distrazione mia, perchè in testa a me volevo far si che non inserissi ore tipo 25. num_impegni la incremento per evitare di sovrascrivere sempre nello stesso elemento di array. Per dirla tutta, la traccia dell'esercizio vuole che ci basiamo sull'algoritmo dell'esercizio precedente(per il quale ho fatto la domanda a cui tu stesso hai risposto, riguardo la gestione del giornale) per cui mi sono basato da quel codice sorgente per poi apportare modifiche. Per quel che riguarda num_giorni, avevo pensato di usarla per andare a riempire, con l'impegno, l'elemento di array corrispondente al giorno scelto (anche se ho i miei dubbi che un array si possa riempire in maniera sparsa e non in maniera sequenziale e su questo ti chiedo una conferma) così da poter identificare i giorni in cui sia stato inserito un impegno oppure no. Se vuoi ti mando la traccia. Tu come la pensi? Grazie mille per l'interessamento
 
Se l'array è già stato creato, i 31 elementi esistono e puoi accedervi liberamente. Tuttavia, se ho capito bene, l'utilizzo che vuoi farne mi sembra improprio. Ho capito che vorresti creare un array di 31 elementi per poi usare un solo elemento indicando con 'num_giorni' l'indice del giorno occupato. Oppure crei il mese (che altro non è una struttura di tipo 'agenda') e man mano lo riempi, potenzialmente occupando tutti gli elementi? Se hai altre domande, manda la traccia. ;)
 
Pubblicità
Pubblicità
Indietro
Top