PDA

View Full Version : [c++] char+int?


kk3z
10-05-2004, 14:56
è possibile fare un char+int, cioè una stringa di testo con una variabile alla fine, che può essere un numero? ad es ciao1, ciao2, ciao3 ecc?

grazie :)

ri
10-05-2004, 16:28
#include <sstream>

std::ostringstream oss;
for(int i = 0; i < 2234; i++)
{
oss << "stringa" << i;
cout << oss;
oss.str(""); // per svuotare la stringa
}


OUTPUT:
stringa1
stringa2
stringa3
stringa4
...
stringa2223

kk3z
10-05-2004, 17:27
non lo so usare :(

ma questo...hemm...std :wtf: mi stampa sullo schermo le stringhe direttamente? o posso usarle per richiamare frasi ? nel senso io ho bisogno di un char che possa essere char1, char2, char3, e che rappresentano le frasi

il char+int era inteso come: io gli dico un valore di questo int, e lui mi becca la frase a cui corrisponde.

ok a questo punto non è chiaro neanche a me cosa devo fare :D mi sono incasinato le idee

kk3z
10-05-2004, 18:42
altra cosa...esiste un random per char?

fpucci
10-05-2004, 19:15
Originariamente inviato da kk3z
altra cosa...esiste un random per char?

No.
Ma se ti serve di generare un numero tra 0 e 255 (equivalente ad un char) puoi usare la funzione random (che genera un numero tra 0 e 1, se non ricordo male) e moltiplicarla per un coefficiente tale in modo da avere un numero compreso tra 0 e 255 ;)

kk3z
10-05-2004, 19:32
no mi serve un random per linee, non carattere per carattere :)

fpucci
10-05-2004, 20:17
Originariamente inviato da kk3z
no mi serve un random per linee, non carattere per carattere :)

Non ha senso.
O forse non capisco io....

kk3z
10-05-2004, 20:41
prendendo dati da un file, devo prendere una linea di testo per volta (due sarebbe meglio, ma nn credo sia possibile).

del tipo un file con

ciao
ciao1
ciao2
ciao3

usando il random, mi piglierebbe x esempio ciao2, oppure ciao e così via...

chiaro no? ;)

ri
10-05-2004, 20:47
certo che se non sai tu quello che vuoi...


#include <sting>
#include <map>
#include <cstdlib>

int main(int argc, int **argv)
{
// creo un oggetto map che ha chiave di tipo int e valore di tipo string
// funziona similmente ad un vettore, solo che anzichè accedere tramite
// indice accedi tramite chiave
std::map<int, std::string> stringhe;

// qui carico il map con le stringhe che mi interessano, associandole ognuna
// ad una chiave ben precisa (che deve essere univoca)
stringhe[0] = "stringa0";
stringhe[1] = "stringa1";
stringhe[4] = "stringa4";
stringhe[6] = "stringa6";

// ora facciamo finta di estrarre un valore di chiave dal map (generandolo
// randomicamente)
int key = rand();

// e verifichiamo che questa chiave esista nel map (difficile che avvenga
// essendo il random generato fra 0 e 35000 e fischia
std::map<int, std::string>::iterator stringhe_it = stringhe.find(key);
if(stringhe_it != stringhe.end())
cout << "chiave " << stringhe_it->first; << " trovata, valore associato: " << stringhe_it->second;
else
cout << "chiave " << key << " non trovata";


return 0;
}



ora... vedi un po' se ti serve
il fatto che tu non le sappa usare è estremamente irrilevante, basta imparare :)

EDIT: bene, dopo aver scritto tutto ho letto che quello che vuoi fare :| vabeh...
cmq il codice non è testato, ma non dovrebbe dare alcun problema

RIEDIT: avevo scritto cazzate :asd:

ri
10-05-2004, 21:10
#include <fstream>
#include <string>

