Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

C++ Felder Minimum wird in Matrix nicht gefunden

Diskussion: C++ Felder Minimum wird in Matrix nicht gefunden im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Hallo HaBo, ich bräuchte mal hilfe bei einer Aufgabe. Hier erstmal die Aufgabe Zitat: 1. Aufgabe: Gegeben sei eine ...

Antwort
Alt 08.06.11, 21:22   #1 (permalink)
Senior Member
 
Benutzerbild von Chakky
 
Registriert seit: 28.10.03
Chakky Leistung: 8086
Chakky eine Nachricht über ICQ schicken
Likes: 110
erledigt C++ Felder Minimum wird in Matrix nicht gefunden

Anzeige

Hallo HaBo,

ich bräuchte mal hilfe bei einer Aufgabe.

Hier erstmal die Aufgabe

Zitat:
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
__________________
cu
Chakky

we are dreaming in digital
we are living in realtime
we are thinking in binary
we are talking in IP
welcome to our world

Geändert von Chakky (15.06.11 um 19:05 Uhr)
Chakky ist offline   Mit Zitat antworten
Alt 08.06.11, 21:54   #2 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard

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:
Zitat:
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
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 08.06.11, 22:11   #3 (permalink)
 
Registriert seit: 03.04.11
Tsjuder Leistung: 8086
Likes: 10
Standard

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[i][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 ;-)

Geändert von Tsjuder (08.06.11 um 22:17 Uhr)
Tsjuder ist offline   Mit Zitat antworten
Alt 08.06.11, 22:37   #4 (permalink)
Senior Member
Themenstarter
 
Benutzerbild von Chakky
 
Registriert seit: 28.10.03
Chakky Leistung: 8086
Chakky eine Nachricht über ICQ schicken
Likes: 110
Standard

Zitat:
Zitat von Tsjuder Beitrag anzeigen


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.

Zitat:

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   
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;
}
__________________
cu
Chakky

we are dreaming in digital
we are living in realtime
we are thinking in binary
we are talking in IP
welcome to our world
Chakky ist offline   Mit Zitat antworten
Alt 08.06.11, 23:01   #5 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 202
Standard

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?
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.
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.

Geändert von CDW (08.06.11 um 23:12 Uhr) Grund: Rechtschreipunk
CDW ist offline   Mit Zitat antworten
Alt 08.06.11, 23:03   #6 (permalink)
 
Registriert seit: 03.04.11
Tsjuder Leistung: 8086
Likes: 10
Standard

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
EDIT2: Sehe gerade bei mir ist kleiner Zeichen falsch: Da wir das Minimum suchen natürlich min[k] > min[j]

Geändert von Tsjuder (08.06.11 um 23:09 Uhr)
Tsjuder ist offline   Mit Zitat antworten
Alt 09.06.11, 00:29   #7 (permalink)
 
Registriert seit: 06.06.09
Thunderb0lt Leistung: 8086
Likes: 6
Standard

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;
        }
    }
}
__________________
A good programmer looks both ways before crossing a one-way street.

Die Politik kann uns nur für so dumm verkaufen, wie wir sind.
Thunderb0lt ist offline   Mit Zitat antworten
Alt 09.06.11, 07:35   #8 (permalink)
Senior Member
Themenstarter
 
Benutzerbild von Chakky
 
Registriert seit: 28.10.03
Chakky Leistung: 8086
Chakky eine Nachricht über ICQ schicken
Likes: 110
Standard

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!
__________________
cu
Chakky

we are dreaming in digital
we are living in realtime
we are thinking in binary
we are talking in IP
welcome to our world
Chakky ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » C++ Felder Minimum wird in Matrix nicht gefunden
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61