C++ Felder Minimum wird in Matrix nicht gefunden

Chakky

Member of Honour
Hallo HaBo,

ich bräuchte mal hilfe bei einer Aufgabe.

Hier erstmal die Aufgabe
1. Aufgabe:
Gegeben sei eine Integermatrix 6x12 mit 6 Zeilen mit je 12 Zahlen. Implementieren Sie ein C++-Programm.
a) Einlesen der Zahlen der Matrix
b) Von den 12 Spalten soll das Minimum aller Zahlen der Spalte ermittelt werden
c) Die Elemente der Spalte, welche das Minimum enthält und das Minimum sollen in übersichtlicher Form
ausgegeben werden (linksbündige Ausgabe mit einer Breite von je 8 Zeichen).
Beispiel: 2 3 -1 5 2 1
Minimalwert: -1

Mein Code Vorschlag:
Code:
#include<iostream>
using namespace std;

int main() {

int matrix[6][12];

//einlesen
cout<<"User eingabe"<<endl;
for(int i=0;i<6;i++)
{
        for(int j=0;j<12;j++)
        {
                cout<<"Matrix["<<i<<"]["<<j<<"]"<<endl;
               
               cin>>matrix[i][j]; 
             
             // cout<< matrix[i][j];
                }
                
        
        
        }
//einlesen ende


//minimum
int min[12]; //feld anlegen fuer jedes minimum extra speichern
 min[0]=matrix[0][0]; //minimal wert gültig belegen



        for(int i=0;i<6;i++)
{
        for(int j=0;j<12;j++)
        {
               // cout<<"Matrix["<<i<<"]["<<j<<"]"<<endl;
        if (min[j] > matrix[i][j]) {
                   min[j]=matrix[i][j];
                   }
                
        
        
        }
        }
        
        int k=0;
for(int j=0;j<12;j++)
{
        //cout<<"Minimum der einzelnen spalten: min["<<j<<"]"<<endl;
       // cout<<min[j]<<endl;
        if(min[j]<min[j+1]) k=j;
        }        
        
cout<<"Das Minimum liegt in Spalte : "<<k<<endl;

//ausgabe
cout.width(8);
//cout<<"Minimum"<<endl;

for(int j=0;j<12;j++)
{
        cout.width(8);
        cout<<matrix[k][j];
        
        }
cout<<"Minimum ist:"<<min[k]<<endl;
system("PAUSE");
return 0;
}

Problem ist das er das Minimum immer in Spalte 11 vermutet aber die totalen falschen werte ausgibt :/

Kann mir jemand auf die Sprünge helfen?

Danke
 
Zuletzt bearbeitet:
Nur als Idee:
Code:
int min[12]; //feld anlegen fuer jedes minimum extra speichern
 min[0]=matrix[0][0];
was wird dann hier verglichen?
Code:
if (min[j] > matrix[i][j])
wenn j>0 ist?

und hier:
for(int j=0;j<12;j++)
{
cout<<"Minimum der einzelnen spalten: min["<<j<<"]"<<endl;
cout<<min[j]<<endl;
if(min[j]<min[j+1]) k=j;
}
wenn beim letzten Schleifendurchlauf j==11 ist (und damit auf das Ende des Arrays zeigt):
auf welchen Wert zeigt min[j+1] (also min[12]) ?

Andere Idee: Eingabe entweder bei der Initialisierung der Matrix mit Konstanten "simulieren" oder die Matrix zum testen kleiner machen ;)
 
Code:
//minimum
int min[12]; //feld anlegen fuer jedes minimum extra speichern
 min[0]=matrix[0][0]; //minimal wert gültig belegen



        for(int i=0;i<6;i++)
{
        for(int j=0;j<12;j++)
        {
               // cout<<"Matrix["<<i<<"]["<<j<<"]"<<endl;
        if (min[j] > matrix[i][j]) {
                   min[j]=matrix[i][j];
                   }
                
        
        
        }
        }

Du legst ein int-Array min an mit der Größe 12: OK.
Dann belegst du den ersten Eintrag mit einem gültigen Wert: OK.

Aber was macht dann überhaupt diese beiden for-Schleifen?
Außen nach i iterieren und innen nach j.
Der erste Durchlauf: if (min[0] > matrix[0][0])
Zweiter Durchlauf: if (min[1] > matrix[0][1])
Da wir hier bei C/C++ sind passiert bei dem zweiten Durchlauf totaler Quatsch, weil du min[1] nie vorher belegt hast, d.h. es wird jetzt einfach irgendein Wert genommen der beim letzten Mal nutzen des Speichers noch da drin steckt.

Du solltest min[1],min[2]...min[11] ebenfalls mit jeweils dem ersten Eintrag der Spalte belegen, damit hast du nur gültige Werte. Dann müsstest du außen j iterieren und innen nach i und überprüfst dann immer für min[j], ob der Wert in matrix[j] nicht kleiner ist.
Ungefähr so:
Code:
for(int j=0;j<12;j++) {
   for(int i=0;i<6;i++) {
        if (min[j] > matrix[i][j]) {
                   min[j]=matrix[i][j];
         }
    }
}

Damit hast du das Minimun jeder Spalte, wie du dann das Minimun aus diesem Minimun der Spalten herausfindest sollte jetzt nicht mehr so schwer sein ;-)
 
Zuletzt bearbeitet:
Du solltest min[1],min[2]...min[11] ebenfalls mit jeweils dem ersten Eintrag der
ok ich hab das jetzt so versucht:
Code:
int min[12]; //feld anlegen fuer jedes minimum extra speichern
for (int i=0;i<12;i++) 
{
 min[i]=matrix[0][i];
 } //minimal wert gültig belegen
damit lege ich erstmal überall ein gültigen min wert rein.

Damit hast du das Minimun jeder Spalte, wie du dann das Minimun aus diesem Minimun der Spalten herausfindest sollte jetzt nicht mehr so schwer sein ;-)

scheinbar doch :/ hab das jetzt so versucht:
Code:
int k=0;
for(int j=12;j>=0;j--)
{
        if(min[j] <min[j-1]) k=j;
}

in dem ich das feld von hinten aus vergleiche nur irgendwie scheint das auch nicht zu funktionieren :/ hab da glaube einen dicken denk fehler drinne, er meint immer wieder in der 0 :/

Hab jetzt auch mal pseudo zufalls werte eingetragen mit

Code:
 matrix[i][j] = (i*13*j)%4;




Nochmal der Komplette Code.


Danke euch!

Code:
#include<iostream>
using namespace std;

int main() {

int matrix[6][12];

//einlesen
cout<<"User eingabe"<<endl;
for(int i=0;i<6;i++)
{
        for(int j=0;j<12;j++)
        {
                cout<<"Matrix["<<i<<"]["<<j<<"]"<<endl;
               
               //cin>>matrix[i][j]; //kommentar entfernen für user eingabe
               matrix[i][j] = (i*13*j)%4;
             // cout<< matrix[i][j];
                }
                
        
        
        }
//einlesen ende


//minimum
int min[12]; //feld anlegen fuer jedes minimum extra speichern
for (int i=0;i<12;i++) 
{
 min[i]=matrix[0][i];
 } //minimal wert gültig belegen
 



for(int j=0;j<12;j++) {
   for(int i=0;i<6;i++) {
        if (min[j] > matrix[i][j]) {
                   min[j]=matrix[i][j]; //minimum jeder spalte
         }
    }
}

        
int k=0;
for(int j=12;j>=0;j--)
{
        if(min[j] <min[j-1]) k=j;
}      
        
cout<<"Das Minimum liegt in Spalte : "<<k<<endl;

//ausgabe
cout.width(8);
//cout<<"Minimum"<<endl;

for(int j=0;j<12;j++)
{
        cout.width(8);
        cout<<matrix[k][j];
        
        }
cout<<"Minimum ist:"<<min[k]<<endl;
system("PAUSE");
return 0;
}
 
Im alten Code hattest Du noch die Ausgabe
Code:
cout<<"Minimum der einzelnen spalten: min["<<j<<"]"<<endl;
sobald man min[] korrekt initialisiert hat, stimmte die Ausgabe auch.
Nur die Suche nach dem Minimum war nicht korrekt.


Der jetztige Code:
Code:
int k=0;
for(int j=12;j>=0;j--)
{
        if(min[j] <min[j-1]) k=j;
}
hat eigentlich das gleiche Problem wie der alte ;)
wohin zeigt min[j-1], wenn j=0 ist? :wink:
Edit: und min[12] gibt es auch nicht

Was spricht gegen die "klassische" Vorgehensweise?
Code:
my_super_min = min[0];
for i=0 to i<len(min):
  if my_super_min > min[i] then:
    my_super_min = min[i];

bzw:
Code:
int k=0;
for(int j=11;j>=0;j--)
{
        if(min[j] <min[k]) k=j;
}
Die Idee ist, dass Du nicht 2 Nachbarn vergleichst, sondern (da Du sowieso den Index des Arrayeintrags mit dem kleinsten Wert speicherst) diesen nutzt und immer mit dem "aktuell kleinsten" Wert Vergleiche anstellst.
 
Zuletzt bearbeitet:
Code:
for(int j=12;j>=0;j--)
{
        if(min[j] <min[j-1]) k=j;
}
1. Problem: min ist nur 12 groß, daher die Indizes von 0-11 nur.
2. Problem wenn j = 0 dann ist min[j-1] = min[-1]
Iteriere doch einfach wieder von 1-12 und überprüfe min[k] < min[j].
Du wählst also als ersten Index k = 0 und in der If-Anweisung wird überprüft, ob der Wert im min Array an der Stelle 0 größer als der an der Stelle min[j] ist, wenn dem so ist, ist dein neues Minimum an der Stelle min[j] und damit setzt du k = j, weil das der neue Index ist (hast du ja auch gemacht).

EDIT: Da war wohl jemand schneller :D
EDIT2: Sehe gerade bei mir ist kleiner Zeichen falsch: Da wir das Minimum suchen natürlich min[k] > min[j]
 
Zuletzt bearbeitet:
Ist zwingend eine komplett eigene Lösung gefordert? Wenn nicht schau dir doch mal min_element() und max_element() an.

Wenn doch würde ich es gar nicht so kompliziert machen und dir einen ähnlichen Lösungsansatz wie CDW empfehlen. Suche nur das globale Minimum und merke dir zum aktuellen bisherigen Minimum die Zeile in der es steht. Dann musst du nicht mit dem min-Array herum hantieren. Macht es in meinen Augen nur unnötig kompliziert.

Code:
int min = matrix[0][0];
int min_zeile = 0;

for( int i=0; i<6; ++i )
{
    for( int j=0; j<12; ++j )
    {
        if( matrix[i][j] < min )
        {
            min = matrix[i][j];
            min_zeile = i;
        }
    }
}
 
ich danke euch erstmal ganz sehr. ich probier dass heute nachmittag alles nochmal aus. ich glaube ich werden euch noch mit mehr fragen konfrontieren hab noch ein paar aufgaben vor mir zur klausur vorbereitungen....

der ansatz mit den standard funktionen ist leider verboten in der klausur und man muss immer seinen eigenen kram benutzen.

vielen dank erstmal!
 
Zurück
Oben