int main(int argc, int **argv)
{
// proviamo sta cosa... non è granchè ottimizzata, ma non sapendo a priori il
// formato del file non posso fare i miracoli

// costruisco un oggetto ifstream (input file stream) e apro il file
std::ifstream ifs;
ifs.open("file.txt);

// gli dico che riga mi interessa (in questo caso la quattordicesima)
int seek = 14;
// scansiono sequenzialmente il file
for(int i = 1; !ifs.eof(); i++)
{
std::string stringa; // qui ci andrà la riga trovata (se trovata)

// leggo una stringa all'interno della variabile string
// questa operazione va fatta comunque, altrimenti il file rimane fermo e
// si cicla all'infinito
ifs >> stringa;

if(i == seek)
cout << "ho trovato la stringa in posizione " << seek << ", valore :" << stringa;
}

return 0;
}


anche questo non è testato, e fa anche abbastanza schifo, ma essendo d'esempio non ho ricercato la raffinatezza :p

kk3z
10-05-2004, 22:04
in effetti sto brancolando nel buio, e il fatto di non sapere bene come fare non è che aiuti... :lamer:

allora sto cercando di fare un quizz :D
ho un file txt nel quale sono contenute le domande insieme alle risposte

faccio prima a postare il codice, nella sua estrema semplicità :)
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

int domandadafile();
int scriviinfile();

int main()
{
int scelta;
cout<<"\n1. Rispondi alle domande";
cout<<"\n2. Scrivi le tue domande";
cout<<"\n3. Esci";
cout<<"\n\nLa tua scelta: ";
cin>>scelta;
switch(scelta)
{
case 1:
domandadafile();
break;
case 2:
scriviinfile();
break;
case 3:
return 0;
default:
cout<<"\nNumero non riconosciuto, chiudo il programma";
}
}

int ancora()
{
int a;
cout<<"\n\nVuoi giocare ancora?";
cout<<"\nSI --> 1";
cout<<"\nNO --> 0";
cout<<"\nLa tua scelta: ";
cin>>a;
if (a==1) main();
else
{
cout<<"Ciao e grazie per aver giocato!";
return 0;
}
return 0;
}

int scriviinfile()
{
int m;
char str[50], str2[50];
ofstream a_file("domandeutente.txt", ios::app);
for (m=3; m>0; m--)
{
cout<<"\nPuoi inserire ancora "<<m<<" domande";
cout<<"\nScrivi la domanda: ";
fflush(stdin);
cin.getline(str, 50, '\n');
a_file<<str<<endl;
cout<<"Scrivi la risposta: ";
cin.getline(str2, 50, '\n');
a_file<<str2<<endl;
a_file.close();
}
ancora();
return 0;
}

int domandadafile()
{
int x,risposte_giuste,risposte_sbagliate;
char domx[100],rispx[50],rx[50];
cout<<"A quante domande vuoi rispondere? ";
cin>>x;
risposte_giuste=0;
risposte_sbagliate=0;
cout<<"\nOra ti faccio delle domande. Attento a scrivere bene!\n";
ifstream a_file("domande.txt");
do {
a_file.getline(domx,100,'\n');
a_file.getline(rispx,50,'\n');
cout<<domx;
cout<<"\nRisposta: ";
fflush(stdin);
cin.getline(rx, 50, '\n');
if (!strcmpi(rispx, rx))
{
cout<<"\nGiusto!\n";
risposte_giuste++;
}
else
{
cout<<"\nSbagliato!\n";
risposte_sbagliate++;
}
x--;
}while (x>0);
a_file.close();
cout<<"\n\nTotale risposte giuste: "<<risposte_giuste<<endl;
cout<<"Totale risposte sbagliate: "<<risposte_sbagliate<<endl;
ancora();
return 0;
}


i due codici che mi hai postato fanno le stesse cose no?
provo a studiarmeli un po'

grazie mille ri :ave: :mano: :D

ri
10-05-2004, 22:08
eddechè ^^
cmq non è che facciano le stesse cose, fanno cose che forse ti possono aiutare e forse no...

cmq fatti un'idea precisa di cosa deve fare il programma e del come (teoricamente)
poi prova a buttare giù il codice (come hai fatto)
appena hai problemi vieni qua che li risolviamo, però fai una domanda più precisa la prossima volta :p

kk3z
10-05-2004, 22:13
il bello è che parto con un'idea ben precisa, poi o perchè nn so come fare o perchè è più bello cosà cambio :D difatti questo programma prima faceva solo domande a muzzo e scriveva le risposte in un file :hic:

ri
10-05-2004, 22:14
lol, della serie "sono coerente e me ne vanto" :asd:

kk3z
10-05-2004, 22:30
:D :D :D

kk3z
11-05-2004, 14:57
allora ho provato il secondo codice, che è il più semplice per me, ma non mi accetta un rand()%qualcosa nel seek, cioè quello che voglio io :(

il primo sembra già avere il rand, però ci sono dei pezzi che nn capisco per es
std::map<int, std::string>::iterator stringhe_it = stringhe.find(key);
if(stringhe_it != stringhe_it.end())
cout << "chiave " << it->first; << " trovata, valore associato: " << it->second;

in particolare mi dà questo errore

no matching function for
call to `std::_Rb_tree_iterator<std::pair<const int, std::string>,
std::pair<const int, std::string>&, std::pair<const int, std::string>*>::end

e poi

`it' undeclared (first use this function)

se riuscissi almeno a compilarlo capirei un po' come funziona

ri
11-05-2004, 15:01
si hai ragione, sono un pirla io :asd:


std::map<int, std::string>::iterator stringhe_it = stringhe.find(key);
if(stringhe_it != stringhe.end())
cout << "chiave " << stringhe_it->first; << " trovata, valore associato: " << stringhe_it->second;


it è come li chiamo d'abitudine, sorry :p

kk3z
11-05-2004, 19:13
va be ho risolto :D
un bel for e tutt'a post (o quasi) :p non vi mostro il codice perchè è un'obbrobrio, però il programma va :cool:

per chi vuole provarlo, ocio che le domande sono poche :D

http://xmax.altervista.org/QUIZ.rar

ri
11-05-2004, 19:15
guarda, se stasera non so che fare provo a scriverlo pure io :p

kk3z
11-05-2004, 19:25
dai, vediamo se riesci a fare qualcosa di meglio! :asd:


http://www.tgmonline.it/forum/images/smiley_icons/lookaround.gif

ri
12-05-2004, 11:05
stamattina non sapevo che fare (no, in realtà ne ho da fare, pure troppo... solo che non mi va :p )


#include <fstream>
#include <string>
#include <iostream>
#include <cstdlib>
#include <vector>

using namespace std;

class Quizzettone
{
public:
Quizzettone(string file_path) : _file_path(file_path)
{}

void printGUI()
{
cout << "\n\n1 - inserisci le domande\n"
<< "2 - rispondi alle domande\n"
<< "3 - esci\n\n"
<< "Che vuoi fare? ";
}

int parseInput()
{
int rc = 0;
int s;
string input;

getline(cin, input);

s = strtol(input.c_str(),0,10);

switch(s)
{
case 1: rc = inserisciDomande();
break;
case 2: rc = avviaQuestionario();
break;
case 3: rc = -1;
break;
}

return rc;
}

const char* geterror()
{
return _errorstring.c_str();
}

private:

void seterror(string err)
{
_errorstring = err;
}

int inserisciDomande()
{
ofstream ofs(_file_path.c_str(), ios::app);

if(!ofs.is_open())
{
seterror("\nImpossibile aprire il file " + _file_path);
return -1;
}

cout << "\n\nInserisci qui di seguito le domande. Per interrompere l'operazione scrivere la lettera 'q'";

string input;
int counter = 0;
while(input != "q")
{
if((counter % 2) == 0) // sto scrivendo una domanda
cout << "\nDomanda: ";
else
cout << "\nRisposta: ";

getline(cin, input);

if(input != "q")
ofs << input << endl;

++counter;
}

return 0;
}

int avviaQuestionario()
{
ifstream ifs(_file_path.c_str());

if(!ifs.is_open())
{
seterror("\nImpossibile aprire il file " + _file_path);
return -1;
}

vector< pair<string, string> > questionario;

while(!ifs.eof())
{
string domanda,
risposta;

getline(ifs, domanda);
getline(ifs, risposta);

if(domanda != "")
questionario.push_back(pair<string, string>(domanda, risposta));
}

cout << "\n\nRispondi qui di seguito alle domande. Per interrompere l'operazione scrivere la lettera 'q'";

string input;
while(input != "q")
{
int domanda = (rand() % questionario.size());
cout << "\nDomanda: " << questionario[domanda].first;
cout << "\nRisposta: ";

getline(cin, input);

if(input != "q")
{
if(input == questionario[domanda].second)
cout << "\nRisposta corretta!";
else
cout << "\nRisposta errata! La risposta corretta e': " << questionario[domanda].second;
}

}

return 0;
}

string _file_path;
string _errorstring;
};

int main(int argc, char *argv[])
{
Quizzettone quiz("d:\\buffer\\domande.txt");

int rc = 0;
while(rc == 0)
{
quiz.printGUI();
rc = quiz.parseInput();
}

if(rc != 0)
cout << quiz.geterror();

return 0;
}


lo allego anche va

kk3z
12-05-2004, 19:23
come non detto, non dovevi sfidarti :angel:

:mano:

ri
12-05-2004, 19:28
ma che sfida e sfida ^^'

solo penso di avere un attimino più esperienza di programmazione c++ di te e quindi ti ho postato un semplice esempio "pulito" di come fare quello che volevi fare... e sicuramente ci sono metodi molto migliori del mio

cavay
22-05-2004, 19:11
Originariamente inviato da kk3z
è possibile fare un char+int, cioè una stringa di testo con una variabile alla fine, che può essere un numero? ad es ciao1, ciao2, ciao3 ecc?

grazie :)

