10/05/11 14:28
Non puoi usare le funzioni di SysUtils?
Comunque in questo forum si può chiedere come, ma non aspettarti
di ricevere direttamente il programma.
Buona fortuna se non puoi (Non che sia difficile, ma è lungo se non usi la libreria!)
Comunque in questo forum si può chiedere come, ma non aspettarti
di ricevere direttamente il programma.
Buona fortuna se non puoi (Non che sia difficile, ma è lungo se non usi la libreria!)
10/05/11 15:54
Petenausen
ok ragazzi l'ho fatto
come potrei renderlo più semplice??
program pre_ver; var st_data,st_dist, st1,st1dist,st2dist, st2,c:string; giorni,giornidist, mesi,mesidist: byte; anni, totale,totaledist,tot,annidist: word; posiz,posizione,posdist,posizionedist:byte; begin writeln ('inserisci la data di oggi gg/mm/aaaa'); readln (st_data); writeln('inserisci la data rispetto a cui vuoi calcolare la distanza'); readln(st_dist); posiz:=pos('/',st_data); posdist:=pos('/',st_dist); //writeln(posiz); st1:=copy(st_data,1, posiz-1); st1dist:=copy(st_dist,1,posdist-1); //writeln (st1); //readln; val (st1, giorni); val (st1dist,giornidist); //writeln (giorni); //trovato i giorni delete (st_data, 1, posiz); delete (st_dist, 1,posdist); posizione:=pos('/',st_data); posizionedist:=pos('/',st_dist); //writeln (st_data); //readln; st2:=copy(st_data,1,posizione-1); st2dist:=copy(st_dist,1,posizionedist-1); delete (st_data,1,posizione); delete (st_dist,1,posizionedist); val(st_data,anni); val(st_dist,annidist); //writeln (st2); //readln; val (st2, mesi);//trovato che mese Š stato digitato val (st2dist,mesidist); //ora cerchiamo di calcolare i giorni totali che sono passati dal 1 gennaio :) ù if mesi =1 then totale:= giorni+(31*mesi)+(365*anni); if mesi =2 then totale:= giorni+31+28+(365*anni); if mesi =3 then totale:= giorni+(31*2)+28+(365*anni); if mesi =4 then totale:= giorni+(31*2)+28+30+(365*anni); if mesi =5 then totale:= giorni+(31*3)+28+30+(365*anni); if mesi =6 then totale:= giorni+(31*3)+(30*2)+28+(365*anni); if mesi =7 then totale:= giorni+(31*4)+(30*2)+28+(365*anni); if mesi =8 then totale:= giorni+(31*5)+(30*2)+28+(365*anni); if mesi =9 then totale:= giorni+(31*5)+(30*3)+28+(365*anni); if mesi =10 then totale:= giorni+(31*6)+(30*3)+28+(365*anni); if mesi =11 then totale:= giorni+(31*6)+(30*4)+28+(365*anni); if mesi =12 then totale:= giorni+(31*7)+(30*4)+28+(365*anni); if mesidist =1 then totaledist:= giorni+(31*mesi)+(365*annidist); if mesidist =2 then totaledist:= giorni+31+28+(365*annidist); if mesidist =3 then totaledist:= giorni+(31*2)+28+(365*annidist); if mesidist =4 then totaledist:= giorni+(31*2)+28+30+(365*annidist); if mesidist =5 then totaledist:= giorni+(31*3)+28+30+(365*annidist); if mesidist =6 then totaledist:= giorni+(31*3)+(30*2)+28+(365*annidist); if mesidist =7 then totaledist:= giorni+(31*4)+(30*2)+28+(365*annidist); if mesidist =8 then totaledist:= giorni+(31*5)+(30*2)+28+(365*annidist); if mesidist =9 then totaledist:= giorni+(31*5)+(30*3)+28+(365*annidist); if mesidist =10 then totaledist:= giorni+(31*6)+(30*3)+28+(365*annidist); if mesidist =11 then totaledist:= giorni+(31*6)+(30*4)+28+(365*annidist); if mesidist =12 then totaledist:= giorni+(31*7)+(30*4)+28+(365*annidist); tot:=totale-totaledist; writeln('la distanza ',tot); readln ; end.
come potrei renderlo più semplice??
Ultima modifica effettuata da Phi 10/05/11 17:12
aaa
10/05/11 17:29
Phi
In primo luogo quando crei posto ricordati di inserire il codice del programma così:
Il tuo programma presenta qualche errorino.
Innanzitutto non puoi definire totale e togtaledist Word, così arriveranno al massimo a 65536(mi pare). Consigli di definirle Longword.
Inoltre sarebbe più semplice, a mio parere creare una funzione che dia il "totale" data una stringa come parametro.
Potresti poi aggiungere un controllo per verificare il formato delle date.
E, al posto del codice if mesi=1 then ... potresti usare un array costante:
ed poi usare un ciclo for:
E ti conviene scrivere
Usando word(0..65536) conviene non avere numeri negativi !
Così prenderà il valore assoluto.
[ code ] .. Programma .. [ /code ]
Il tuo programma presenta qualche errorino.
Innanzitutto non puoi definire totale e togtaledist Word, così arriveranno al massimo a 65536(mi pare). Consigli di definirle Longword.
Inoltre sarebbe più semplice, a mio parere creare una funzione che dia il "totale" data una stringa come parametro.
Potresti poi aggiungere un controllo per verificare il formato delle date.
E, al posto del codice if mesi=1 then ... potresti usare un array costante:
giornimesi : array[1..12]of byte = (31,28,31,30,31,30,31,.... );
ed poi usare un ciclo for:
for i := 1 to mesi do totale := totale + giornimesi[i];
E ti conviene scrivere
tot:=abs(totale-totaledist);
Usando word(0..65536) conviene non avere numeri negativi !
Così prenderà il valore assoluto.
Ultima modifica effettuata da Phi 10/05/11 17:48
aaa
10/05/11 18:56
Goblin
Forse mi sono perso qualche pezzo ... cosa c'e' che non va utilizzando il tipo TDateTime ??
PS: scritto al volo non testato, ma dovrebbe funzionare
G.
program calcdate; uses sysutils; Var dDataInizio, dDataFine: TDateTime; nTotal: Integer; sTemp: String; begin Writeln('Data inizio gg/mm/yyyy'); // 15/10/1970 readln (stemp); dDataInizio := StrTodate(sTemp); Writeln('Data fine gg/mm/yyyy'); // 10/10/2011 readln (stemp); dDataFine := StrTodate(sTemp); nTotal := Trunc(dDataFine - dDataInizio); writeln('distanza in giorni ', nTotal); readln(stemp); end.
PS: scritto al volo non testato, ma dovrebbe funzionare
G.
Ibis redibis non morieris in bello
10/05/11 19:08
Phi
Non sapendo di questa possibilità avrei fatto così:
program calcologiornidata; var st :string; t1, t2: longword; const giornimese : array[1..12]of byte=(31,28,31,30,31,30,31,31,30,31,30,31); function numdata(s:string): longword; var i,p,nn, tot:longwors; ns :string; procedure trovann; begin p := pos('/', s); ns:=copy(s, 1, p-1); val(ns,nn); delete(s,1,p); end; begin numdata:=0; if s='' then exit; trovann; tot:=nn; if s='' then exit; trovann; if (s='') or (nn>12) or (nn<1) then exit; if (tot<0)or(tot>giornimese[nn]) then exit; for i := 1 to nn do tot:=tot+giornimese[i]; val(s,nn); numdata:=tot+365*nn; end; Begin writeln ('inserisci la data di oggi gg/mm/aaaa'); repeat readln (st); t1:=numdata(st); until t1<>0; writeln('inserisci la data rispetto a cui vuoi calcolare la distanza'); repeat readln (st); t2:=numdata(st); until t1<>0; writeln('la distanza e''',abs(t1-t2), ' giorni'); readln; End.
Ultima modifica effettuata da Phi 10/05/11 19:13
aaa