Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DJI Mic Mini 2: audio 48 kHz / 24-bit e protocollo OsmoAudio sotto i 100 Euro
DJI Mic Mini 2: audio 48 kHz / 24-bit e protocollo OsmoAudio sotto i 100 Euro
DJI presenta Mic Mini 2, un sistema microfonico wireless ultra-compatto progettato per democratizzare l'audio di alta qualità nella fascia entry-level. Con un peso di soli 11 grammi per il trasmettitore elimina i fastidi tipici dei modelli più pesanti sui vestiti. Nonostante la miniaturizzazione Mic Mini 2 offre prestazioni tecniche di rilievo: registrazione omnidirezionale a 48 kHz/24-bit, tre preset vocali (Regular, Bright, Rich) e un sistema di cancellazione attiva del rumore a due livelli.
Recensione Moto G77: display AMOLED e buona autonomia per il midrange economico
Recensione Moto G77: display AMOLED e buona autonomia per il midrange economico
Motorola propone in fascia media il nuovo Moto G77 5G, uno smartphone che punta sul display AMOLED da 1.5K a 120Hz, e sulla fotocamera da 108 MP con stabilizzazione ottica per affrontare la fascia media. Il tutto insieme a una batteria da 5200mAh in soli 7,3 millimetri di spessore, con una scocca certificata con standard militari
DJI Lito 1 e Lito X1 recensione: i nuovi droni per principianti che non si fanno mancare nulla
DJI Lito 1 e Lito X1 recensione: i nuovi droni per principianti che non si fanno mancare nulla
DJI ha appena ufficializzato la serie Lito, la sua nuova gamma di droni entry-level destinata a chi si avvicina per la prima volta alla fotografia aerea. Al centro dell'annuncio ci sono due modelli ben distinti per fascia di prezzo e specifiche tecniche: DJI Lito 1 e DJI Lito X1. Entrambi si collocano sotto la soglia regolamentare dei 249 grammi, che permette di volare con requisiti burocratici più semplici rispetto ai droni più pesanti.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-04-2004, 18:09   #1
lucas72
Senior Member
 
L'Avatar di lucas72
 
Iscritto dal: Aug 2002
Messaggi: 3993
[C++]elementi uguali in una string

Ciao!!

Se ho una string con questi nomi:
pino, andrea, peppe, luca, andrea, vito, peppe, pino, peppe.

quale potrebbe essere la funzione che ricerca i nomi
nell'array e mi restituisce

ci sono numero 2: pino
ci sono numero 2: andrea
ci sono numero 3: peppe

ecc ecc

esiste anche una funzione che possa ordinarli (tutti gli elementi) e visualizzarli in ordine alfabetico?
quale?
grazie
lucas72 è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2004, 19:36   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Codice:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>


using namespace std;

int main()
{
	string str;
	
	char buf[4096];
	cin.getline(buf, 4096); //leggo una riga dallo stdin
	str = buf;

	int start = 0, end = -1;
	vector <string> v;
	while(1)
	{
		start = str.find_first_not_of(' ', end+1); //tolgo gli spazi
		end = str.find_first_of(',', start); //trovo la virgola
		if(end == string::npos) //fine della stringa raggiunto
		{
			v.push_back(str.substr(start, string::npos)); //aggiungo l'ultimo
			break;
		}
		v.push_back(str.substr(start, end-start)); //aggiungo un elemento
	}

	sort(v.begin(), v.end()); //ordino il vettore

	//ed ora contiamo
	int num = 1;

	for(int i=1; i<v.size(); ++i)
	{
		if(!v[i].compare(v[i-1])) //è uguale al precedente ?
			num++; 
		else //se è diverso
		{
			cout << num << " " << v[i-1] << endl;
			num = 1; 
		}
	}
	cout << num << " " << v[i-1] << endl;

	return 0;
}
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2004, 21:37   #3
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Re: [C++]elementi uguali in una string

Quote:
Originariamente inviato da lucas72
Ciao!!

Se ho una string con questi nomi:
pino, andrea, peppe, luca, andrea, vito, peppe, pino, peppe.

quale potrebbe essere la funzione che ricerca i nomi
nell'array e mi restituisce

ci sono numero 2: pino
ci sono numero 2: andrea
ci sono numero 3: peppe

ecc ecc
I nomi si trovano in una stringa unica oppure in un array di stringhe ? Nel secondo caso il seguente codice potrebbe fare al caso tuo:

Codice:
#include <map>
using namespace std;
map<string,int> count;

for ( int i=0 ; i< size ; ++i )
  count[ array[i] ] ++;

for ( map<string,int>::const_iterator i=count.begin() ; i != count.end() ; ++i )
{
  cout << "ci sono numero " << i->second << ": " << i->first << endl;
}


Quote:
esiste anche una funzione che possa ordinarli (tutti gli elementi) e visualizzarli in ordine alfabetico?
quale?
grazie
Vuoi ordinato l'array o l'elenco con il numero di occorrenze ?
nel primo caso puoi fare
Codice:
#include <algorithm>
std::sort( array , array+size);
per ordinare l'array in loco.
Se ti interessa invece ordinare l'uscita delle occorrenze con la map sei a post perche' di default le stringhe vengono ordinate alfabeticamente. Nel caso improbabile che cio' non avvenga puoi copiarle temporaneamente in un vettore e fare l'output da li':
Codice:
#include <vector>
using namespace std;
...

vector< pair<string,int> > tmp( count.begin() , count.end() );
sort( tmp.begin() , tmp.end() );

for( unsigned int i=0 ; i<tmp.size() ; ++i )
{
  cout << "ci sono numero " << tmp[i].second << ": " << tmp[i].first << endl;
 }
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2004, 21:42   #4
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Se invece i nomi effettivamente li hai in una stirng unica puoi fare cosi' per la conta:
Codice:
#include <sstream>
#include <map>
#include <string>

using namespace std;

string nomi = ...
map<string,int> count;

istringstream in(nomi);
string buf;
while( in >> buf )
{
  count[ buf ] ++;
}
Il resto resta come mostrato prima

P.S.: cionci, ma una volta il tag [ code ] mi sembra ignorasse qualunque tag al suo interno o sbaglio ?
Ora non piu'... sai se si puo' fare qualcosa ?
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 20-04-2004, 01:54   #5
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Azz...non avevo pensato ad usare stringstream...che deficiente che sono...anche l'idea del map è forte !!!

Probabilmente li ignorava in phpBB
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 20-04-2004, 19:43   #6
lucas72
Senior Member
 
L'Avatar di lucas72
 
Iscritto dal: Aug 2002
Messaggi: 3993
ok vi faccio sapere
grazie!!!!
lucas72 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2004, 10:27   #7
lucas72
Senior Member
 
L'Avatar di lucas72
 
Iscritto dal: Aug 2002
Messaggi: 3993
..allora
intendevo dire che devo inserire i nomi in un array e al posto del char[]
usare string (scusate è colpa mia, pasticcio ancora con le terminologie del linguaggio)
ad esempio per farmi capire ho questa funzione che acquisisce i nomi:

....
void leggifam(string *famiglie,int numelementi)
{
for (int riga = 0; riga < numelementi; riga++)
{
cout << "Inserisci il nome #" << riga+1 << " ";
cin.getline(responso,256);
famiglie[riga] = responso;
}
}


e devo poi ricercare gli identici come spiegato sopra (quindi parliamo di un array di stringhe. giusto
o mi sbaglio?)

nel codice di Cionci si parla di virgola, quindi se ho capito bene si riferisce
a nomi inseriti nello stesso array separati da una virgola.
Non è poprio quello che volevo (ripeto: per colpa mia!!!!) ma mi interessa comunque;
a proposito la penultima parentesi (quella del ciclo for) deve essere messa dopo
l'ultimo cout.

Scusami Marco, forse hai centrato il problema, ma io (essendo ancora mooooolto ingnorante in materia)
non riesco a mettere adeguatamente insieme le parti di codice da te postate
(ricevendo sempre messaggi di errore dal compilatore). Potresti, gentilmente,
postarmi il codice (adesso penso che tu abbia capito la mia esigenza di cui sopra:
ricerca>conteggio>ordinamento alfab. e visualizzazione ovviamente) completo comprensivo del main
magari anche un po' commentato.


Grazie e ciao
lucas72 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2004, 11:31   #8
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da lucas72
a proposito la penultima parentesi (quella del ciclo for) deve essere messa dopo
l'ultimo cout.
No..guarda meglio, va bene lì...

Come ti ha detto /\/\@®¢Ø, la struttura + adatta da utilizzare è un map:
Codice:
void leggifam(map<string,int> &famiglie, int numelementi) 
{ 
   for (int riga = 0; riga < numelementi; riga++) 
   { 
      cout << "Inserisci il nome #" << riga+1 << " "; 
      cin.getline(responso,256); 
      famiglie[string(responso)]++;
   } 
}
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2004, 11:54   #9
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Ecco una possibile implementazione:

Codice:
#include <iostream>
#include <vector>
#include <map>
#include <string>

using namespace std;


void leggifam(string *famiglie,int numelementi)
{
    string responso;
    for (int riga = 0; riga < numelementi; riga++)
    {
	cout << "Inserisci il nome #" << riga+1 << " ";
        // usando una getline con le string evitiamo il rischio di sforare l'array di caratteri
	getline( cin , responso);
	famiglie[riga] = responso;
    }
}




int main()
{
    int numelementi;
    cout << "Inserisci il numero di elementi " << endl;
    cin >> numelementi;
    string s;
    // Questo serve solo per "finire" la riga
    getline( cin , s );

    // Leggi le famiglie
    string* famiglie = new string[numelementi];
    leggifam( famiglie , numelementi );

    // Conta le occorrenze di ogni nome.
    // Questo sfrutta il fatto che se un nome non e' ancora presente nella mappa
    // allora gli viene associato il valore di default degli interi (0)
    map<string,int> count;
    for ( int i=0 ; i<numelementi ; ++i )
    {
	count[ famiglie[i] ]++;
    }

    // La mappa tiene le chiavi ordinate. Visto che di default l'ordine e' quello alfabetico 
    // non abbiamo alcun bisogno di ordinare a mano i nomi.
    // Le informazioni vengono memorizate in coppie <chiave,valore> con l'uso della 
    // struttura pair<string,int> . Di conseguenza possiamo accedere alla chiave (il nome)
    // dall'iteratore con i->first e al valore (le occorrenze) con i->second
    cout << "Ci sono:" << endl;
    for ( map<string,int>::const_iterator i=count.begin() ; i != count.end() ; ++i )
    {
	cout << i->second << ' ' << i->first << endl;
    }
}
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2004, 19:42   #10
lucas72
Senior Member
 
L'Avatar di lucas72
 
Iscritto dal: Aug 2002
Messaggi: 3993
Quote:
Originariamente inviato da cionci
No..guarda meglio, va bene lì...

Come ti ha detto /\/\@®¢Ø, la struttura + adatta da utilizzare è un map:
scusami cionci, io ripeto non ne capisco niente, ma se metto la graffa
li invece che dopo il cout il codice semplicemente non si compila.
Anche se poi il programma non fa esattamente quello che mi aspetto
forse dovuto a questo boh?
es:

ciccio, andrea, ciccio, andrea, peppe
2 andrea

qual'è il problema?
grazie
lucas72 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2004, 19:48   #11
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Non so cosa dirti...a me funziona benissimo...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2004, 18:17   #12
lucas72
Senior Member
 
L'Avatar di lucas72
 
Iscritto dal: Aug 2002
Messaggi: 3993
Grande Marco, mi serviva proprio una cosa del genere!!

Un ultima cosa sul tuo codice completo:
per visualizzare solo i nomi che compaiono piu di una volta(o 2, 3 ecc)
ho aggiunto:

cout << "Ci sono:" << endl;

for ( map<string,int>::const_iterator i=count.begin() ; i != count.end() ; ++i )
{
if((i->second)>1){
cout << i->second << ' ' << i->first << endl;
}
}

ma non so come eliminare il "ci sono" se la condizione non è soddisfatta
(voglio dire: non voglio che compaia il "ci sono" quando ad esempio c'è una sola occorrenza per nome)
cosa devo aggiungere?

Sto cercando di far funzionare anche il codice di Cionci,
(per il momento uso la versione di marco per i nomi inseriti in una sola stringa)
altrettanto interessante, ma il mio Dev mi segnala sempre un errore
in quets riga:

cout << num << " " << v[i-1] << endl;

di tipo "name"
in dettaglio nel log:

stringa.cpp:46: name
lookup of `i' changed for new ISO `for' scoping

problema di include?? Boh??


..poi avete parlato in merito all'uso delle stringhe di: vector, map,
istringstream e funzioni tipo i=count.begin(), di i->second ecc
Io ho un libro sul c++ (base) ma di tutte queste cose non ne parla
e, a quanto pare sembrano necessarie per gestire le stringhe senza
diventare matti e incominciare a fare sul serio con il c++.
Per il momento non voglio comprare un altro libro (sono al verde!!), potete consigliarmi
dei siti (possibilmente in italiano) che spiegano queste cose in maniera
accessibile per un neofita?

grazie ancora
lucas72 è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2004, 08:55   #13
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Quote:
Originariamente inviato da lucas72
Grande Marco, mi serviva proprio una cosa del genere!!

Un ultima cosa sul tuo codice completo:
per visualizzare solo i nomi che compaiono piu di una volta(o 2, 3 ecc)
ho aggiunto:

cout << "Ci sono:" << endl;

for ( map<string,int>::const_iterator i=count.begin() ; i != count.end() ; ++i )
{
if((i->second)>1){
cout << i->second << ' ' << i->first << endl;
}
}
Una cosa che puoi fare e' prima contare le occorrenze multiple e poi vedere quante sono:
Codice:
// dichiarata prima dell'altra funzione
bool mult( const pair<string,int>& x )
{  return x.second > 1 ; }

...
  // Prima leggi la mappa...
  // Ora teniamoci le occorrenze multiple
  int n = count_if( count.begin() , count.end() , &mult );
  
  if ( n == 1 )
  { cout << "C'e'" << /* come hai gia' fatto */
  else
  {
     cout << "ci sono" << /* come hai gia' fatto */
  }
...
count_if prende come parametri l'inizio e la fine di un contenitore e conta quante volte il predicato (nel nostro caso rappresentato dalla funzione mult) e' vero.


Quote:
..poi avete parlato in merito all'uso delle stringhe di: vector, map,
istringstream e funzioni tipo i=count.begin(), di i->second ecc
Io ho un libro sul c++ (base) ma di tutte queste cose non ne parla
e, a quanto pare sembrano necessarie per gestire le stringhe senza
diventare matti e incominciare a fare sul serio con il c++.
Per il momento non voglio comprare un altro libro (sono al verde!!), potete consigliarmi
dei siti (possibilmente in italiano) che spiegano queste cose in maniera
accessibile per un neofita?
Francamente di testi gratuiti non ne conosco , in caso di emergenza puoi sempre ricorrere ad emule
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2004, 09:13   #14
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Thinking in C++ di Bruce Eckel...cercalo su intenet...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 23-04-2004, 18:13   #15
lucas72
Senior Member
 
L'Avatar di lucas72
 
Iscritto dal: Aug 2002
Messaggi: 3993
un' ultima cosa per concludere l'argomento.
ecco due pezzi di codice
il primo:
Codice:
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
int main()
{
   const int QUANTISONO = 10;
         int rilev = 0;
         char responso[256];
         string nomi[QUANTISONO];

   for (int riga = 0; riga < QUANTISONO; riga++)
   {
      cout << "Inserisci il nome #" << riga+1 << " ";
      cin.getline(responso,256);
      if(cin.eof()) break;
      nomi[riga] = responso;
      rilev++;     
   }
   cout << endl << "I "<<rilev<<" nomi che hai inserito sono: " << endl;
   for (int riga = 0; riga < QUANTISONO; riga++)
   {
      cout << nomi[riga] << endl;
   }
     
   map<string,int> count;
    for ( int i=0 ; i<rilev ; ++i )
    {
	count[ nomi[i] ]++;
    }    
    cout << "Ci sono nei "<<rilev<<" nomi inseriti:" << endl;
    
    for ( map<string,int>::const_iterator i=count.begin() ; i != count.end() ; ++i )
    {
    if((i->second)>1){
	cout << i->second << ' ' << i->first << endl;
      }
    }
    cout<<endl;
   system ("PAUSE");
   return 0;
}
per interrompere il ciclo ho usato la funzione
if(cin.eof()) break; (sul miol sistema si deve inserire Ctrl+z)
vorrei che il ciclo possa essere interrotto anche con il semplice invio
(cioè quando a un tot numero non si vuole inserire più nomi e si da l'invio)
come si fa?

secondo codice:

Codice:
#include <iostream>
#include <stdlib.h>
#include <sstream>
#include <map>
#include <iomanip>
#include <string>
using namespace std;
typedef string::const_iterator It;
int count_words( const string& s )
{
  int count,i=0;
  while ( true )
  {
    while( i < s.size() && s[i]==' ')
      ++i;
    if ( i == s.size() ) break;
    while( i < s.size() && s[i] != ' ')
      ++i;
    count++;
  }
  return count;
}
int main()
{
string nomi;
cout<<"Inserisci i nomi da conteggiare separati da uno spazio:"<<endl<<endl;
getline( cin , nomi );

map<string,int> count;

istringstream in(nomi);
string buf;
while( in >> buf )
{
  count[ buf ] ++;
}
cout<<"parole: "<<count_words(nomi);
cout << endl;
cout << "ci sono numero: "<<endl;
for ( map<string,int>::const_iterator i=count.begin() ; i != count.end() ; ++i )
{
cout<< setw(16)  << i->second << ": " << i->first << endl;
}
cout<<endl;
system ("PAUSE");
return 0;
}
qui per inserire i nomi uso l'altro metodo: quello dell'unica stringa
e per fare il conteggio totale delle parole (nomi)utilizzo una funzione che mi fu suggerita,
se ricordo bene, sempre da marco). Ma c'è qualcosa che non va (il numero totale dei nomi)
in console ecco il risultato:

Inserisci i nomi da conteggiare separati da uno spazio:

ciccio pino ciccio pino andrea
numero nomi: 2293341
ci sono numero:
1: andrea
2: ciccio
2: pino


qual'è il problema?
esiste un metodo migliore per fare il conteggio totale che mi sfugge?
lucas72 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


DJI Mic Mini 2: audio 48 kHz / 24-bit e protocollo OsmoAudio sotto i 100 Euro DJI Mic Mini 2: audio 48 kHz / 24-bit e protocol...
Recensione Moto G77: display AMOLED e buona autonomia per il midrange economico Recensione Moto G77: display AMOLED e buona auto...
DJI Lito 1 e Lito X1 recensione: i nuovi droni per principianti che non si fanno mancare nulla DJI Lito 1 e Lito X1 recensione: i nuovi droni p...
Sony World Photography Awards 2026: i premiati, anche italiani, il punto sulla fotografia di oggi Sony World Photography Awards 2026: i premiati, ...
Una settimana con Hyundai Ioniq 5 N-Line: diverte e convince Una settimana con Hyundai Ioniq 5 N-Line: divert...
Lenovo, le mani sul BIOS per il controll...
DJI Osmo Action 4 a 189€: la action cam ...
MAN eTGX da 480 kWh diventa un power ban...
OpenAI ha speso troppo e non incassa qua...
G435 LIGHTSPEED a 35€ su Amazon: Logitec...
DMA, la Commissione UE chiede a Google d...
3 delle 7 offerte migliori di Amazon son...
Microsoft e OpenAI rinegoziano l'accordo...
Logitech G512 X: la tastiera gaming con ...
Caricabatterie universale UE: scatta l'o...
ECOVACS DEEBOT T50 PRO OMNI Gen2 a soli ...
ASUS TUF da 23,8'' a soli 99€ su Amazon:...
Steam Deck 2 è in lavorazione: Va...
AI su Ubuntu: quello che sta arrivando p...
Il Termostato WiFi Meross Matter a soli ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:06.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v