PDA

View Full Version : Un algoritmo in C/C++


misterx
17-07-2003, 18:44
Ho il seguente "file iniziale" che contiene nomi di città.

[file iniziale]
ANCONA
PALERMO
MILANO
BOLOGNA
PISA
LECCE

Si deve scrivere un programma (C/c++) che date in "input da tastiera" (vedi sotto) alcune informazioni,le scriva nel "file iniziale" nel modo illustrato negli esempi sotto.

Se vi cimentate nello scrivere l'algoritmo funzionate, vi sarei grato se indicate anche il tempo da voi impiegato per risolvere il problema.

*********** esempio 1 *************

[input da tastiera]
ANCONA MARIA 100-200-250-100-300
-----------------------------------
[file di output]
ANCONA MARIA 100-200-250-100-300
PALERMO
MILANO
BOLOGNA
PISA
LECCE

*********** esempio 2 *************

[input da tastiera]
ANCONA MARIA 200-125-050-118-288
-----------------------------------
[file di output]
ANCONA MARIA 100-200-250-100-300
MARIA 200-125-050-118-288
PALERMO
MILANO
BOLOGNA
PISA
LECCE

*********** esempio 3 *************

[input da tastiera]
MILANO MARIO 200-125-050-118-288
-----------------------------------
[file di output]
ANCONA MARIA 100-200-250-100-300
MARIA 200-125-050-118-288
PALERMO
MILANO MARIO 200-125-050-118-288
BOLOGNA
PISA
LECCE

*********** esempio 4 *************

[input da tastiera]
MILANO MARIO 210-225-450-108-980
-----------------------------------
[file di output]
ANCONA MARIA 100-200-250-100-300
MARIA 200-125-050-118-288
PALERMO
MILANO MARIO 200-125-050-118-288
MARIO 210-225-450-108-980
BOLOGNA
PISA
LECCE



:( purtroppo è andata a farsi benedire la formattazione:mad:

recoil
17-07-2003, 22:24
uff... i file non sono mai stati il mio forte :mc:

direi che la cosa più semplice è fare una copia del file, leggerlo, fermarsi dove c'è la città indicata e poi inserire le info e andare avanti con la copiatura fino a fine file.

non so se è molto efficiente ma almeno funziona

frankk
18-07-2003, 10:42
6 furbo!!!! peccato ke nessuno ti risp.
Da oggi ci provo io!

by
The best

misterx
18-07-2003, 11:06
Originariamente inviato da frankk
6 furbo!!!! peccato ke nessuno ti risp.
Da oggi ci provo io!

by
The best




:confused: :confused:

a2000
18-07-2003, 14:45
Originariamente inviato da misterx

...
Se vi cimentate nello scrivere l'algoritmo funzionate, vi sarei grato se indicate anche il tempo da voi impiegato per risolvere il problema.




10 secondi per l'algoritmo.

invece è circa una settimana che penso a quale patologia possa affliggerti. :confused: :D

verloc
18-07-2003, 15:45
Una classettina che contenga i membri:

Nome città

Nome proprio

5 numeri interi

ridefinire gli operatori < e > in funzione dell'ordinamento per città per nome o per uno dei campi numerici.


ridefinire l'operatore << per sparare i dati del record sul file

mettere tutto in una stl::list
(consentira di ordinare usando l'algoritmo sort)



Nell'interfaccia grafica:
edit.box separati per ogni campo in una finestra di dialogo che all'OK controlli la correttezza dei dati immessi (Ciccio al posto di un numero per esempio)

Ho ricevuto il PVT ;) grazie

misterx
18-07-2003, 18:40
Originariamente inviato da a2000
10 secondi per l'algoritmo.

invece è circa una settimana che penso a quale patologia possa affliggerti. :confused: :D


fuori l'algoritmo, va bene anche in VBA così lo testo con Excel :)

di quale patologia soffro ?

:O non mi tenga sulle spine dottore :D

a2000
18-07-2003, 19:24
cazzonaggine acuta.

ue' ma du chel che abiti ? a piazzale Corveetto ?


allora che mestiere fai ?

a2000
18-07-2003, 22:30
tel chi, per esempio ... ma non chiamatelo algoritmo.



Sub OltreTomba()
a$ = InputBox("Cantami o Diva del Pelide Achille"): If a$ = "" Then Exit Sub
ipos = InStr(a$, " "): If ipos = 0 Then Exit Sub
a1$ = Left$(a$, ipos - 1)
a2$ = Mid$(a$, ipos + 1)

Open "c:\temp\misterxInp.dat" For Input As #1
Open "c:\temp\misterxOut.dat" For Output As #2
Do Until EOF(1)
Line Input #1, b$
If InStr(b$, a1$) = 1 Then
If b$ = a1$ Then
Print #2, a$
Else
Print #2, b$
Print #2, a2$
End If
Else
Print #2, b$
End If
Loop
Close

End Sub

a2000
19-07-2003, 12:45
ti piace il presepie ?

misterx
19-07-2003, 12:53
devo ancora provarlo ma visto così di primo acchito, sembra non rispondere alle mi esigenze

forse mi sono espresso :ciapet: all'inizio del mio 3D

a2000
19-07-2003, 13:45
esegue gli esempi che hai fatto e simili.

cionci
19-07-2003, 17:04
Secondo me è formulato male il problema... Non sono discriminabili i campi...

Ad esempio se ho già nel file

CAMPI BISENZIO MARIA ASSUNTA ADDOLORATA 100-222-333-333-222

E da tastiera si inserisce :

CAMPI BISENZIO MARIA MADDALENA 100-222-333-222-333

Come faccio a capire se devo scrivere

CAMPI BISENZIO MARIA ASSUNTA ADDOLORATA 100-222-333-333-222
MARIA MADDALENA 100-222-333-222-333

o

CAMPI BISENZIO MARIA ASSUNTA ADDOLORATA 100-222-333-333-222
MADDALENA 100-222-333-222-333

o

CAMPI BISENZIO MARIA ASSUNTA ADDOLORATA 100-222-333-333-222
BISENZIO MARIA MADDALENA 100-222-333-222-333

?

Ci deve essere un carattere di separazione fra i campi...lo spazio non può essere un carattere discriminante...

verloc
19-07-2003, 17:12
perciò,
secondo me era la classica roba da fare con la prog a oggetti.
Sotto sotto ci vuole un controllo di errore non proprio da mezz'oretta.

a2000
19-07-2003, 18:04
ma sì che va bene.

i dettagli agli informatici. :P

misterx
19-07-2003, 19:13
come dice giustamente Cionci ed ho già asserito io, ho descritto il problema veramente con i piedi

dev'essere sto cavolo di caldo :mad:

p.s.
anche la perdita di formattazione ha contribuito a creare caos

riformulerò in modo più corretto la mia domanda:cry:


cmq, a me è sembrato un problema meno banale di quanto sembri

misterx
19-07-2003, 19:52
Originariamente inviato da cionci
Secondo me è formulato male il problema... Non sono discriminabili i campi...



vediamo se riesco ad esprimere meglio il problema

[file iniziale]
ANCONA
PALERMO
MILANO
BOLOGNA
PISA
LECCE


ora digito:
ANCONA MARIA 100-200-300-400-500


e mi ritrovo:
ANCONA MARIA 100-200-300-400-500
PALERMO
MILANO
BOLOGNA
PISA
LECCE


se ora digito un valore che sta in mezzo al precedente:
ANCONA MARIA 150-250-350-450


mi ritrovo:
ANCONA MARIA 100-150-200-250-300-350-400-450-500
PALERMO
MILANO
BOLOGNA
PISA
LECCE

(notate che qui l'algoritmo, avendo trovato già MARIA presente,
i nuovi valori inseriti sono sati intercalati a quelli già esistenti)



forse così è un pò più chiaro

p.s
tenete presente che i vari campi sono separati da una tabulazione

verloc
20-07-2003, 06:12
Bene: è un piccolo database

L'oggetto record deve avere :
- il campo Città (std::string)
- il campo Nome(std::string)
- una std::lista (o std::vector) di interi

Il caricamento lo fai per linee :
carichi ogni linea in una string,inizializzi uno stringstream dalla linea quindi da questo inizializzi l'oggetto facendo il primo livello di controllo.

il database sarà a sua volta un oggetto che avrà come membro
lista o vector di records.

Non so se va bene, ho scritto in fretta,vediamo che dice Cionci :)

NB al posto della lista, nel record conviene mettere il container sempre ordinato (mi pare la deque,non mi ricordo)

verloc
20-07-2003, 09:04
Se conosci un pò di STL ,overloading degli operatori,f.o per odinare secondo criteri diversi allora te la cavi,e fai una cosa che funziona bene,compatta,che non ha bisogno di un programma proprietario;altrimenti alla C so' dolori(da masochista) :mc: .

Ultima chance : Access

Vediamo che tira fuori dal cilindro o' Mast' di Excelle :D
( a quest'ora si starà preparando per andare a mare)


ps se quello dove va, può ancora definirsi mare :rolleyes:

a2000
20-07-2003, 10:14
ah com vi farria' fa' quatt'ann di Basicco pu' Commodore128 !
(ah come vi farei fare quattro anni di Basic col Commodore128 !)

non voglio fare il saputo (saccente) ma veramente burdel (ragazzi) queste sono cose che si facevano, per esempio, alla 4a lezione di un corso di Cobol for dummies nel 1979.

In VBA è un attimo. e in Fortran, Pascal, C (?).

in C++ invece è un'oretta di declare più un due di programmazione più una di debugging: potenza della programmazione ad oggetti applicata a problemi puliti. :D :D

ma non vi demoralizzate: non si va con una Ferrari su uno sterrato ! :O
... ehhh vi piacerebbe ... :P
l'analogia giusta è: non si va con un fuoristrada (C++) su una pista di F1 :D

cionci
20-07-2003, 11:45
a2000: fai un eseguibile in Fortan e ci dici quanto ci metti...
Devi ordinare anche in numeri del vettore...

verloc
20-07-2003, 12:37
Originariamente inviato da cionci
a2000: fai un eseguibile in Fortan e ci dici quanto ci metti...
Devi ordinare anche in numeri del vettore...

Pruvucatio magistris!
;) :D

Quann' o fortran nun zerv a nu Katz

misterx
20-07-2003, 13:03
ragazzi, è meno semplice di quanto si pensi

un'oretta a mio avviso non basta :cool:

cionci
20-07-2003, 13:58
Io ci ho messo circa un'ora e 20...se vuoi ti faccio vedere il codice...

a2000
20-07-2003, 14:33
Originariamente inviato da cionci
a2000: fai un eseguibile in Fortan e ci dici quanto ci metti...
Devi ordinare anche in numeri del vettore...

ecco questo è un esempio di programmazione ridondante a priori alias programmazione ad oggetti (già fatti ... da altri).
se devi inserire ordinatamente numeri in un vettore ordinato (che poi col ca++o che uso un vettore) che bisogno c'è di riordinare il vettore.
e anche se dovessi riordinare tutto il vettore ?
cioè, dico, il secondo esercizio dopo "ciao mondo".

ma dioveth ragazzi ! :D :D

e poi lo ripeto ancora: fortran == basic
e ancora di più VFortran === VBasic

non ci metto molto: inserisco il codice nel traduttore automatico Basic <-> Fortran (fatto in VBA :D) e via di run ! :cool:

cose del genere:

Exit Sub RETURN
Exit Function RETURN
Exit For EXIT

End Sub End Subroutine
__Sub __Subroutine
End Function End Function

For_ Do_
Next_ End Do_!
_To_ :
_To_ ,_
_Step_ ,_

If_ If_(
_Then Stop )_Stop
_Then Call )_Call
_Then Return )_Return
_Then Exit )_Exit
_Then )_Then




notte ! :P

verloc
20-07-2003, 15:00
Originariamente inviato da cionci
Io ci ho messo circa un'ora e 20...se vuoi ti faccio vedere il codice...

Posta posta...
che sta roba serve sempre ;)

a2000
20-07-2003, 15:07
e capirai ... !

verlocc ta'ia fa' u mazz altro che serve sempre !

verloc
20-07-2003, 15:29
Originariamente inviato da a2000
e capirai ... !

verlocc ta'ia fa' u mazz altro che serve sempre !

Non osare...
lo sai... che me lo sto già facendo :)

cionci
21-07-2003, 08:43
Originariamente inviato da a2000
se devi inserire ordinatamente numeri in un vettore ordinato (che poi col ca++o che uso un vettore) che bisogno c'è di riordinare il vettore.

Allora non hai capito cosa vuole misterx...
Il problema sta proprio nell'analizzare l'input in modo da inserire una nuova persona al posto giusto o aggiungere i numeri alla lista se la persona è già esistente...e bisogna anche ordinarli (come richiesto dall'esempio postato da misterx)...
L'ordinamento in se non è un problema (tant'è che in C++ si fa con una istruzione)...ma il problema è il parsing della stringa e il conseguente inserimento della stringa nel file in maniera opportuna...


#include <iostream>
#include <strstream>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <fstream>

#include <cstdlib>

using namespace std;

struct ltstr
{
bool operator()(const string s1, const string s2) const
{
return s1 < s2;
}
};

typedef vector<int> vdati;
typedef vector<int>::iterator ivdati;
typedef map<string, vdati, ltstr> vpersone;
typedef map<string, vdati, ltstr>::iterator ivpersone;
typedef map<string, vpersone, ltstr> vcitta;
typedef map<string, vpersone, ltstr>::iterator ivcitta;

class database {
vcitta v;
public:
database() { };
bool aggiungi(const string &cit, const string &persona, const string &dati);
bool aggiungi_citta(const string &citta);
friend ostream &operator<<(ostream &os, database &db);
};

bool database::aggiungi_citta(const string &citta)
{
v[citta].size();
return true;
}


bool database::aggiungi(const string &cit, const string &persona, const string &dati)
{
vdati tmp;
int start = 0;
for(int i=0; i<dati.size(); ++i)
{
if(!isdigit(dati[i]))
{
if(start == i)
return false;
else
{
tmp.push_back(atoi(dati.substr(start,i-start).c_str()));
start = i + 1;
}
}
else
{
if((i+1) == dati.size() && (i-start+1) > 0)
tmp.push_back(atoi(dati.substr(start,i-start+1).c_str()));
}
}

if(v[cit][persona].size() > 0)
for(ivdati ivd = tmp.begin(); ivd < tmp.end(); ivd++)
v[cit][persona].push_back(*ivd);
else
v[cit][persona] = tmp;

sort(v[cit][persona].begin(), v[cit][persona].end());
return true;
}

ostream &operator<<(ostream &os, database &db)
{
for(ivcitta itc = db.v.begin(); itc != db.v.end(); itc++)
{
os << (*itc).first;
for(ivpersone itp = (*itc).second.begin(); itp != (*itc).second.end(); itp++)
{
if(itp == (*itc).second.begin())
os << "\t";
else os << endl;
os << (*itp).first;
vdati &tmp = (*itp).second;
os << "\t";
for(int i = 0; i < tmp.size(); i++)
{
os << tmp[i];
if(i != (tmp.size()-1))
os << "-";
}
}
os << endl;
}
return os;
}

istream &operator>>(istream &is, database &db)
{
string citta;
while(!is.fail())
{
char buf[4097];
is.getline(buf, 4096, '\n');
if(is.fail())
{
is.setstate(ios::goodbit);
continue;
}
int i = 0;
int tab[4096];
int count = 0;
while(buf[i])
{
if(buf[i] == '\t')
{
tab[count++] = i;
buf[i] = '\0';
}
++i;
}
string persona;
string dati;
switch(count)
{
case 0:
db.aggiungi_citta(buf);
break;
case 2:
citta = buf;
persona = buf + tab[0] + 1;
dati = buf + tab[1] + 1;
if(!db.aggiungi(citta, persona, dati))
throw string(buf);
break;
case 1:
persona = buf;
dati = buf + tab[0] + 1;
if(!db.aggiungi(citta, persona, dati))
throw string(buf);
break;
default:
throw string(buf);
}
}
return is;
}

int main()
{
database db;
ifstream f1("dati.txt");
f1 >> db;
f1.close();

cout << "Stato iniziale del file :" << endl;
cout << db;

cout << endl << "Inserisci i campi separati dal TAB (una riga vuota per terminare) :" << endl;

char buf[4097];

do
{
cin.getline(buf,4096,'\n');
strstream st;
st << buf;
if(strlen(buf) > 1)
{
try {
st >> db;
}
catch(string e)
{
cout << endl << "Errore nella riga '" << e << "'" << endl;
}
}
}while(strlen(buf) > 1);

cout << endl << "Stato finale del file :" << endl;
cout << db;

ofstream f2("dati.txt");
f2 << db;
f2.close();
system("PAUSE");
return 0;
}

a2000
21-07-2003, 09:34
oh mi signor ... 150 righe di codice per una cosa così !

la metà della metà delle righe di codice bastano e avanzano ! :cool:

saludi. :P

cionci
21-07-2003, 09:35
Ok...fai pure te il programma funzionante e guardiamo quanto tempo e righe ci metti...

misterx
21-07-2003, 10:02
Originariamente inviato da cionci
Ok...fai pure te il programma funzionante e guardiamo quanto tempo e righe ci metti...


hai la mailbox full ;)

cionci
21-07-2003, 10:08
Visto...era è libera...

verloc
21-07-2003, 10:47
Originariamente inviato da cionci
Allora non hai capito cosa vuole misterx...

clap clap clap :) (fatti: non parole)

grazie Cionci

Dai una occhiata a questo ( testalo e dimmi che ne pensi )

// file conversions.h
// this is a personal modification of wonderful Kevlin Henney's lexical_cast,
// please refer to http://www.boost.org for info
//
// purpose: simple runtime conversions from-to types
// i.e string-char* etc to double-int etc without exceptions
//
// feel free to do what you want with this file
//
// verloc2000@yahoo.it
//
// SAMPLE
/*

#include <stdio.h> //for getchar
#include <string>
#include "conversions.h"
int main(int argc, char** argv)
{

double number;
cout.precision(15);
string strNumber("1234.56666666666666");
char* szNumber="534,768";

//Conversion string to double

if(convert<string,double>(strNumber,number))
{
cout.imbue(std::locale(""));
cout<<number<<endl;
}
else cout<<"Bad conversion of \"1234.56666666666666\" :"<<'\n'<<"my locale needs comma"<<'\n';

if(convert<char *,double>(szNumber,number))
{
cout.imbue(std::locale(""));
cout<<number<<endl;
}
else cout<<"Bad conversion of char * 534,768"<<'\n';

//Conversion double to string
double num2 =999.99;
char *sznum2;

if(convert<double,char *>(num2,sznum2)) cout<<sznum2<<endl ;
else cout<<"Bad conversion"<<'\n';
getchar();
}

*/


#ifndef CONVERSIONS_H
#define CONVERSIONS_H

#include <iostream>
#include <sstream> //stringstream header
#include <locale>
//#include <vector>
using namespace std;

template<typename Source,typename Target >
bool convert(Source &arg,Target &result)
{
stringstream interpreter;
//for locale decimal separator reading
interpreter.imbue(std::locale(""));


if(
!(interpreter << arg) ||
!(interpreter>>result ) ||
!(interpreter >> std::ws).eof()
)

return false;

else return true;


}




#endif


idea: perchè non uno stringstream per i dati ? ;)

a2000
21-07-2003, 11:39
Originariamente inviato da verloc
clap clap clap :) (fatti: non parole)

grazie Cionci
...



lecchino.

a2000
21-07-2003, 11:41
e pur' fauz'

:)

a2000
21-07-2003, 12:29
Originariamente inviato da ilsensine
Potresti mantenere il numero di post inutili al di sotto di un ragionevole 5%?


tranquillo, vada per il 5% e non di più.

cionci
21-07-2003, 14:35
Originariamente inviato da verloc
Dai una occhiata a questo ( testalo e dimmi che ne pensi )

Dovrebbe andare bene... Comunque non sono un'aquila su queste cose... Ad esempio stringstream è la prima volta che la vedo !!!
Comunque il modo che hai usato per fare la conversione è molto simile a quello che ho usato io per dare una riga inserita dallo stdin in pasto all'operatore >> della classe database...

Insomma a2000, ma questo programma ?

verloc
21-07-2003, 14:51
Originariamente inviato da a2000
lecchino.

:P

si però lui ce l'ha fatto vedere...tu no perchè ce l'hai PICCOLO :D

verloc
21-07-2003, 14:58
Potresti mantenere il numero di post inutili al di sotto di un ragionevole 5%?

non so perchè,ma anch'io... mi sento coinvolto.
"Chi va con lo zoppo..."


mi darò una regolata.

a2000
21-07-2003, 15:10
cazzone !

la prima soluzione è stata la mia.

vi lascio le banali modifiche come esercizio.

cionci
21-07-2003, 15:15
Nono...la tua soluzione non rispetta le richieste...e le modifiche non sono afftto banali...

lombardp
21-07-2003, 15:19
Una versione un po' particolare, nel senso che mi sono concentrato sulle strutture dati e non interagisce con l'esterno. Manca gestione dell'I/O sia da tastiera che con i file.

Se poi ho qualche altro minuto, aggiungo quello che manca.


#include "stdafx.h"
#include "stdio.h"
#include "string.h"
#include "conio.h"

