Domanda Risolto Sottoprogramma frequenza numero inserita in una matrice c++

NeomagusPr0

Utente Electrum
3 Settembre 2012
276
18
48
115
Salve ragazzi, come da titolo avrei problemi nello svolgimento del seguente esercizio:

Seguendo i principi della programmazione strutturata e della modularità, si sviluppi un programma in C/C++ che:
 richieda all’utente di inserire da tastiera una matrice 3x3 di numeri interi;
 richieda all’utente di inserire da tastiera un numero intero;
 in un sottoprogramma, calcoli la frequenza del numero inserito nell’intera matrice;
 in un altro sottoprogramma, calcoli la frequenza del numero inserito per ciascuna riga della matrice inserita;  visualizzi a video i risultati.

Per i punti 1 e 2 non ho problemi, per il punto 3 sono riuscito ad impostare il sottoprogramma ma alcune volte non mi calcola in modo giusto la frequenza, mentre per il punto 4 non ho idea di come poterlo impostare.

C++:
#include <iostream>
#define N 10
#define M 10

using namespace std;

typedef float matrice[N][M];
void cerca_elemento (matrice, int dim_r, int dim_c, int elemento, int& quanto);


int main() {
    matrice m;
    int dim_r, dim_c, quanto;
    int elemento;
    int i,j;
    
    
    cout << "Numero di righe: ";
    cin >> dim_r;
    
    cout << "Numero di colonne: ";
    cin >> dim_c;
    
    for(int i = 0; i < dim_r; i++) {
        for(int j = 0; j < dim_c; j++) {
            
            cout << "m[" << i+1 << "][" << j+1 << "]: ";
            cin >> m[dim_r][dim_c];
        }
    }
    
     cout << "Inserisci numero da cercare ";
     cin  >> elemento;
    
    cerca_elemento (m,dim_r,dim_c,elemento,quanto);
    
        if (quanto == 0  ){
            cout << " elemento non ci sta" << endl;
            }
            else{
                
                  cout <<" Il numero "<< elemento << "è stato trovato " << quanto+1 << " volte " << endl;
            }
                  return 0;
            }
                          
                
void cerca_elemento (matrice m, int dim_r, int dim_c, int elemento, int& quanto){
    quanto=0;
    
    for(int i = 0; i < 10; i ++) {
        for(int j = 0; j < 10; j++) {
            if(elemento== m[i][j]) {
                quanto= quanto +1 ;
    }
    }
}
}

Grazie in anticipo per eventuali suggerimenti :D
 
Probabilmente è un errore di distrazione, ma hai scritto cin >> m[dim_r][dim_c]; invece di cin >> m[i][j]; e questo ovviamente non ti fa tornare i conti. Per il resto ci eri andato molto vicino, la funzione cerca_elemento è più pulita se restituisce il valore calcolato
C++:
int cerca_elemento(matrice m, int dim_r, int dim_c, int elemento){
    int quanto = 0;

    for(int i = 0; i < dim_r; i ++) // non necessariamente 10
        for(int j = 0; j < dim_c; j++) // non necessariamente 10
            if(elemento == m[i][j]) quanto++;

    return quanto;
}
poi puoi semplicemente scrivere int quanto = cerca_elemento(m, dim_r, dim_c, elemento); e stampare quanto senza sommare 1 (non è un indice).

Adesso, per ragionare sull'ultimo punto, riscriviamo la funzione che ti ho appena scritto in questo modo
C++:
void cerca_elemento(matrice m, int dim_r, int dim_c, int elemento){
    int quanto = 0;

    for(int i = 0; i < dim_r; i ++) {
        for(int j = 0; j < dim_c; j++) {
            if(elemento == m[i][j]) quanto++;
        }
    }

    cout << "Il numero "<< elemento << " è stato trovato " << quanto << " volte" << endl;
}
se vuoi contare le quante volte appare ad ogni riga devi modificarla per
  1. azzerare quanto ogni volta che inizia il conteggio per la riga attuale; e
  2. spostare la cout in modo che ci sia una stampa ad ogni riga (appena dopo aver finito il conteggio).
Inizia a sistemarlo in questo modo brutto (controllando che tutto funziona) preoccupati di come restituire questi valori in forma di array.
 
St3ve ha detto tutto, ma volevo far risaltare un dettaglio, nella funzione main hai dichiarato le seguenti variabili int i,j;, e nel ciclo for hai ri-dichiarato delle variabili col medesimo nome oscurando quest'ultime.
 
  • Mi piace
Reazioni: NeomagusPr0
Ultima modifica:
Probabilmente è un errore di distrazione, ma hai scritto cin >> m[dim_r][dim_c]; invece di cin >> m[i][j]; e questo ovviamente non ti fa tornare i conti. Per il resto ci eri andato molto vicino, la funzione cerca_elemento è più pulita se restituisce il valore calcolato
C++:
int cerca_elemento(matrice m, int dim_r, int dim_c, int elemento){
    int quanto = 0;

    for(int i = 0; i < dim_r; i ++) // non necessariamente 10
        for(int j = 0; j < dim_c; j++) // non necessariamente 10
            if(elemento == m[i][j]) quanto++;

    return quanto;
}
poi puoi semplicemente scrivere int quanto = cerca_elemento(m, dim_r, dim_c, elemento); e stampare quanto senza sommare 1 (non è un indice).

Adesso, per ragionare sull'ultimo punto, riscriviamo la funzione che ti ho appena scritto in questo modo
C++:
void cerca_elemento(matrice m, int dim_r, int dim_c, int elemento){
    int quanto = 0;

    for(int i = 0; i < dim_r; i ++) {
        for(int j = 0; j < dim_c; j++) {
            if(elemento == m[i][j]) quanto++;
        }
    }

    cout << "Il numero "<< elemento << " è stato trovato " << quanto << " volte" << endl;
}
se vuoi contare le quante volte appare ad ogni riga devi modificarla per
  1. azzerare quanto ogni volta che inizia il conteggio per la riga attuale; e
  2. spostare la cout in modo che ci sia una stampa ad ogni riga (appena dopo aver finito il conteggio).
Inizia a sistemarlo in questo modo brutto (controllando che tutto funziona) preoccupati di come restituire questi valori in forma di array.
Per il 3 punto ho risolto e funziona, tutto ok.
Per quanto riguarda il 4 punto ho provato a dichiarare un vettore e a scrivere un'altra funzione, ma penso di aver fatto un macello perchè mi escono errori di compilazione. La mia idea era di voler scrivere tutti i valori delle frequenze in un vettore come suggeritomi, ma non riesco ad andare avanti.

C++:
#include <iostream>
#define N 10
#define M 10

using namespace std;

typedef float matrice[N][M];
typedef int vettore[N];

int cerca_elemento (matrice, int dim_r, int dim_c, int elemento);
int cerca_elemento_(matrice, int dim_r, int dim_c, int elemento, vettore);


int main() {
    matrice m;
    int dim_r, dim_c;
    int elemento;
    vettore v1;
   
    cout << "Numero di righe: ";
    cin >> dim_r;
   
    cout << "Numero di colonne: ";
    cin >> dim_c;
   
    for(int i = 0; i < dim_r; i++) {
        for(int j = 0; j < dim_c; j++) {
           
            cout << "m[" << i+1 << "][" << j+1 << "]: ";
            cin >> m[i][j];
        }
    }
   
     cout << "Inserisci numero da cercare ";
     cin  >> elemento;
   
    int quanto = cerca_elemento(m, dim_r, dim_c, elemento);
   
        if (quanto == 0  ){
           
            cout << " elemento non ci sta" << endl;
            }
            else{
               
                  cout <<" Il numero "<< elemento << " e' stato trovato " << quanto << " volte " << endl;
            }  
           
    cerca_elemento_(matrice m, int dim_r, int dim_c, int elemento,vettore v1);
           
           
                  return 0;
            }
int cerca_elemento(matrice m, int dim_r, int dim_c, int elemento){ // 1° sottoprogramma
    int quanto = 0;

    for(int i = 0; i < dim_r; i ++)
        for(int j = 0; j < dim_c; j++)
            if(elemento == m[i][j]) quanto++;
   
    return quanto;
}  
       
