Max lungo la prima riga della matrice e ...

di il
14 risposte

Max lungo la prima riga della matrice e ...

Salve a tutti ragazzi mi stavo cimentando nello svolgere il seguente esercizio :
richieda all utente di inserire da tastiera una matrice mxn numeri interi , con n e m scelti dall utente ;
in un sottoprogramma , calcoli l elemento massimo della prima riga;
in un altro sotto programma , memorizzi in un vettore tutti gli elementi della matrice maggiori dell elemento massimo della prima riga;
visualizza a video i risultati , se esistenti
i miei dubbi sono sui sotto programmi e anche sulle varie variabili definite nelle intestazioni , ho provato a svolgere così qualcuno potrebbe dargli un occhiata? grazie in anticipo
float CalcolaMax(matrice mat,int riemp_r,int riemp_c){
float	max=mat[0][0];

	for(int j=0;j<riemp_c;j++) {
		if(max<mat[0][j]){
			max=mat[0][j];
			
			
			
		}
}
return max;
}

void creaVettore( const matrice mat , vettore vett ,int riemp_r , int riemp_c , float max, int riemp){
	
	
	for(int i=1;i<riemp_r;i++) {
		for(int j=0;j<riemp_c;j++) {
			if(max<mat[i][j])
				vett[riemp]=mat[i][j];
				riemp++;
			 }
			}
}

 void stampa_vett ( vettore vett, int riemp ){
	
	for(int i=0; i<riemp ; i++){
		
		cout<<vett[i]<<"";
	}
}

14 Risposte

  • Re: Max lungo la prima riga della matrice e ...

    In che senso "dare un'occhiata"?

    Dovresti essere più preciso sul problema che hai, dove l'hai e quali prove hai fatto.

    Il forum non è un servizio generico di correzione dei compiti ...
  • Re: Max lungo la prima riga della matrice e ...

    Allora dev in fase di compilazione mi da id error quindi non riesco a stabilire se la logica dei miei sotto programmi sono esatti .
    Ad esempio nel calcola max lungo la prima riga della matrice ragiono così: fisso la prima riga e ometto quindi il ciclo for lungo i perchè non ho bisogno di scorrere giusto? , mentre il ciclo for lungo j lo eseguo cosi scorro tutti gli elementi della prima riga .
    poi devo trovare tutti gli elementi della matrice che sono piu grandi del max della prima riga e metterli in un vettore , quindi faccio un primo for dove parto da i=1 perche la prima riga lho analizzata precedentemente e cosi facendo analizzo le righe restanti , e ciclo for lungo j completo per scorrere tutti gli elementi delle righe , ora sopratutto in questo sotto programma nell intestazione ho fatto bene a definire float max e int riemp? poi nel sottoprogramma le devo inizializzare? cioe int riemp = 0 e max mat[0][0]

    spero di essermi spiegato bene , ho scritto sto poema perchè mi piace capirci a fondo quello che faccio grazie in anticipo
  • Re: Max lungo la prima riga della matrice e ...

    Posta tutto il codice (compreso il main) in modo che sia compilabile per individuare l'errore di cui parli. Si scopre la causa e si corregge l'errore e poi valutiamo l'algoritmo.
  • Re: Max lungo la prima riga della matrice e ...

    oregon ha scritto:


    Posta tutto il codice (compreso il main) in modo che sia compilabile per individuare l'errore di cui parli. Si scopre la causa e si corregge l'errore e poi valutiamo l'algoritmo.
    Hey scusa il ritardo questo é il codice completo , l'ho diviso in tre file :
    
    lib.h
    #define M 30
    #define N 20
    typedef int matrice[N][M];
    typedef int vettore[N];
    
    float CalcolaMax(const matrice,int,int);
    
    void creaVettore( const matrice , vettore ,int  , int  , float, int);
    
    void stampa_vett ( vettore, int );
    lib.cpp

    # include <iostream>
    # include "lib.h"

    using namespace std;



    float CalcolaMax(matrice mat,int riemp_r,int riemp_c){
    float max=mat[0][0];

    for(int j=0;j<riemp_c;j++) {
    if(max<mat[0][j]){
    max=mat[0][j];



    }
    }
    return max;
    }

    void crea_vett( const matrice mat , vettore vett ,int riemp_r , int riemp_c , float max, int riemp){


    for(int i=1;i<riemp_r;i++) {
    for(int j=0;j<riemp_c;j++) {
    if(max<mat[j])
    vett[riemp]=mat[j];
    riemp++;
    }
    }
    }

    void stampa_vett ( vettore vett, int riemp ){

    for(int i=0; i<riemp ; i++){

    cout<<vett<<"";
    }
    }

    main.cpp

    # include<iostream>
    # include"lib.h"



    using namespace std;

    int main () {

    matrice mat;
    vettore vet;

    int riemp_r,riemp_c,riemp;

    float max;

    cout<<"inserire numero di righe:"<<endl;
    cin>>riemp_r;
    cout<<"inserire numero di colonne:"<<endl;
    cin>>riemp_c;

    for(int i=0;i<riemp_r;i++){
    for(int j=0;i<riemp_c;j++){
    cout<<"inserire il valore ["<<i<<"]["<<j<<"] : "<<endl;
    cin>> mat[j];
    }
    }


    cout<<"il valore max della prima riga e': "<<CalcolaMax(mat,riemp_r,riemp_c)<< endl;

    cout<<"il vettore costituito dai valori della matrice piu grandi del max della prima riga del vettore"<<endl;
    creaVettore(mat,vet,riemp_r,riemp_c,max,riemp );
    stampa_vett(vet,riemp);



    system ("PAUSE");
    return 0;


    }
  • Re: Max lungo la prima riga della matrice e ...

    Usa bene i tag CODE o non si capisce ...
  • Re: Max lungo la prima riga della matrice e ...

    Concorquoto Oregon

    Inoltre cosa ti fa pensare che ci siano al massimo N valori da mettere nel vettore finale?

    E se per esempio 'tutti' i restanti valori fossero da salvare?
    E se nessuno fosse da salvare quanti ne stamperesti?
    E perché per conservare il massimo usi un float?
  • Re: Max lungo la prima riga della matrice e ...

    Se mi permetti ti do un paio di consigli:

    non so la tua preparazione in 'C' ma questo è un esercizio che esce meglio usando puntatori invece che indici
    la ragione è semplice: se usi indici e passi matrici sei costretto, come giustamente hai fatto a definire almeno la seconda dimensione della matrice, che invece non sai, dato che deve essere data dall'utente in input

    inoltre se devi creare un vettore "prima" di saperne la dimensione sei costretto ad abbondare, con conseguente spreco di memoria
    peggio ancora se devi allocare una matrice (array bidimensionale), in quel caso devi "abbondare al quadrato", ovvero in due dimensioni

    ti consiglio quindi di creare sia il vettore di uscita che la matrice di ingresso nel main() "dopo" aver chiesto all'utente le dimensioni, usando quindi i VLA (e anche un altro piccolo trucco che però non ti dico subito, prova a pensarci)

    ricordati che comunque i vettori e le matrici sono passate alle funzione sotto forma di puntatori, quindi a te basta ricordare che i vettori sono sempre "allocati contigui" e che una matrice bidimensionale è semplicemente un "vettore di vettori"

    P.S. una matrice bidimensionale è un "vettore di vettori", non come crede qualcuno un "vettore di puntatori"; e con questo chiudo, tanto quelli sono plonkati
  • Re: Max lungo la prima riga della matrice e ...

    Ma parli di matrice allocata staticamente o dinamicamente?
  • Re: Max lungo la prima riga della matrice e ...

    In 'C' i VLA sono dinamici? O la cosa non si applica?

    In 'C++' i VLA non ci sono, quindi certamente allocazione dinamica
  • Re: Max lungo la prima riga della matrice e ...

    I VLA sono una anomalia del C e non li considero proprio.

    Quindi per quelli allocati dinamicamente non si può parlare di vettori di vettori ma di vettori di puntatori
  • Re: Max lungo la prima riga della matrice e ...

    Esiste una differenza fondamentale tra vettori di puntatori e vettori di vettori

    Differenza riportata anche da K&R


    Parlo di vettori di vettori, e basta, non ricomincerò questo discorso
  • Re: Max lungo la prima riga della matrice e ...

    Certo che sono differenti ma non vedo perché alterarsi...
    Esistono tutti e due e lui può benissimo usare anche i vettori di puntatori, nessuno glielo vieta. Tutto qui.
  • Re: Max lungo la prima riga della matrice e ...

    Non sono alterato, cosa te lo fa pensare?
    Concordo sul fatto che lo OP può usare più strade
    Mi limitavo a segnalare quella che per me è più lineare


    PS
    Anch'io, come Linus, non sono sicuro che i VLA siano stati una buona idea

    Ma ci sono e quindi non è emendabile usarli
  • Re: Max lungo la prima riga della matrice e ...

    Ma questa dicitura "vettore di vettori" (in contrapposizione a "vettore di puntatori") da cui tutto è partito, si basa su una convenzione diffusa oppure la si sta spacciando per tale?
Devi accedere o registrarti per scrivere nel forum
14 risposte