class listitem {
public:
char citta[10];
char nome[30];
bool iscitta;
listitem* pnext;
};

int appo;
listitem* proot = NULL;

void listadd(char* pcitta,char* pnome) {
listitem* plist = NULL;
listitem* pcurr = NULL;
pcurr = new listitem;
bool esci;

strcpy(pcurr->citta,pcitta);
strcpy(pcurr->nome,"");
pcurr->iscitta = false;
pcurr->pnext = NULL;

if (pnome==NULL) pcurr->iscitta = true;
else strcpy(pcurr->nome,pnome);

if (proot==NULL) proot = pcurr;
else {
plist = proot;
esci = false;
while ((plist->pnext!=NULL) & !esci)
if (strcmp(pcurr->citta,plist->pnext->citta)>=0) plist = plist->pnext;
else esci = true;
if (plist->pnext==NULL) plist->pnext = pcurr;
else {
pcurr->pnext = plist->pnext;
plist->pnext = pcurr;
}
}
}

int main(int argc, char* argv[])
{
listadd("ANCONA",NULL);
listadd("PALERMO",NULL);
listadd("MILANO",NULL);
listadd("BOLOGNA",NULL);
listadd("PISA",NULL);
listadd("LECCE",NULL);

listadd("ANCONA","MARIA 100-200-250-100-300");
listadd("ANCONA","MARIA 200-125-050-118-288");
listadd("MILANO","MARIO 200-125-050-118-288");
listadd("MILANO","MARIO 210-225-450-108-980");

char ch = getch();
return 0;
}

a2000
21-07-2003, 15:26
Originariamente inviato da cionci
Nono...la tua soluzione non rispetta le richieste...e le modifiche non sono afftto banali...

ahh, che fatica la vita ! :(

cionci prova a ripetere velocemente: "la vita è fatica, la vita è fatica ..."

bravo lombardp sei già calato a 45 righe (senza I/O) !

ma dopo centinaia di temp.zip, ancora non mi credete sulla parola ?

volete proprio la rozza prova materiale ?

cionci
21-07-2003, 15:28
Però non metti insieme le liste di numeri di persone che hanno stesa città e stesso nome...
a2000: Non manca solo l'I/O, manca anche il parsing del vettore dei numeri (che va ordinato)...
Non per fare a gara con lombardp, ma la parte più estesa del codice che ho scritto è l'I/O...

verloc
21-07-2003, 15:29
Originariamente inviato da a2000
cazzone !

la prima soluzione è stata la mia.

vi lascio le banali modifiche come esercizio.

:confused:

tu e il controllo di errore non andate molto d'accordo,

eppure qualcosa mi dice che della materia dovresti essere un maestro.

E se l'utente per esempio invece di scrivere 250 scrive Ingrassia Ciccio? (pace all'anima sua)

Serio
Non te la puoi sempre cavare con qualche righetta di VBA:
(dico in generale,non tu personalmente)
questo distingue codice scritto da una segretaria smanettona di Excell da codice INGEGNERISTICO.

a2000
21-07-2003, 15:36
guarda che questo genere di problemi, anche se semplici, non dovrebbero proprio porsi.

verloc
21-07-2003, 15:43
Ragazzi sto parlando sul serio:
in quella righetta di record si potrebbero annidare decine e decine
di errori (dell'utente)e bachi.

se l'utente scrive il nome e non i numeri?

se l'utente scrive 250.3 e non un numero intero?

se l'utente scrive prima i dati e poi il nome?

c'è un numero min-max di numeri?

se l'utente scrive Abelardo Francisco Miguel de Santillana Marques de Castiglia y Navarra?

se l'utente scrive Maria350 ?

...posso continuare...

secondo me questo distingue codice che rimane in una cantina di smanettone da codice che deve essere pagato 10000 € oppure codice da cui dipende la sicurezza delle persone o di un esercito.

cionci
21-07-2003, 15:43
Insomma a2000 ce lo vuoi far vedere o no questo programma in Fortran ? O vuoi fare la preziosa ;)

cionci
21-07-2003, 15:46
Originariamente inviato da verloc
Ragazzi sto parlando sul serio:
in quella righetta di record si potrebbero annidare decine e decine
di errori (dell'utente)e bachi.
Infatti... Come detto da misterx la separazione fra i campi deve essere un TAB...
I controlli sulla validità della riga inserità li ho fatti... Credo di avere già gestito un buon numero di errori possibili...

misterx
21-07-2003, 15:47
perchè nessuno ha usato una bella matrice bidimensionale dinamica per caricare manipolare e scrivere i dati ?????

a2000
21-07-2003, 15:51
Originariamente inviato da verloc
Ragazzi sto parlando sul serio:
in quella righetta di record si potrebbero annidare decine e decine
di errori (dell'utente)e bachi.

se l'utente scrive il nome e non i numeri?

se l'utente scrive 250.3 e non un numero intero?

se l'utente scrive prima i dati e poi il nome?

c'è un numero min-max di numeri?

se l'utente scrive Abelardo Francisco Miguel de Santillana Marques de Castiglia y Navarra?

se l'utente scrive Maria350 ?

...posso continuare...

secondo me questo distingue codice che rimane in una cantina di smanettone da codice che deve essere pagato 10000 € oppure codice da cui dipende la sicurezza delle persone o di un esercito.

certo che se l'utente si chiama verloc ... :D

verloc, datti pace, questi aspetti nei codici seri sono tutte cose secondarie, che si fanno fare dopo a qualche informatico di passaggio (e che poi ti tocca rifare).

a2000
21-07-2003, 15:52
pienz' a salut' :)

a2000
21-07-2003, 15:53
Originariamente inviato da misterx
perchè nessuno ha usato una bella matrice bidimensionale dinamica per caricare manipolare e scrivere i dati ?????

e bravo a misterx: non mi sembra il caso, ma dallo e dallo ...

cionci
21-07-2003, 15:54
Originariamente inviato da misterx
perchè nessuno ha usato una bella matrice bidimensionale dinamica per caricare manipolare e scrivere i dati ?????
Io l'ho usata, ma non si vede ;) Anzi la mia è tridimensionale (gli elementi della matrice sono vettori di interi)...

Quella struttra che nel typedef ho chiamato vcitta è un vettore associativo di vettori associativi di vettori di interi ;)