int cerca_elemento_(matrice m, int dim_r, int dim_c, int elemento,vettore v1){ // 2° sottoprogramma
    int quanto = 0;
    for(int i = 0; i < quanto; i ++)
   
        for(int j = 0; j < quanto; j++)
            if(elemento == m[i][j]);
            v1[quanto++]=i;
           
           
            cout << "Il numero "<< elemento << "e' stato trovato "<< quanto <<"volte "<<  endl;
           
    return quanto;
}
 
Per quanto riguarda il 4 punto ho provato a dichiarare un vettore
Per questo di avevo consigliato di risolverlo per gradi: prima lo risolvi senza vettore e, dopo che ci sei riuscito, provi a mettere pure quello.

se vuoi contare le quante volte appare ad ogni riga devi modificarla per
  1. azzerare quanto ogni volta che inizia il conteggio per la riga attuale; e
  2. spostare la cout in modo che ci sia una stampa ad ogni riga (appena dopo aver finito il conteggio).
C++:
void cerca_elemento_per_riga(matrice m, int dim_r, int dim_c, int elemento) {
    // int quanto = 0; // RIMISSO

    for(int i = 0; i < dim_r; i ++) {
        // 1. azzerare quanto ogni volta che inizia il conteggio per la riga attuale
        int quanto = 0;  

        for(int j = 0; j < dim_c; j++) {
            if(elemento == m[i][j]) quanto++;
        }

        // 2. spostare la cout in modo che ci sia una stampa ad ogni riga 
        cout << "Alla riga " << i + 1 <<  " il numero "<< elemento << " è stato trovato " << quanto << " volte" << endl;
    }

    // cout << "Il numero "<< elemento << " è stato trovato " << quanto << " volte" << endl; // RIMOSSO
}
Adesso se vuoi spostare la stampa dal sottoprogramma (funzione cerca_elemento_per_riga) al programma principale (funzione main) devi sostituire la cout con l'inserimento del valore 'quanto' in posizione 'i' di un vettore che prendi come argomento (i.e., pippo[i] = quanto;).
 
  • Mi piace
Reazioni: NeomagusPr0
cout << "Alla riga " << i + 1 << " il numero "<< elemento << " è stato trovato " << quanto << " volte" << endl;
Ho provato a fare cosi, non mi da errori di compilazione ma l'ultima parte del programma non me la riporta.
Codice:
#include <iostream>
#define N 10
#define M 10

using namespace std;

typedef float matrice[N][M];
typedef int vettore[N];

int cerca_elemento (matrice, int dim_r, int dim_c, int elemento);
void cerca_elemento_(matrice, int dim_r, int dim_c, int elemento);


int main() {
    matrice m;
    int dim_r, dim_c;
    int elemento;
    vettore v1;
    int i;
    
    cout << "Numero di righe: ";
    cin >> dim_r;
    
    cout << "Numero di colonne: ";
    cin >> dim_c;
    
    for(int i = 0; i < dim_r; i++) {
        for(int j = 0; j < dim_c; j++) {
            
            cout << "m[" << i+1 << "][" << j+1 << "]: ";
            cin >> m[i][j];
        }
    }

     cout << "Inserisci numero da cercare ";
     cin  >> elemento;
    
    int quanto = cerca_elemento(m, dim_r, dim_c, elemento);
    
        if (quanto == 0  ){
                cout << " elemento non ci sta" << endl;
            }
            else{               
                  cout <<" Il numero "<< elemento << " e' stato trovato " << quanto << " volte " << endl;
            }               
void cerca_elemento_(matrice m, int dim_r, int dim_c, int elemento);
    quanto =0;
    
            for(i=0; i < dim_r; i++){
            if (v1[i]=quanto){
            quanto++;}
            
                cout << "Alla riga " << i+1 << "il numero " << elemento << "e' stato trovato"<< v1[i]+1 << "volte" <<  endl;
    }
                  return 0;
            }
int cerca_elemento(matrice m, int dim_r, int dim_c, int elemento){ // 1° sottoprogramma
    int quanto = 0;

    for(int i = 0; i < dim_r; i ++)
        for(int j = 0; j < dim_c; j++)
            if(elemento == m[i][j]) quanto++;
    
    return quanto;
}   
        
void cerca_elemento_(matrice m, int dim_r, int dim_c, int elemento){ // 2° sottoprogramma
    
    for(int i = 0; i < dim_r; i ++) {
    int quanto = 0;
        for(int j = 0; j < dim_c ; j++){
            if(elemento == m[i][j]) quanto ++;
        }
      cout << "Alla riga " << i + 1 <<  " il numero "<< elemento << " è stato trovato " << quanto << " volte" << endl;     
    }
}
 
Ho provato a fare cosi, non mi da errori di compilazione ma l'ultima parte del programma non me la riporta.
Hai provato a fare copia incolla senza accendere il cervello e, sfortunatamente, questa volta non ha funzionato.

Ti consiglio fare un passo indietro e ripartire dal primissimo codice che avevi postato, poi segui step by step i suggerimenti che ti sono stati dati (e.g., non usare vettore, almeno per ora). Con le ultime modifiche hai fatto casino, ma sono sicuro che la soluzione è decisamente alla tua portata: per il punto 1 e 2 hai detto tu stesso di non avere problemi, i punti 3 e 4 li trovi risolti nei miei messaggi precedenti e dal codice che hai postato hai già dimostrato di sapere come si scrive una funzione (sia il prototipo, che la definizione, che chiamata). Se sei incerto, riparti da zero (o quasi).
Hai semplicemente provato a risolverlo con troppa fretta e hai fatto errori dovuti a un copia incolla troppo spensierato.
 
  • Mi piace
Reazioni: NeomagusPr0
Ho provato a ragionare in quest'altro modo seguendo i tuoi consigli, ma purtroppo non riesco a pervenire ad una soluzione, ne tantomeno capire dov è che sbaglio (sicuramente penso sia qualcosa di stupido come per il punto precedente).

Codice:
#include <iostream>
#define N 10
#define M 10

using namespace std;

typedef float matrice[N][M];
typedef int vettore[N];

int cerca_elemento (matrice, int dim_r, int dim_c, int elemento);
void cerca_elemento_(matrice, int dim_r, int dim_c, int elemento,vettore);


int main() {
    matrice m;
    int dim_r, dim_c;
    int elemento;
    vettore v1;
    
    
    
    cout << "Numero di righe: ";
    cin >> dim_r;
    
    cout << "Numero di colonne: ";
    cin >> dim_c;
    
    for(int i = 0; i < dim_r; i++) {
        for(int j = 0; j < dim_c; j++) {
            
            cout << "m[" << i+1 << "][" << j+1 << "]: ";
            cin >> m[i][j];
        }
    }

     cout << "Inserisci numero da cercare ";
     cin  >> elemento;
    
    int quanto = cerca_elemento(m, dim_r, dim_c, elemento);
    
        if (quanto == 0  ){
                cout << " elemento non ci sta" << endl;
            }
            else{               
                  cout <<" Il numero "<< elemento << " e' stato trovato " << quanto << " volte " << endl;
            }
            
                            
void cerca_elemento_(matrice m, int dim_r, int dim_c, int elemento, vettore v1);
    
    int i=0;
      for (i=0; i< quanto; i++) {
          
          if(v1[i]== elemento){
          
              v1[quanto++]= i;
    }
    
    cout << "Il numero " << elemento << "è stato trovato " << v1[quanto]+1 << "volte " << endl;
    }
                  return 0;
            }
            
            
            
            
int cerca_elemento(matrice m, int dim_r, int dim_c, int elemento){ // 1° sottoprogramma
    int quanto = 0;

    for(int i = 0; i < dim_r; i ++)
        for(int j = 0; j < dim_c; j++)
            if(elemento == m[i][j]) quanto++;
    
    return quanto;
    
}   
    void cerca_elemento_(matrice m, int dim_r, int dim_c, int elemento, vettore v1) { // 2° sottoprogramma

    for(int i = 0; i < dim_r; i ++) { 
        int quanto = 0; 

        for(int j = 0; j < dim_c; j++) {
            if(elemento == m[i][j]) quanto++;
            
    }
    }
    }
 
Nel main hai ri-dichiarato la funzione cerca_elemento_ (il che non va bene):
C++:
int main() {
    //...
    void cerca_elemento_(matrice m, int dim_r, int dim_c, int elemento, vettore v1);
    //...
}
Mentre quello che volevi scrivere è:
C++:
int main() {
    //...
    cerca_elemento_(m, dim_r, dim_c, elemento, v1);
    //...
}
Poi nella sua definizione (riferendomi a cerca_elemento_) passi un vettore chiamato v1 che non viene utilizzato, infatti il codice è corretto ma hai omesso la parte in cui imposti i valori del vettore:
C++:
void cerca_elemento_(matrice m, int dim_r, int dim_c, int elemento, vettore v1)
{
    // 2° sottoprogramma
    for (int i = 0; i < dim_r; i++)
    {
        int quanto = 0;

        for (int j = 0; j < dim_c; j++)
        {
            if (elemento == m[i][j]) quanto++;
        }
        v1[i] = quanto; // <-- Questa è la parte che hai mancato
    }
}
Ora il vettore ha i valori che vuoi, quindi ti basta solo mostrarli a schermo:
C++:
int main() {
 
    //...
    cerca_elemento_(m, dim_r, dim_c, elemento, v1);

    for (int i = 0; i < dim_r; i++)
        std::cout << "L'elemento " << elemento << " e' stato trovato " << v1[i] << " volte nella riga " << (i + 1) << '\n';
    //...
}

In fine mentre mettevo mano al tuo codice ne ho scritta una versone un pò più chiara:
C++:
#include <iostream>
#define N 10
#define M 10

using namespace std;

typedef float matrice[N][M];
typedef int vettore[N];

int cerca_elemento(matrice, int dim_r, int dim_c, int elemento);
void cerca_elemento_(matrice, int dim_r, int dim_c, int elemento, vettore v1);


int main()
{
    // Dichiarazione delle variabili
    matrice m;
    int dim_r, dim_c;
    int elemento;
    vettore v1;

    // Ottieni le dimensioni della matrice
    cout << "Numero di righe: ";
    cin >> dim_r;

    cout << "Numero di colonne: ";
    cin >> dim_c;

    // Inizializza la matrice - (si ha: dim_r = y | dim_c = x)
    for (int i = 0; i < dim_r; i++)
        for (int j = 0; j < dim_c; j++)
        {
            cout << "m[" << i + 1 << "][" << j + 1 << "]: ";
            cin >> m[i][j];
        }

    // Ottieni e cerca l'elemento
    cout << "Inserisci numero da cercare ";
    cin >> elemento;
    int quanto = cerca_elemento(m, dim_r, dim_c, elemento);

    // Controlla se il numero è presente nella matrice
    if (quanto == 0)
    {
        cout << "L'elemento non e' presente" << endl;
    }
    else
    {
        cout << " Il numero " << elemento << " e' stato trovato " << quanto << " volte " << endl;

    // Inizializza il vettore v1 (range-based for loop)
    for (auto& elem : v1)
        elem = 0;

    // Cerca la presenza dell'elemento per ogni riga orizzontale della matrice
    cerca_elemento_(m, dim_r, dim_c, elemento, v1);

    // Mostra a schermo le ricorrenze
    for (int i = 0; i < dim_c; i++)
        std::cout << "l'elemento " << elemento << " e'stato trovato " << v1[i] << " volte nella riga " << (i + 1) << '\n';
    }

    return 0;
}

int cerca_elemento(matrice m, int dim_r, int dim_c, int elemento)
{
    // 1° sottoprogramma
    int quanto = 0;
    for (int i = 0; i < dim_r; i++)
        for (int j = 0; j < dim_c; j++)
            if (elemento == m[i][j]) quanto++;

    return quanto;

}

void cerca_elemento_(matrice m, int dim_r, int dim_c, int elemento, vettore v1)
{
    // 2° sottoprogramma
    for (int x = 0; x < dim_r; x++)
        for (int y = 0; y < dim_c; y++)
            if (elemento == m[x][y])
                v1[x]++;

    return;
}
 
  • Mi piace
Reazioni: NeomagusPr0
Nel tuo programma mi dà un errore nel main quando inizializzi un vettore (io uso dev c++, mi dice che non posso usare quel comando).
Ho allora provato ad inizializzare il vettore in questo modo, ma mi dice che x e y non sono dichiarati, mentre se uso i e j mi dice ;
[Error] name lookup of 'i' changed for ISO 'for' scoping [-fpermissive];
[Note] (if you use '-fpermissive' G++ will accept your code).

C++:
#include <iostream>
#define N 10
#define M 10

using namespace std;

typedef float matrice[N][M];
typedef int vettore[N];

int cerca_elemento (matrice, int dim_r, int dim_c, int elemento);
void cerca_elemento_(matrice, int dim_r, int dim_c, int elemento, vettore);


int main() {
    matrice m;
    int dim_r, dim_c;
    int elemento;
    vettore v1;
    
    
    
    
    
    cout << "Numero di righe: ";
    cin >> dim_r;
    
    cout << "Numero di colonne: ";
    cin >> dim_c;
    
    for(int i = 0; i < dim_r; i++) {
        for(int j = 0; j < dim_c; j++) {
            
            cout << "m[" << i+1 << "][" << j+1 << "]: ";
            cin >> m[i][j];
        }
    }

     cout << "Inserisci numero da cercare ";
     cin  >> elemento;
    
    int quanto = cerca_elemento(m, dim_r, dim_c, elemento);
    
        if (quanto == 0  ){
                cout << " elemento non ci sta" << endl;
            }
            else{               
                  cout <<" Il numero "<< elemento << " e' stato trovato " << quanto << " volte " << endl;
            }
            
                        
    
      for (i=0; i< dim_r; i++) {
     elemento=0;
    
     elemento= v1[i];
    
    
    
cerca_elemento_(m, dim_r, dim_c, elemento,v1);         
    
    
    cout << "Il numero " << elemento << "è stato trovato " << v1[i] << "volte " << "alla riga " << (i+1)<< endl;
    }
                  return 0;
            }
            
            
            
            
int cerca_elemento(matrice m, int dim_r, int dim_c, int elemento){ // 1° sottoprogramma
    int quanto = 0;

    for(int i = 0; i < dim_r; i ++)
        for(int j = 0; j < dim_c; j++)
            if(elemento == m[i][j]) quanto++;
    
    return quanto;
    
}   
void cerca_elemento_(matrice m, int dim_r, int dim_c, int elemento, vettore v1) { // 2° sottoprogramma

    for (int x = 0; x < dim_r; x++)
        for (int y = 0; y < dim_c; y++)
            if (elemento == m[x][y])
                v1[x]++;
    return;
    }
 