Se nn ho capito male devi formattare una stringa C (ossia char*) in modo tale che ci sia una parte costante (sequenz di caratteri) a cui devi concatenare un intero?

allora la soluzione + semplice e immediata è la sprintf!

es.
scusa ma farò le quadre con le angolari(<>)

.....
char str<10>;
int INTERO =5;

str = "Num:";
sprintf(str,"%d",5);
str<strlen(str)>='\0';
...............

cmq....basta che ti leggi un attimino la sprintf

ri
22-05-2004, 20:03
i vari sprintf e company è meglio usarli il meno possibile, sono una fonte inesauribile di bug...
e poi se si lavora in C++ non ce n'è bisogno :)

fpucci
22-05-2004, 21:31
Originariamente inviato da ri
i vari sprintf e company è meglio usarli il meno possibile, sono una fonte inesauribile di bug...


E chi lo ha mai detto?
Forse chi non sa programmare in C... ;)

fpucci
22-05-2004, 21:33
Originariamente inviato da cavay
.....
char str<10>;
int INTERO =5;

str = "Num:";
sprintf(str,"%d",5);
str<strlen(str)>='\0';
...............


Le assegnazioni in C non si fanno mai così:

str = "Num:";


ma sempe e solo

strcpy (str, "Num:");

o utilizzando le funzioni similari alla strcpy():

ri
22-05-2004, 22:04
Originariamente inviato da fpucci
E chi lo ha mai detto?
Forse chi non sa programmare in C... ;)


non è una questione di saper programmare in C o meno
su software di una certa consistenza (quindi non 30 righe di codice...) e con pressioni lavorative, se devi ad esempio cambiare il tipo di una variabile e questa variabile è usata in un sprintf, stai tranquillo che il programma ti si schianta
ok, lo trovi subito il punto, però perchè rischiare...
poi c'è il problema di dimensionare correttamente il buffer, etc etc
insomma, se uno non è strettamente legato al C, trovo che sia _oltremodo_ consigliabile ricorrere al C++

fpucci
22-05-2004, 23:42
Originariamente inviato da ri
non è una questione di saper programmare in C o meno
su software di una certa consistenza (quindi non 30 righe di codice...) e con pressioni lavorative, se devi ad esempio cambiare il tipo di una variabile e questa variabile è usata in un sprintf, stai tranquillo che il programma ti si schianta
ok, lo trovi subito il punto, però perchè rischiare...
poi c'è il problema di dimensionare correttamente il buffer, etc etc
insomma, se uno non è strettamente legato al C, trovo che sia _oltremodo_ consigliabile ricorrere al C++

Non sempre è consigliabile ricorrere al C++ se non serve la programmazione OO.

Il C fa egregiamente il suo lavoro, ma richiede moolta, molta attenzione nella stesura dei programmi. Molta più attenzione che in altri linguaggi.
Nell'esempio da te fatto, se tu cambi il tipo di una variabile è poi anche tua cura verificare che tutto sia coerente.
Ed ovviamente che i buffer siano dimensionati correttamente se non sovradimensionati.
Basta solo applicare semplici regole di sana e buona programmazione.
Il C non è per gli arruffoni e gli improvvisatori, ma richiede più pianificazione che in certi altri linguaggi.

ri
23-05-2004, 09:00
probabilmente il mio problema è che purtroppo mi trovo più spesso a dover correggere software altrui che scriverne di nuovo per mio conto...
non so se ti è mai capitato, ma ti assicuro che fino ad oggi non mi è mai capitato un listato con dei nomi di variabile facilmente identificabili, con un uso corretto dei buffer e tutte quelle piccole cosine che fanno la felicità di chi deve debuggare..
per questo consiglio sempre di usare gli oggetti C++, che sono "a prova di stupido"

e comunque non vedo la necessità di usare il C in un programma C++ se ci sono degli oggetti equivalenti (secondo me migliori) per fare lo stesso lavoro

Mixmar
23-05-2004, 17:42
ri, sarei interessato a conoscere la tuo opinione di "esperto" sui nomi di variabili facilmente identificabili... tu come giudichi lo "standard Microsoft" sui nomi (quello degli esempi dell'MSDN, per capirci)? Tipo: nome classe maiuscolo, istanza tipo m_nomeclasse, e altre amenità del genere...

Devo dire di trovarlo abbastanza scomodo... :eheh:

Ma stiamo andando palesemente OT... :ops2:

/\/\@®¢Ø
23-05-2004, 18:44
Originariamente inviato da fpucci
Non sempre è consigliabile ricorrere al C++ se non serve la programmazione OO.
Il C fa egregiamente il suo lavoro, ma richiede moolta, molta attenzione nella stesura dei programmi. Molta più attenzione che in altri linguaggi.
Nell'esempio da te fatto, se tu cambi il tipo di una variabile è poi anche tua cura verificare che tutto sia coerente.
Ed ovviamente che i buffer siano dimensionati correttamente se non sovradimensionati.

Il C richiede piu' attenzione perche' e piu' semplice e limitato. Se posso delegare al compilatore (o alle librerie) il compito di controllare i tipi, dimensionare i buffer e ripulire la memoria, compiti tipicamente noiosi e per questo fonte di errore (soprattuto se uno ci lavora sopra diverse ore al giorno) perche' perdere tempo a farsele da se ?


Basta solo applicare semplici regole di sana e buona programmazione.

L'errore e la distrazione sono sempre in agguato, anche nel piu' accorto del programmatore. Personalmente preferisco dedicare il mio tempo e la mia attenzione al programma in generale che ai dettagli insignificanti.

Il C non è per gli arruffoni e gli improvvisatori, ma richiede più pianificazione che in certi altri linguaggi.
Direi di no... semmai richiede piu' cura in fase di implementazione, che non e' la stessa cosa.

ri
23-05-2004, 19:31
Originariamente inviato da Mixmar
ri, sarei interessato a conoscere la tuo opinione di "esperto" sui nomi di variabili facilmente identificabili... tu come giudichi lo "standard Microsoft" sui nomi (quello degli esempi dell'MSDN, per capirci)? Tipo: nome classe maiuscolo, istanza tipo m_nomeclasse, e altre amenità del genere...

Devo dire di trovarlo abbastanza scomodo... :eheh:

Ma stiamo andando palesemente OT... :ops2:

oddio esperto :asd:

dunque... lo standard microsoft non piace granchè neanche a me, ma è più una questione "politica" che altro, non ha nulla di male di per se

non ho il link che ho a lavoro, ma questo (http://www.doc.ic.ac.uk/lab/cplus/c++.rules/) mi pare fatto molto bene (e segue quello che seguo io mi pare)

cavay
29-05-2004, 18:36
Originariamente inviato da fpucci
Le assegnazioni in C non si fanno mai così:

str = "Num:";


ma sempe e solo

strcpy (str, "Num:");

o utilizzando le funzioni similari alla strcpy():

A parte che era un piccolo es, sivoeva mettere in evidenza la sprintf e nient'altro.
circa chi sconsiglia l'utilizzo della sprintf....lasciatevi pregare...la sprintf è una primitiva del ling C che nn presentga alcun baco, e se usata risolve molti problemi di questo tipo rendendo il codice legg. Ovviamente sono pareri ma...

cionci
29-05-2004, 18:57
Insomma la sprintf se non bacata, almeno è stata progettata male ;) Sai quanti buffer overflow :)

cavay
29-05-2004, 19:07
Originariamente inviato da cionci
Insomma la sprintf se non bacata, almeno è stata progettata male ;) Sai quanti buffer overflow :)

Se si fa un po' di attenzione....nn succede.
Il trattamento di buffer(char*) e tutte le operazioni su di essi vanno fatti con cautela ma....in molti casi ti permettono di avere prestazioni alte.