a2000
21-07-2003, 15:55
scusa cionci ma adesso non ho tempo: sono troppo impegnato su ampland :oink:

verloc
21-07-2003, 15:57
Originariamente inviato da cionci
deve essere un TAB...


infatti è proprio quello il punto di partenza per scrivere codice da cantina...

(mi ricorda tanto quel software all'Istituto di Pavimentazioni stradali che se non gli davi i dati tabulati alla Hitler non capiva un Katzo)

MisterX,
non fraintendere,siamo amici,non ho mai criticato codice altrui e non lo farò mai(a torto o a ragione).

cionci
21-07-2003, 16:00
Originariamente inviato da verloc
infatti è proprio quello il punto di partenza per scrivere codice da cantina...
E' chiaro che partire da un file di dati testuale è sempre un problema...ma se quelle erano le specifiche...

PS: quasi tutti i casi che hai rammentato sono gestiti dal mio codice, chiaramente se non si separano i campi con un tab viene preso tutto con un campo unico... Allora tanto vale fare un inserimento a campi separati...

cionci
21-07-2003, 16:04
Originariamente inviato da a2000
scusa cionci ma adesso non ho tempo: sono troppo impegnato su ampland :oink:
Non hai nemmeno 10 minuti per scrivere un codice di 20 righe ? :P

a2000
21-07-2003, 16:04
o verloc, verloc frat' mii' :(

a2000
21-07-2003, 16:06
Originariamente inviato da cionci
Non hai nemmeno 10 minuti per scrivere un codice di 20 righe ? :P

no.
perché non ho la penna in mano.

lombardp
21-07-2003, 16:38
Versione con I/O da file e inserimento da tastiera:


#include "stdafx.h"
#include "stdio.h"
#include "string.h"
#include "conio.h"

class listitem {
public:
char citta[10];
char nome[30];
bool iscitta;
listitem* pnext;
};

FILE* myfile;
char linea[81],keycitta[16],keynome[32],keynumeri[32];
char *keyc,*keyn;
listitem* proot = NULL;
listitem* plist = NULL;
listitem* pcurr = NULL;

void listadd(char* pcitta,char* pnome) {
pcurr = new listitem;
bool esci;

strcpy(pcurr->citta,pcitta);
strcpy(pcurr->nome,"");
pcurr->iscitta = false;
pcurr->pnext = NULL;

if (pnome==NULL) pcurr->iscitta = true;
else strcpy(pcurr->nome,pnome);

if (proot==NULL) proot = pcurr;
else {
plist = proot;
esci = false;
while ((plist->pnext!=NULL) & !esci)
if (strcmp(pcurr->citta,plist->pnext->citta)>=0) plist = plist->pnext;
else esci = true;
if (plist->pnext==NULL) plist->pnext = pcurr;
else {
pcurr->pnext = plist->pnext;
plist->pnext = pcurr;
}
}
}

int main(int argc, char* argv[])
{

myfile = fopen("kassad.dat","r+");
if (myfile!=NULL) while (fgets(linea,80,myfile)) {
keyc = strtok(linea," \n");
keyn = strtok(NULL,"\n");
if (keyn!=NULL) listadd(keyc,keyn);
else if (keyc!=NULL) listadd(keyc,NULL);
}
fclose(myfile);

scanf("%s %s %s",keycitta,keynome,keynumeri);
strcat(keynome," ");
strcat(keynome,keynumeri);
listadd(keycitta,keynome);

myfile = fopen("kassad.dat","w+");
plist = proot;
while (plist!=NULL) {
strcpy(linea,plist->citta);
if (!plist->iscitta) {
strcat(linea," ");
strcat(linea,plist->nome);
}
strcat(linea,"\n");
fputs(linea,myfile);
plist = plist->pnext;
}
fclose(myfile);

char ch = getch();
return 0;
}

a2000
21-07-2003, 17:59
lombardp 60 righe, mumble ... mumble ....


la indovino con 20 !

misterx
21-07-2003, 19:23
Originariamente inviato da verloc
infatti è proprio quello il punto di partenza per scrivere codice da cantina...

(mi ricorda tanto quel software all'Istituto di Pavimentazioni stradali che se non gli davi i dati tabulati alla Hitler non capiva un Katzo)

MisterX,
non fraintendere,siamo amici,non ho mai criticato codice altrui e non lo farò mai(a torto o a ragione).


non c'è problema :)

per me puoi separare i campi dei record con quello che vuoi; a te la scelta se ti crea probemi ;)

però, già che hai sollevato la questione, ti sarei grato se mi illumini sul tuo metodo di salvataggio dei record :P

a2000
21-07-2003, 20:48
Originariamente inviato da misterx
non c'è problema :)

per me puoi separare i campi dei record con quello che vuoi; a te la scelta se ti crea probemi ;)



hai visto, puoi separare i campi come vuoi ...
e allora ragazzi se usate più di 30 righe di codice buttate nel cesso il linguaggio che state usando.

http://www.pulpweb.com/wbboard/images/smilies/smiles_013.gif C++

confermo le 20 righe. http://www.pulpweb.com/wbboard/images/smilies/smiles_003.gif

verloc
22-07-2003, 04:59
Originariamente inviato da misterx
non c'è problema :)

per me puoi separare i campi dei record con quello che vuoi; a te la scelta se ti crea probemi ;)

