Pagina 1 di 2

[RISOLTO]programmazione c++ array di caratteri

Inviato: lunedì 18 maggio 2015, 17:46
da vfabrisv94
Salve a tutti, essendo ancora un principiante ho dei problemi con le stringhe. Il testo di un programma mi chiede di restituire il numero di occorrenze di un carattere in una parola. Potreste dirmi come si fa ?

io avevo pensato di usare la funzione strlen. Ecco come avevo pensato :

Codice: Seleziona tutto

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int main(){

	char s[80];
	char c[80];
	
	cout << "Immetti la stringa : ";
	gets(s);
	cout << endl;
	
	cout << "Quale carattere vorresti cercare ?"<<endl;
	gets(c);
	cout << endl;
	
	int carattere;
	
	for(int i=strlen(s); i>=0; i++) 
	{
		if(s[i]=c[i])
		{
			carattere++;
		}
	}

}


Potreste aiutarmi voi ? :cry: :cry: :cry:

Re: Aiuto programmazione c++ stringhe

Inviato: lunedì 18 maggio 2015, 18:03
da carved top
I listati di codice, come anche gli output del terminale, vanno racchiusi nel tag codice: clicca il tasto modifica, seleziona il testo e premi il tasto "codice" :ciao:

EDIT: inoltre, come da regolamento, titoli generici o contenenti "aiuto" andrebbero evitati

Re: programmazione c++ stringhe

Inviato: lunedì 18 maggio 2015, 18:21
da vaeVictis
Ciao :)
Una domanda "preambolica". Quelle che stai usando non sono "stringhe" ma array di caratteri.
Faccio questa precisazione perché stai usando il C++ e, programmando usando le potenzialità di questo linguaggio (leggi pure la libreria standard), per fare quello che stai cercando di fare si imposta la soluzione in modo diverso.
Il tuo codice, a occhio, sembra un ibrido tra il C e il C++.

Pertanto la risposta alla domanda sul "come fare", dipende molto da come tu vuoi impostare le cose.
C++ "puro"? O un ibrido?

Fai chiarezza su questo punto e poi ti "aiuto" :)
:ciao:

Re: programmazione c++ array di caratteri

Inviato: lunedì 18 maggio 2015, 18:27
da vfabrisv94
preferirei il c++ "puro"

Re: programmazione c++ array di caratteri

Inviato: martedì 19 maggio 2015, 15:09
da vfabrisv94
Nessuno saprebbe aiutarmi ?

Re: programmazione c++ array di caratteri

Inviato: martedì 19 maggio 2015, 15:44
da minomic
Ciao,

questo può essere un esempio di codice corretto. Osserva bene le differenze, perché c'erano alcuni errori.

Codice: Seleziona tutto

#include <iostream>
#include <string>

using namespace std;

int main()
{

     string s;
     char c;

     cout << "Immetti la stringa : ";
     getline(cin, s);
     cout << endl;

     cout << "Quale carattere vorresti cercare? " << endl;
     cin >> c;
     cout << endl;

     int carattere = 0;

     for(unsigned int i = 0; i < s.size(); i++) {
          if(s[i] == c) {
               carattere++;
          }
     }

     cout << "Numero di occorrenze: " << carattere << endl;

     return 0;
}

Re: programmazione c++ array di caratteri

Inviato: martedì 19 maggio 2015, 15:56
da carved top
Gli up delle discussioni sono consentiti soltanto ogni 24 ore.

Re: programmazione c++ array di caratteri

Inviato: martedì 19 maggio 2015, 20:16
da vaeVictis
Allora, supponendo che il tuo obiettivo sia quello di acquisire una singola parola e poi acquisire una singolo carattere di cui contare le occorrenze all'interno della parola, un suggerimento di codice potrebbe essere questo

Codice: Seleziona tutto

#include <iostream>
#include <string>
#include <algorithm>
#include <cstdio>

using namespace std;

void inputFree() {
  while(getchar() != '\n');
}

int main() {
  string tmp;
  char toFind;
  size_t n;
  cout << "Inserisci una stringa: ";
  cin >> tmp;
  inputFree();
  cout << "Inserisci il carattere da cercare: ";
  cin >> toFind;
  inputFree();
  n = count(tmp.begin(), tmp.end(), toFind);
  cout << "Nella parola \"" << tmp << "\" sono presenti "
       << n << " occorrenze della lettera '" << toFind << "'" << endl;
  return 0;
}
Una volta compilato, un esempio di utilizzo è il seguente:

Codice: Seleziona tutto

vaevictis@vaevictis-N56VV:~/Programmazione/C++/LeggiStringa$ ./LeggiStringaConteggiaOccorrenze 
Inserisci una stringa: asdrubale
Inserisci il carattere da cercare: a
Nella parola "asdrubale" sono presenti 2 occorrenze della lettera 'a'
Per quanto riguarda il comportamento del programma: se inserisci più di una parola, le parole successive alla prima vengono ignorate; se inserisci più di un carattere, viene preso in considerazione solo il primo.
È facile modificare il programma per fargli accettare una stringa generica composta da un numero arbitrario di parole, ma mi sono attenuto alla tua richiesta.
Per quanto riguarda il conteggio delle occorrenze della lettera "toFind", come ti ho detto... se stai usando il C++ ti conviene apprendere fin da subito alcune logiche molto importanti, che sono anche alla base di una buona implementazione (dove buona si riferisce all'implementazione di codice che faccia corretto utilizzo delle funzioni della libreria).
In questo caso, basta usare il metodo "count" della libreria algorithm.
Se per caso non vuoi usare una funzione già implementata, impara fin da ora a implementare usando la logica che sta "dietro" la libreria standard.
L'iterazione su una stringa si compie usando gli iteratori, non gli indici. Nel mio codice, gli iteratori sono quelli che vedi come primi due parametri passati a count in questa istruzione

Codice: Seleziona tutto

  n = count(tmp.begin(), tmp.end(), toFind);
Te lo faccio presente perché tutta la libreria standard è "pensata" in termini di iteratori.

Detto questo, se hai bisogno ti implemento anche una funzione di conteggio "nello spirito del C++", ma non so se ti interessa o se già va bene quanto hai ricevuto in risposta.
Fai sapere, ciao.



p.s.:
Come ti è stato indicato dal moderatore, cerca cortesemente di fare up della discussione non prima delle 24 ore di assenza di risposta dalla tua ultima domanda.
Io stavo lavorando per buttarti giù questo codice, ma non ho avuto modo di inoltrare il messaggio fino ad oggi.

p.p.s:
Per quanto riguarda la funzione inputFree, onestamente non mi piace come l'ho implementata, ma ho preferito inoltrare il codice, riservandomi la possibilità di tornarci sopra in un secondo momento.

Esercizio c++ array di caratteri problema con la funzione

Inviato: mercoledì 20 maggio 2015, 10:20
da vfabrisv94
Salve a tutti, ecco il testo del programma che dovrei fare :

Siano assegnati in ingresso, da tastiera, una parola ed un carattere. Si progetti una funzione CONTA
che riceva in ingresso la parola ed il carattere e restituisca come valore di ritorno il numero di
occorrenze del carattere nella parola.
Nel main bisognerà leggere, con una opportuna funzione, la parola ed il carattere e bisognerà
stampare un opportuno messaggio per comunicare l'esito della funzione CONTA.

Praticamente sarei bloccato perchè non so usare bene i puntatori, oppure ho commesso quache errore. Vi mostro come ho fatto io.

Codice: Seleziona tutto

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;


int CONTA(char* s[80],char* c){

	int carattere;

	for(int i=0; i<strlen(*s); i++)
	{
		if(s[i]==c)
		{   carattere=0;
			carattere++;
		}
	}

	return carattere;


}

int main(){

	char s[80];
	char c;

	cout << "Immetti la stringa : ";
	gets(s);
	cout << endl;

	cout << "Quale carattere vorresti cercare ?"<<endl;
	cin>>c;
	cout << endl;


	cout << "Il carattere compare"<< CONTA<<endl;
}

Potete dirmi dove sbaglio ? Perchè a me ritorna sempre 1 :cry:
Come dovrei fare ?

Re: programmazione c++ array di caratteri

Inviato: mercoledì 20 maggio 2015, 13:14
da vfabrisv94
Grazie mille delle risposte

Re: programmazione c++ array di caratteri

Inviato: mercoledì 20 maggio 2015, 13:39
da vaeVictis
Mi riaffaccio giusto per concludere quanto rimasto aperto sulla funzione inputFree.
Io la generalizzerei così:

Codice: Seleziona tutto

void inBufferFree(istream &input) {
  while( input.get() != '\n');
}
e per chiamarla, gli passerei direttamente "cin" come parametro:

Codice: Seleziona tutto

  inBufferFree(cin);
In questo modo, non ti svuota solo lo standard input, ma un generico stream in input (dove per svuota si intende che legge e ignora tutto fino a che non trova un a capo).

Re: programmazione c++ array di caratteri

Inviato: mercoledì 20 maggio 2015, 13:40
da minomic
Se ti ritieni soddisfatto delle risposte ricevute, dovresti aggiungere [Risolto] all'inizio del titolo del primo post.

Re: Esercizio c++ array di caratteri problema con la funzion

Inviato: mercoledì 20 maggio 2015, 17:15
da Zoff
vfabrisv94 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4759796#p4759796][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Salve a tutti, ecco il testo del programma che dovrei fare :

Siano assegnati in ingresso, da tastiera, una parola ed un carattere. Si progetti una funzione CONTA
che riceva in ingresso la parola ed il carattere e restituisca come valore di ritorno il numero di
occorrenze del carattere nella parola.
Nel main bisognerà leggere, con una opportuna funzione, la parola ed il carattere e bisognerà
stampare un opportuno messaggio per comunicare l'esito della funzione CONTA.

Praticamente sarei bloccato perchè non so usare bene i puntatori, oppure ho commesso quache errore. Vi mostro come ho fatto io.

Codice: Seleziona tutto

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;


int CONTA(char* s[80],char* c){

	int carattere;

	for(int i=0; i<strlen(*s); i++)
	{
		if(s[i]==c)
		{   carattere=0;
			carattere++;
		}
	}

	return carattere;


}

int main(){

	char s[80];
	char c;

	cout << "Immetti la stringa : ";
	gets(s);
	cout << endl;

	cout << "Quale carattere vorresti cercare ?"<<endl;
	cin>>c;
	cout << endl;


	cout << "Il carattere compare"<< CONTA<<endl;
}

Potete dirmi dove sbaglio ? Perchè a me ritorna sempre 1 :cry:
Come dovrei fare ?

Così non richiami la funzione:

Codice: Seleziona tutto

cout << "Il carattere compare"<< CONTA<<endl;
Forse intendevi:

Codice: Seleziona tutto

cout << "Il carattere compare"<< CONTA(&s,&c) <<endl;
Dubito che quello sia il codice che fai girare.

Comunque se inizializzi a 0 una variabile prima di incrementarla è normale che dia sempre 1.

Codice: Seleziona tutto

      {   carattere=0;
         carattere++;
      }

Trattandosi praticamente dello stesso problema dell'altra discussione unisco.

Re: [RISOLTO]programmazione c++ array di caratteri

Inviato: mercoledì 20 maggio 2015, 17:59
da vfabrisv94
Zoff scusami ma così non riesce a compilare se aggiungo "&". come mai ?

Re: programmazione c++ array di caratteri

Inviato: mercoledì 20 maggio 2015, 18:37
da Zoff
posta codice ed errore

Re: programmazione c++ array di caratteri

Inviato: mercoledì 20 maggio 2015, 19:24
da vfabrisv94

Codice: Seleziona tutto

   #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;


    int CONTA(char* s[80],char &c){

       int carattere;

       for(int i=0; i<strlen(*s); i++)
       {
       	  carattere=0;
			 		
          if(c=*s[i])
          {   
             carattere++;
          }
       }

       return carattere;


    }

    int main(){

       char s[80];
       char c;

       cout << "Immetti la stringa : ";
       gets(s);
       cout << endl;

       cout << "Quale carattere vorresti cercare ?"<<endl;
       cin>>c;
       cout << endl;


       cout << "Il carattere compare"<< CONTA(&s,&c)<<endl;
    }

Errore :

40 52 [Error] cannot convert 'char (*)[80]' to 'char**' for argument '1' to 'int CONTA(char**, char&)'

Re: programmazione c++ array di caratteri

Inviato: mercoledì 20 maggio 2015, 19:45
da Zoff
Se non sai usare i puntatori perché usi * e &?

Usa nella definizione:

Codice: Seleziona tutto

int CONTA(char s[80], char c)
e dove lo usi:

Codice: Seleziona tutto

CONTA(s,c);
Initializza la variabile carattere PRIMA del ciclo for, e controlla che dentro l'if non ci sia un assegnamento ma una uguaglianza.

Re: programmazione c++ array di caratteri

Inviato: mercoledì 20 maggio 2015, 19:55
da vfabrisv94
Adesso da questo errore:

[Error] ld returned 1 exit status

Re: programmazione c++ array di caratteri

Inviato: mercoledì 20 maggio 2015, 19:57
da Zoff
Gli errori vanno sempre riportati interamente e va postato anche il codice che li genera.

Re: programmazione c++ array di caratteri

Inviato: mercoledì 20 maggio 2015, 20:02
da vfabrisv94

Codice: Seleziona tutto

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;


    int CONTA(char s[80],char c){

       int carattere;

       for(int i=0; i<strlen(s); i++)
       {
       	  carattere=0;
			 		
          if(c==s[i])
          {   
             carattere++;
          }
       }

       return carattere;


    }

    int main(){

       char s[80];
       char c;

       cout << "Immetti la stringa : ";
       gets(s);
       cout << endl;

       cout << "Quale carattere vorresti cercare ?"<<endl;
       cin>>c;
       cout << endl;


       cout << "Il carattere compare"<< CONTA(s,c)<<endl;
    }

Errori :

c:\program files (x86)\dev-cpp\mingw64\x86_64-w64-mingw32\bin\ld.exe cannot open output file C:\Users\squire94\Desktop\aa.exe: Permission denied
C:\Users\squire94\Desktop\collect2.exe [Error] ld returned 1 exit status