Ultima modifica:
Si, anche a me da errore perchè non hai dichiarato la variabile i che utilizzi nel ciclo for (l'ultimo presente nel main), però non hai bisogno di mettere la funzione cerca_elemento_ nel ciclo for, basta chiamarla solo una volta ed in fine esporre i valori nel vettore, ti consiglio di vedere il codice che ti ho marcato nello spoiler della risposta antecedente a questa.

Edit: dal mio IDE (Visual Studio) pare che l'errore fosse solo la dichiarazione della i
 
  • Mi piace
Reazioni: NeomagusPr0
Niente, le sto provando di tutte ma non riesco proprio a risolvere anche vedendo dal codice che mi hai postato e scrivendo tutto uguale, non ho errori di compilazione ma continuo a non riuscire a stampare quella riga....

ps: scusatemi veramente per il disturbo


C++:
#include <iostream>
#define N 10
#define M 10

using namespace std;

typedef float matrice[N][M];
typedef int vettore[N];

int cerca_elemento (matrice, int dim_r, int dim_c, int elemento);
void cerca_elemento_(matrice, int dim_r, int dim_c, int elemento, vettore);


int main() {
    matrice m;
    int dim_r, dim_c;
    int elemento;
    vettore v1;
    
    
    
    
    
    cout << "Numero di righe: ";
    cin >> dim_r;
    
    cout << "Numero di colonne: ";
    cin >> dim_c;
    
    for(int i = 0; i < dim_r; i++) {
        for(int j = 0; j < dim_c; j++) {
            
            cout << "m[" << i+1 << "][" << j+1 << "]: ";
            cin >> m[i][j];
        }
    }

     cout << "Inserisci numero da cercare ";
     cin  >> elemento;
    
    int quanto = cerca_elemento(m, dim_r, dim_c, elemento);
    
        if (quanto == 0  ){
                cout << " elemento non ci sta" << endl;
            }
            else{               
                  cout <<" Il numero "<< elemento << " e' stato trovato " << quanto << " volte " << endl;
            
            
            
cerca_elemento_(m, dim_r, dim_c, elemento, v1);

        
            for (int i = 0; i < dim_r; i++)
            
                cout << "Il numero " << elemento << "è stato trovato " << v1[i] << "volte alla riga " << (i+1);
}
                  return 0;
            }
                        
            
int cerca_elemento(matrice m, int dim_r, int dim_c, int elemento){ // 1° sottoprogramma
    int quanto = 0;

    for(int i = 0; i < dim_r; i ++)
        for(int j = 0; j < dim_c; j++)
            if(elemento == m[i][j]) quanto++;
    
    return quanto;
}   

void cerca_elemento_(matrice m, int dim_r, int dim_c, int elemento, vettore v1)
{
 
    // 2° sottoprogramma
    for (int i = 0; i < dim_r; i++)
    {
        int quanto = 0;
        
        for (int j = 0; j < dim_c; j++)
        {
            if (elemento == m[i][j]) quanto++;
        }
        v1[i] = quanto;
    }
    return;
}
 
Ultima modifica:
non riuscire a stampare quella riga....
Cosa intendi esattamente? i valori non sono quelli che ti aspettavi?

Ho preso il tuo codice, ho cambiato qualche stringa sulle funzioni cout e questo è l'output sulla console:
Codice:
Numero di righe: 3
Numero di colonne: 3
m[1][1]: 100
m[1][2]: 100
m[1][3]: 100
m[2][1]: 100
m[2][2]: 100
m[2][3]: 2
m[3][1]: 100
m[3][2]: 2
m[3][3]: 2
Inserisci numero da cercare 100
Il numero 100 e' stato trovato 6 volte
Il numero 100 e' stato trovato 3 volte alla riga 1
Il numero 100 e' stato trovato 2 volte alla riga 2
Il numero 100 e' stato trovato 1 volte alla riga 3
Mi pare che l'output rispecchi pienamente la soluzione al punto 5.
 
  • Mi piace
Reazioni: NeomagusPr0
Cosa intendi esattamente? i valori non sono quelli che ti aspettavi?

Ho preso il tuo codice, ho cambiato qualche stringa sulle funzioni cout e questo è l'output sulla console:
Codice:
Numero di righe: 3
Numero di colonne: 3
m[1][1]: 100
m[1][2]: 100
m[1][3]: 100
m[2][1]: 100
m[2][2]: 100
m[2][3]: 2
m[3][1]: 100
m[3][2]: 2
m[3][3]: 2
Inserisci numero da cercare 100
Il numero 100 e' stato trovato 6 volte
Il numero 100 e' stato trovato 3 volte alla riga 1
Il numero 100 e' stato trovato 2 volte alla riga 2
Il numero 100 e' stato trovato 1 volte alla riga 3
Mi pare che l'output rispiecchi pienamente la soluzione al punto 5.
La soluzione dell'esercizio è proprio questa, solo che l'ultima cout (cioe quella che mi dice quante volte è stato trovato l'elemento su ogni riga) non me la stampa proprio, infatti il programma si ferma a " il numero cercato è stato trovato "tot" volte".
Come hai cambiato le stringhe sulle funzioni cout ? Penso a questo punto che sia quello il problema.
 
Ultima modifica:
C++:
int main()
{
    matrice m;
    int dim_r, dim_c;
    int elemento;
    vettore v1;

    cout << "Numero di righe: ";
    cin >> dim_r;

    cout << "Numero di colonne: ";
    cin >> dim_c;

    for (int i = 0; i < dim_r; i++) {
        for (int j = 0; j < dim_c; j++) {
            cout << "m[" << i + 1 << "][" << j + 1 << "]: ";
            cin >> m[i][j];
        }
    }

    cout << "Inserisci numero da cercare ";
    cin >> elemento;

    int quanto = cerca_elemento(m, dim_r, dim_c, elemento);

    if (quanto == 0) {
        cout << " elemento non ci sta" << endl;
    }
    else {
        cout << " Il numero " << elemento << " e' stato trovato " << quanto << " volte\n";
        cerca_elemento_(m, dim_r, dim_c, elemento, v1);
        for (int i = 0; i < dim_r; i++)
            cout << "Il numero " << elemento << " e' stato trovato " << v1[i] << " volte alla riga " << (i + 1) << '\n';
    }
    return 0;
}
Ricorda che std::cout << std::endl e std::cout << '\n'; mandano a capo il puntatore passando alla riga successiva, e la lettera n anteceduta da uno \ indica una sequenza di escape, in più nelle stringhe (in questo caso perlomeno) non usare le è accentate, metti una e seguita da un apostrofo.
 
  • Mi piace
Reazioni: NeomagusPr0
C++:
int main()
{
    matrice m;
    int dim_r, dim_c;
    int elemento;
    vettore v1;

    cout << "Numero di righe: ";
    cin >> dim_r;

    cout << "Numero di colonne: ";
    cin >> dim_c;

    for (int i = 0; i < dim_r; i++) {
        for (int j = 0; j < dim_c; j++) {
            cout << "m[" << i + 1 << "][" << j + 1 << "]: ";
            cin >> m[i][j];
        }
    }

    cout << "Inserisci numero da cercare ";
    cin >> elemento;

    int quanto = cerca_elemento(m, dim_r, dim_c, elemento);

    if (quanto == 0) {
        cout << " elemento non ci sta" << endl;
    }
    else {
        cout << " Il numero " << elemento << " e' stato trovato " << quanto << " volte\n";
        cerca_elemento_(m, dim_r, dim_c, elemento, v1);
        for (int i = 0; i < dim_r; i++)
            cout << "Il numero " << elemento << " e' stato trovato " << v1[i] << " volte alla riga " << (i + 1) << '\n';
    }
    return 0;
}
Ricorda che std::cout << std::endl e std::cout << '\n'; mandano a capo il puntatore passando alla riga successiva, e la lettera n anteceduta da uno \ indica una sequenza di escape, in più nelle stringhe (in questo caso perlomeno) non usare le è accentate, metti una e seguita da un apostrofo.

Ho provato a copiare ed incollare tutta la parte del codice che mi hai postato nell'ultimo messaggio, ma purtroppo continuo ad avere lo stesso errore...il codice completo che sto usando è quello che ho postato nell'ultimo messaggio più le tue ultime modifiche, ma dell'ultima cout neanche l'ombra.

Non potrebbe essere un errore del compilatore proprio? Veramente non so più che pensare..
 
Ultima modifica:
Come ben saprai sul mio IDE funziona bene quindi non è facile individuare l'errore, nel caso tu non riesca a stamparlo forse è perchè devi flushare la stream cout con il comando std::cout.flush(); (però anche std::endl dovrebbe farlo di suo), oppure prova ad usare una stream differente come std::cerr anche se non è fatta per questo.
Del resto non ho idea di quale possa essere il problema.
 
  • Mi piace
Reazioni: NeomagusPr0
Non potrebbe essere un errore del compilatore proprio?
Sono buggati pure i compilatori, ma le probabilità che tu abbia trovato un errore così grave in un programma così semplice rasentano lo zero.

Quello che secondo me sta succedendo è che c'è un problema da qualche parte e stai eseguendo il programma vecchio. Inserisci cout << "pippo"; all'inizio del codice (dentro il main ovviamente), se quando provi ad eseguire non leggi "pippo" vuol dire che non hai compilato il file. È difficile guidarti su quali pulsanti clickare sull'interfaccia grafica del tuo IDE, quindi a questo punto fai prima a creare un nuovo progetto e ad incollarci dentro il codice.

In caso dovessero esserci ulteriori errori o se il programma non funziona come ti aspetti, ti invito a fare copia/incollare l'output che leggi per farcelo leggere (in alternativa, fai uno screenshot). In ogni caso, come ho scritto nelle FAQs, dev-cpp è un IDE un po' del cavolo e ti conviene usarne un altro.
 
Ho provato il codice su altri due compilatori diversi da due pc diversi e funziona tutto correttamente, ma su DeV non funge.

Comunque finalmente sono riuscito a risolvere questo esercizio che mi tormentava, grazie mille e scusatemi ancora per il disturbo.
 
  • Mi piace
Reazioni: DanyDollaro