però, già che hai sollevato la questione, ti sarei grato se mi illumini sul tuo metodo di salvataggio dei record :P

Non l'hai letto il codice di Cionci eh? :)

Il problema è un classico: overlodare l'operatore << per l'oggetto record e/o per l'intero database.

queste cose si fanno alla C++ ;)

misterx
22-07-2003, 07:20
Originariamente inviato da verloc
Non l'hai letto il codice di Cionci eh? :)

Il problema è un classico: overlodare l'operatore << per l'oggetto record e/o per l'intero database.

queste cose si fanno alla C++ ;)


spiegati meglio :)

cionci
22-07-2003, 08:30
lombardp: a me il tuo mi da un errore di accesso alla memoria...

cionci
22-07-2003, 08:36
Ah...ora va... Andava creato il file...

Comunque se immetto questi tre dati:

FIRENZE MARIA 123-1
FIRENZE MARIA 1-2
FIRENZE MARIA 1-2-1-2

Il file mi viene scritto così:

FIRENZE MARIA 123-1
FIRENZE MARIA 1-2
FIRENZE MARIA 1-2-1-2

Invece di così:

FIRENZE MARIA 1-1-1-1-1-2-2-2-123

Senza contare che l'input con la scanf non permette di inserire città o nomi con uno spazio nel mezzo...

cionci
22-07-2003, 08:45
Insomma...a2000...creane uno equivalente al mio e guarda quanto ci metti... Se vuoi vedere come funziona ti allego l'eseguibile...

http://utenti.lycos.it/ci0nci/main.gif (rinominalo come .zip)
http://utenti.lycos.it/ci0nci/Headbanging1.gif

lombardp
22-07-2003, 08:55
Originariamente inviato da cionci
Ah...ora va... Andava creato il file...

Comunque se immetto questi tre dati:

FIRENZE MARIA 123-1
FIRENZE MARIA 1-2
FIRENZE MARIA 1-2-1-2

Il file mi viene scritto così:

FIRENZE MARIA 123-1
FIRENZE MARIA 1-2
FIRENZE MARIA 1-2-1-2

Invece di così:

FIRENZE MARIA 1-1-1-1-1-2-2-2-123



Una cosa:

Si è vero. Per ora ho realizzato il programma secondo la formattazione dell'output del primo esempio riportato (poi affronterò anche la seconda versione) :


...
[input da tastiera]
ANCONA MARIA 200-125-050-118-288
-----------------------------------
[file di output]
ANCONA MARIA 100-200-250-100-300
MARIA 200-125-050-118-288
PALERMO
MILANO
BOLOGNA
PISA
LECCE
...



Senza contare che l'input con la scanf non permette di inserire città o nomi con uno spazio nel mezzo...

Non essendo stato specificato di dover gestire nomi e città con spazi, ne essendocene negli esempi, ho ritenuto di poter interpretare liberamente la situazione.

verloc
22-07-2003, 10:12
Originariamente inviato da cionci
Insomma...a2000...creane uno equivalente al mio e guarda quanto ci metti... Se vuoi vedere come funziona ti allego l'eseguibile...


meraviglioso lo smile headbangher!!!! :D

Non riesco a trovarne uno che sputazza in faccia a un'altro...se l'avete... :)

verloc
22-07-2003, 10:16
Originariamente inviato da misterx
spiegati meglio :)

Abla español ? :D

misterx
22-07-2003, 10:34
Originariamente inviato da verloc
Abla español ? :D


ho capito che sei pigro :)

verloc
22-07-2003, 11:07
aaaaaaarrrrrggggggggghhhhhhhh!!!!

overloading degli operatori.
te lo ha fatto vedere Cionci meglio di quanto avrei fatto io:quando fai così

fout<<Il_mio_fottuto_oggetto_classe_record

lui ti scrive sullo stream che vuoi i dati del record.

Tu pensi che sto cazzeggiando?In questo momento sto sbattendo la testa per far disegnare a comando un fottutissimo disegno.

vabbuò? :D


Uagliò, te lo deve dire un ingegnere civile che devi studiare
Bruce Eckel ? :D

Hai una filosofia diametralmente opposta alla mia:impari le cose solo se e quando ti servono;ciò comporta una curva di apprendimento infinitamente lineare (fatica terribile e masochista) :)

misterx
22-07-2003, 11:22
Originariamente inviato da verloc

........ impari le cose solo se e quando ti servono; ciò comporta una curva di apprendimento infinitamente lineare (fatica terribile e masochista)




hai colto nel segno............

perchè riempirsi la testa di inutili teorie se poi non le usi ?

il mio cervello dimentica abbastanza in fretta :D

vedrai che finita l'uni fai anche tu così; non si sta tutta la vita sotto esame ;)

che comporti una curva di apprentimento bla bla bla, è dimostrato ? :confused:

Fenomeno85
22-07-2003, 13:10
secondo me se a2000 dice che in 20 righe il prob si risolve è così! Mi aveva risolto un problema in excel mi stava facendo diventare matto.
Siccome mi voglio cimentare anchio in questo bel problemino, vorrei sapere:

- il numero dei file è quanti sono le città

- i file utilizzati possono essere di tipo binario

cionci
22-07-2003, 13:15
Io l'ho fatto con un solo file di testo ed i campi che sono separati da TAB...e i nomi delle città sono variabili e si possono inserire anche dal programma...
se vuoi vedere quello che fa il mio eseguibile scaricalo da sopra...

verloc
22-07-2003, 15:46
Originariamente inviato da misterx
vedrai che finita l'uni fai anche tu così; non si sta tutta la vita sotto esame ;)



non è detto che tu abbia torto ;)


che comporti una curva di apprentimento bla bla bla, è dimostrato ? :confused:


in realtà la cosa è più complicata:un misto di intuito ed esperienza
nell'applicare lo "imparara l'arte e mettila da parte":
cioè capire al volo quando una cosa ti potrebbe servire in futuro.

Esempi sparsi :
mi scaricai un articolo che trattava di una tecnica raffinata per risolvere numericamente una equazione secondo metodi a scelta,
usando template e f.o.Quando l'ho scaricato a malapena sapevo "Hello world".Oggi è il punto di forza del mio programma.

Da un piccolissimo Cad scaricato un anno fa in mezz'ora ho ricavato il logo 3d con le ombre ( :eek: ) del mio programma.

Da un programma free scaricato al volo posso ridurre una bitmap per farne un gliph per pulsanti.

Con la stessa mentalità (per ora)salto a piè pari tutto ciò che riguarda la manipolazione by code delle immagini.

Overloading:
sapevo che mi sarebbe servito per ridefinire l'operatore == per ricercare oggetti duplicati e ne ho studiato le basi prima.

Perchè ho statisticamente verificato che quando arrivi al punto che devi imparare una cosa importante al momento per chè non puoi fare altrimenti;allora stai davvero nei guai.

Solo agendo così ho trovato il coraggio e l'incoscienza di fare una tesi per cui all'università mi hanno dato del PAZZO!

Ho reso l'idea amico mio? :)

ciao,fammi andare.

ps fra un pò ti chiederò lo scheduler: pare che tu abbia fatto un gran lavoro e voglio vederlo ;)

verloc
22-07-2003, 15:56
Originariamente inviato da Fenomeno85
secondo me se a2000 dice che in 20 righe il prob si risolve è così!


e poi la gente si chiede come può nascere una dittatura in quei paesi di pezzenti nel terzo mondo... :rolleyes:


ragazzo io sono AMICO di a2000 ma se in 4 pagine di discussione non hai capito che questa volta lui ha torto,devi mangiare ancora
pane.

Lui si contraddice quando dice che prima bisogna guardare allo stato dell'arte...

LO STATO DELL' ARTE PER QUESTE COSE E' LA PROGRAMMAZIONE A OGGETTI

ps scusa la ramanzina paternalistica,non te la prendere :)

intanto io so cosa farà stasera: il femminielli tour :D

Fenomeno85
22-07-2003, 16:16
la cosa della dittatura nn l'ho mica capita ... per il resto avrai forse ragione ... non me la prendo mica nn ti preoccupare ::ubriachi::cincin:

verloc
22-07-2003, 16:24
http://gethelp.devx.com/techtips/cpp_pro/10min/10min0400.asp

misterx
22-07-2003, 19:16
Originariamente inviato da verloc

non è detto che tu abbia torto ;)




fidati...



Originariamente inviato da verloc

in realtà la cosa è più complicata: un misto di intuito ed esperienza nell'applicare lo "imparara l'arte e mettila da parte":
cioè capire al volo quando una cosa ti potrebbe servire in futuro.

ps fra un pò ti chiederò lo scheduler: pare che tu abbia fatto un gran lavoro e voglio vederlo ;)

E' solo una questione di metodi, ognuno ha i suoi; "fortunatamente" quando ho la necessità di imparare qualcosa di nuovo mi riesce abbastanza semplice, ribadisco, "fortunatamente".

In ogni caso ho capito cosa intendi, anch'io ho il mio cassetto dei miracoli dove conservo tutto quello che imparo e che all'occorrenza.......

Lo scheduler l'ho scritto in VBA pur non conoscendo nulla o quasi su tale linguaggio: così a me lo hanno richiesto ed io li ho accontentati.

Solo fortuna, pura e semplice fortuna :)



in ogni caso: non ne so mai abbastanza quindi, sotto a studiare che la strada è ancora lunga ;)

a2000
22-07-2003, 21:36
Originariamente inviato da Fenomeno85
secondo me se a2000 dice che in 20 righe il prob si risolve è così! Mi aveva risolto un problema in excel mi stava facendo diventare matto.
Siccome mi voglio cimentare anchio in questo bel problemino, vorrei sapere:

- il numero dei file è quanti sono le città

- i file utilizzati possono essere di tipo binario

ti ringrazio e mostreremo a questi miscredenti in quale orrido nebbioso stanno vagando senza pace e senza luce. :mc:

a2000
22-07-2003, 21:37
verlocc, all'istituto motori iè chin' d' cazzun' :sofico:

Fenomeno85
23-07-2003, 12:57
di niente a2000 ... la mia fiducia è tutta in te :O