Aiuto esercizio array! c++

rdd95

Nuovo Utente
2
0
Ciao ragazzi,l'esame è alle porte e sto iniziando a fare esercizi.
Sto avendo dei problemi con questo:

Scrivere il programma che legge da tastiera 4 caratteri. Il programma deve: (a) memorizzare i 4caratteri in un vettore; (b) contare il numero di occorrenze della lettera 'a'.
Il conteggio deve avvenire in una apposita funzione che riceve come parametro il
vettore di caratteri e restituisce il numero di occorrenze della lettera in questione; (c) generare
un nuovo vettore analogo a quello precedente, ma con i caratteri memorizzati nell'ordine opposto
(es: se il primo vettore e' formato da 'b','a','z','C', il nuovo vettore e' formato da 'C','z','a','b').
L'operazione di generazione del vettore deve avvenire in una apposita funzione; (d) stampare a
video i risultati dei punti (b) e (c).
Dal momento che è il primo esercizio che faccio con gli array,sto avendo delle difficoltà.
Fino ad ora ho provato a fare fino al punto (c), ma senza risultati.
Ecco quello che ho scritto:
Codice:
#include <iostream>
using namespace std;


int conteggio (char ) ; //QUESTO È IL PROTOTIPO DELLA FUNZIONE


int main()
{
char s[4] ;
cin >> s[0] >> s[1] >> s[2] >> s[3] ;

cout << conteggio ;
}

