Vai al contenuto

Help programma in C!


Pillo

Messaggi raccomandati

Vi metto il testo di un programma che sto facendo per esercizio in vista dell'esame di informatica. Il problema è che devo farlo partire da terminale e questo mi incasina un po'. Ho qualche problemino a terminarlo e non riesco ad andare avanti. Qualcuno mi darebbe delle delucidazioni su come possa far stampare i risultati presenti in un file di testo partendo da terminale? Thanks

Si vuole realizzare un programma in linguaggio C di nome AGENDA.EXE che gestisca un’agenda elettronica

per un anno solare. Gli appuntamenti sono memorizzati uno per riga nel file AGENDA.TXT col seguente formato:

Giorno Ora Appuntamento



Il campo Giorno indica il giorno (partendo dal 1 gennaio) usando una codifica da 1 a 366.

Il campo Ora indica l’ora dell’appuntamento, codificata su due cifre (00-23).

Il campo Appuntamento è una stringa di caratteri (al massimo 50) e non contiene spazi.

Si noti che (A) il numero di righe nel file non è noto a priori, (;) ci possono essere più appuntamenti per lo stesso giorno, ma non alla stessa ora e © non esiste nessun tipo di ordinamento nel file.

Il programma deve poter eseguire le seguenti azioni, specificate da opzioni sulla riga di comando:

− Visualizzare tutti gli appuntamenti di un giorno, dato il codice del giorno indicato sulla riga di comando dopo l’opzione -v:

AGENDA -v numero_del_giorno



− Inserire un nuovo appuntamento se possibile, dati il codice del giorno, l’ora e la descrizione

dell’appuntamento indicati sulla riga di comando dopo l’opzione -i:

AGENDA -i numero_del_giorno ora descrizione



Si noti che non è possibile fissare due appuntamenti per lo stesso giorno e per la stessa ora, e che

l’inserimento consiste nell’aggiungere in fondo al file la riga relativa all’appuntamento.

− Cercare un appuntamento data una parola da cercare come sottostringa nelle descrizioni degli appuntamenti:

AGENDA -s sottostringa



il programma deve visualizzare il giorno e l’ora corrispondenti all’appuntamento cercato; se esistono più appuntamenti contenenti la stessa sottostringa, il programma deve stamparli tutti.

Esempi:

C:\> AGENDA -v 123

123 10 esame_info

123 15 riunione

C:\> AGENDA -i 123 10 riunione

Appuntamento già esistente, impossibile aggiungerlo.

C:\> AGENDA -i 233 10 riunione

Inserito appuntamento "riunione" alle ore 10 del giorno 233

C:\> AGENDA -s riunione

123 15 riunione

212 21 riunione_casa

233 10 riunione

311 13 prossima_riunione

If you want, then start to laugh

If you must, then start to cry

Be yourself don't hide Just believe in destiny

iPillo

Link al commento
Condividi su altri siti

Ciao, se vuoi puoi ottenere un file agenda.exe, ma .exe di solito si intende che giri sotto winzoz, quello che puoi ottenere invece non girerà mai su windows!!!!

Comunque:

-hai bisogno di un compilatore e con Mac hai il migliore gcc (devi installare ideveloper tools, se non lo hai già fatto)

-una volta che hai scritto il programma lo compili: gcc -Wall agenda.c

-il risultato si chiamerà a.out

- "-Wall" significa tutti i warning

-mi sembra che gcc -Wall agenda.c -o agenda.exe ti crei un file chiamato agenda.exe eseguibile

-per eseguirlo digiti sempre dalla bash (terminale) "./a.out" oppure "./agenda.exe"

-per leggere un file ci sonon svariati metodi sicuramente lo devi aprire con la fopen in lettura che ti restituisce un filedescriptor, con cui hai accesso realmente ai dati

-poi hai a disposizione la scanf piuttosto che la read e svariati altri metodi. Ddiciamo che io sceglierei in base alla formattazione del file, ad esempio in alcuni casi è meglio leggere una riga, in altri un carattere.

(Un consiglio:

scegli bene quali librerie usare ed assicurati di poterne usare di ogni tipo: una volta inclusi una libreria che gestiva l'input dell'utente in maniera perfetta per le mie esigenze, ma non era ANSI C, come mi avevano richiesto, allora, nonstante funzionasse tutto alla perfezione ho dovuto riscrivere in mezza nottata la gestione degli input!!!)

Link al commento
Condividi su altri siti

Grazie mille! No, non è obbligatorio che sia .exe, deve essere un semplice eseguibile, è che ovviamente quelli che mi danno i testi di esame pensano che tutti gli utenti del mondo usino winzoz, quindi scrivono così.

Ti ringrazio infinitamente per le delucidazioni, sopratutto per far partire da terminale e per il consiglio sulle librerie. Provo a scrivere, eventualmente se non andasse pubblico il sorgente! :ciao:

If you want, then start to laugh

If you must, then start to cry

Be yourself don't hide Just believe in destiny

iPillo

Link al commento
Condividi su altri siti

Ho finito di scivere il sorgente ma non parte. Il mio principale problema mio è proprio far partire da terminale, prima di adesso facevo si che si leggesse passo dopo passo ogni dato inserito dall'utente.

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

int main(int argc, char *argv[])
{
   const int MAX=100;
   const int MAXG=365;
   const int MAXO=24:
   const char LUN=50;
   const char AGENDA[]= "agenda.txt";

   FILE *f;
   char riga[MAX+1];
   int N=0, i;
   int gior, ora;
   int giorno[MAXG];
   char com[MAX];
   char app[LUN+1];
   char appu[LUN+1];

   if(argc!=3 || argc!=5)
   {
       printf("Errore: ...");
       exit(1);
   }

   f = fopen(AGENDA, "rt");
   if(f==NULL)
   {
       printf("ERRORE: impossibile aprire file %s\n", AGENDA);
       exit(1);
   }

   while( fgets( riga, MAX, f ) != NULL )
   {
       r = sscanf(riga, "%d %d %s", &gior, &ora, app);
       if(r!=3)
           printf("Errore!\n");
       else
       {
           for(i=0; i<giorno[MAXG], i++)
           {
               gets(com);
               scanf("%d", &gior);
               if(com[i]=="-v")
               {
                   sscanf(riga, "%d %d %s", &gior, &ora, appu);
                   printf("%d %d %s", gior, ora, appu);
               }
               else
                   printf("Errore!");
           }

           for(i=0; i<giorno[MAXG], i++)
           {
               gets(com);
               scanf("%d", &gior);
               scanf("%d", ora);
               gets(app)

               if(com[i]=="-i")
               {
                   if(app==appu)
                   {
                       printf("Sei già impegnato");
                   }
                   else
                   {
                       fprintf(f, "%d %d %s\n", &gior, &ora, appu);
                       printf("Appuntamento aggiunto");
                   }
               }
           }
     }

   fclose(f);

   return 0;
}

Che ho cannato? Scusate ma sono nuovo al mondo della programmazione, devo ancora imparare ad analizzare bene le richieste e applicarle correttamente.

If you want, then start to laugh

If you must, then start to cry

Be yourself don't hide Just believe in destiny

iPillo

Link al commento
Condividi su altri siti

Ciao,

devi aprire un terminale, andare dove hai il file. Ad esempio se è nei documenti scrivi:

"cd Documents"

poi per sicurezza visualizzi il contenuto della cartella con il comando "ls"

poi scrivi "gcc -Wall nome_file.c"

A questo punto di verranno ridati gli errori, ad esempio hai incluso le librerie senza mettere "#" davanti ad include, alla riga 10 hai scritto ":" al posto di ";", alla 38,hai usaro la variabile "r" senza averla mai dichiaratam, alla 43 c'è una "," al posto del ";" nel "for" e così via.

Ciao

Link al commento
Condividi su altri siti

Archiviato

Questa discussione è archiviata e chiusa a future risposte.

×
×
  • Crea Nuovo...