int conteggio ( char v[] )
{
int i ;
int numero_a= 0 ;
for (i=0 ; i < 4 ;i++)

{

if (v[i]== 'a')
{
numero_a=numero_a + 1 ;
}

else if (v[i] != 'a')
{
numero_a= numero_a;

}

}
cout << numero_a ;


}
Quando vado ad eseguire il programma,qualsiasi carattere metta mi viene stampato sempre il valore 1. Qualcuno mi può aiutare??:(:inchino:
 
Ultima modifica:

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Ci sono parecchie imprecisioni...
Il prototipo differisce dalla funzione, metti char[].
Nella funzione main chiami la funzione conteggio senza parametro attuale, su cosa lavora la funzione?
Nella funzione conteggio, conti le a variando l'indice ed effettuando un test, è giusto, ma il ramo else non serve (non fa altro che assegnare a numero_a se stesso)
La funzione di conteggio non deve mandare in output il conteggio, ma ritornarlo, quindi con un "return".

In definitiva, la versione corretta:
Codice:
#include <iostream>
using namespace std;

int conteggio (char[]) ;

int main(){
    char s[4];
    cin >> s[0] >> s[1] >> s[2] >> s[3];
    cout << conteggio(s);
}

int conteggio ( char v[] ){
    int i;
    int numero_a = 0;
    for (i=0; i < 4; i++)
        if (v[i] == 'a')
            numero_a++;
    return numero_a;
}
 
Ultima modifica:

rdd95

Nuovo Utente
2
0
Grazie milleee! Sei stato chiarissimo, ho capito!! :DD:inchino:

- - - Updated - - -

Scusatemi,adesso sono passato al punto (d), ma come al solito ho fatto degli errori e non mi stampa nulla.
Dovevo creare una funzione che mi invertisse il vettore di caratteri(per esempio se digito apol mi deve restituire lopa)
Ho scritto questo:

Codice:
#include <iostream>

using namespace std;


int  conteggio (char [] , int  ) ;
char mirror ( char[] , int);






main ()
{
 const int dimensione=4 ;
char  s[dimensione] ;


cout << "PROGRAMMA CHE VERIFICA IL NUMERO DI OCCORRENZE DELLA LETTERA a NEL VETTORE" << endl << endl ;
cout << " Inserisci i 4 caratteri: " ;
cin >> s[0]>> s[1]>> s[2]>> s[3] ;
 cout <<  conteggio (s , dimensione)  ;
cout << " volte" ;

cout  << " INVERTO" ;
cout << mirror ( s , dimensione) ;
}



int conteggio (  char v[], int dimensione )
{
    int i ;
    int numero_a= 0 ;
    for (i=0 ; i < dimensione ;i++)
    {
        if (v[i]== 'a')
        {
            numero_a ++;
        }
    }
    cout << " Il carattere a e' stato digitato " ;
return numero_a ;
}


char mirror (char v[] , int dimensione)
{
 char c[dimensione] ;
  int i, m ;
 m= 3 ;
for (i=0 ; i < dimensione; i++)
{
    v[i] = c[m] ;
   m--   ;
}
return  c[dimensione] ;
}
Cosa ho sbagliato questa volta?
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Beh di base hai sbagliato che stai assegnando i vettori al contrario.
Poi però altri problemi sono relativi a come hai scritto la funzione... se crei una variabile locale alla funzione (c[]), questa viene caricata nello stack della funzione stessa e quindi deallocata al return, e potrebbe essere sovrascritta da altre variabili. Dovresti quindi creare c[] nel main e passarlo come parametro e lavori su quello.
Ci sono però altri problemi... a partire dallo stile generale, in particolare stai usando funzioni pensate per c++ come se lavorassi in c. Ci sono problemi di bound e caratteri terminatori su quei char[].
Con ordine...
quando acquisisci s con cin, lo fai carattere per carattere (indicando s[0], s[1], .... ) ma in quel modo hai due svantaggi: il primo è che sei vincolato alla dimensione che hai stabilito, infatti cin vorrà acquisire tutti e 4 i valori; il secondo è che cin non inserirà il carattere terminatore per cui successive operazioni saranno strettamente vincolate alla variabile "dimensione", ma non è molto bello considerando che molte funzioni su stringhe del C/C++ sfruttano proprio i caratteri terminatori.
Il carattere terminatore viene invece inserito se scrivi "cin >> s", ovvero se indichi l'intero vettore. Il problema qui è che cin potrà acquisire più caratteri della dimensione prefissata.

Non ho capito se sei vincolato all'uso dei vettori di char o se puoi usare le stringhe (le stringhe sarebbero molto più comode), facciamo finta che tu sia vincolato ai vettori.
La consegna dell'esercizio indica una dimensione prefissata della stringa in input, quindi faccio un array lungo dimensione+1, il vettore sarà acquisito un carattere alla volta e all'ultimo posto metterò un terminatore '\0'.
La funzione mirror avrà 3 parametri: il vettore originale, il vettore invertito e la dimensione. La funzione ritornerà un puntatore al vettore invertito, non è necessario ma secondo me è più "elegante".
Il codice, con i dovuti commenti:
Codice:
#include <iostream>
using namespace std;

int conteggio (char[]);
char* mirror (char[], char[], int);

int main(){
    int dimensione = 4;
    //vettore s ha una posizione aggiuntiva per il terminatore
    char s[dimensione+1];
    //acquisisco la stringa di lunghezza fissa
    for (int i=0; i<dimensione;i++)
        cin >> s[i];
    //aggiungo terminatore in ultima posizione
    s[dimensione] = '\0';
    //conteggio
    cout << "Trovate " << conteggio(s) << " 'a'" << endl;
    //creo vettore invertito e lo riempio nella funzione mirror
    char c[dimensione+1];
    cout << "Stringa invertita: " << mirror(s,c,dimensione) << endl;
}

int conteggio (char v[]){
    int numero_a = 0;
    //posso sfruttare il carattere terminatore per fermare la ricerca
    for (int i=0; v[i] != '\0'; i++)
        if (v[i] == 'a')
            numero_a++;
    return numero_a;
}

char* mirror(char v[], char c[], int dimensione){
    //copio i caratteri in ordine inverso usando un solo indice
    for (int i = 0; i < dimensione; i++)
        //devo mettere -1 per non copiare il terminatore e arrivare all'indice 0 di v
        c[i] = v[dimensione-i-1];
    //aggiungo terminatore
    c[dimensione] = '\0';
    return c;
}

Se posso permettermi, ho l'impressione che ti manchino un po' di basi sulla manipolazione dei vettori e soprattutto sui vettori di caratteri. Ti conviene fare un ripassone di teoria perchè purtroppo il C e il C++ sono molto "potenti" e ti permettono di fare tante cose, anche sbagliate, senza accorgertene.
 
Ultima modifica:

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili