Problem z pętlą for przy poszukiwaniu minimum.

0

Witam,

Po prostu nie rozumiem dlaczego program sypie mi się w tym momencie. Oczywiście macierz jest poprawnie zainicjowana. Kiedy dorzucam cout lub przypisanie wartości dla wskaźnika to wysypuje się. Proszę o pomoc.

int a = 0;

for(i=0; i<n; i++){
    if(min > macierz[a][i])
    {
        min = macierz[a][i];
        cout << " b: " << min << endl;						
    } 
}
0

Czym jest min i co oznacza, że kod „sypie się”?

0

min jest liczbą całkowitą. Jest minimum w rzędzie macierzy. Przy uruchomieniu *.exe "Program wykonał nieprawidłową operację".

0

a mógłbyś pokazać cały kod?

W ogóle ta twoja "macierz" to chyba tylko zwykła tablica (nie inkrementujesz a)

    i   0   1   2   3 
a
0       5   5   5   5
1
2

żeby przeszukać macierz (2d array) to najłatwiej chyba użyć pętli w pętli.

0

Nie, jest macierzą. :) Po tej pętli pewnie jest niezrozumiałe, ale ma później zmienną "a" przypisać do "i" i następne wyszukiwanie. Póki co chodzi mi tylko o tą pętlę. Blokuje mi dalsze działania, bo nie wiem skąd ten błąd.

#include <iostream>
#include <cstdlib>
#include <vector>
#include <fstream>
#include <sstream>

using namespace std;

struct trasa{
	int x,y,koszt;
	trasa * nastepny;
};

int main(){
	
	int nieskonczonosc = 2147483647;			
	ifstream plik;
	plik.open("tsp15.txt");
	string temp;
	vector < int > map;
	getline(plik, temp);
	int n = atoi(temp.c_str());
	int i,j;
	int macierz[n][n];
	trasa * wsk;	
	
	for(i=0; i<n; i++){		
		if(plik.good()){
			getline(plik, temp);
			stringstream ss(temp);
			int m;
			vector <int> dane;
			while(ss >> m) dane.push_back(m);			
			for(j=0; j<n; j++){
				macierz[i][j] = dane [j];
			}		
		}
	}
		
	plik.close();
	
	for(i=0; i<n; i++){
		for(j=0; j<n; j++){
			cout << macierz[i][j] << " ";
		}
		cout << endl;
	}
	cout << endl;
	
	int min, k, l;
	int a = 0;
	int stan = 0;
	while(stan < n){		
		for(i=0; i<n; i++){
			if(min > macierz[a][i])
			{
				min = macierz[a][i];
				cout << " b: " << min << endl;						
			} 
		}		
		stan++;		
	}
	
	cout << endl;
	
	
	exit(0);
}
0

A ustaw min na 1 element macierzy przy inicjalizacji.

coś typu

int min = macierz[0][0];
0

Nie, nie o to mi chodziło. Wszystko z macierzą jest ok, ale kiedy do pętli wrzucam coś więcej niż ten jeden wiersz:
min = macierz[a][i];
np:
cout << " b: " << min << endl;
to wtedy zaczyna być problematycznie. Jeśli masz możliwość to wrzuć do DevC++ i spróbuj skompilować z jednym wierszem i z dwoma.

I jeszcze jedno!
min ma być wartością elementu macierzy, a nie samą macierzą.

1

Generalnie aby znaleźć wartość min w jakiejś macierzy, to wystarczy

const int width = 3;
const int height = 3;

int matrix[width][height] = 
{ 
   {-55, 2, 3,},
   {6, -79, 8,},
   {5, 5, -5}
};

int min = matrix[0][0];

for (int i=0; i<width; i++)
{
    for (int j=0; j<height; j++)
    {
        if (min > matrix[i][j])
        {
            min = matrix[i][j];
        }
    }
}
cout << min;

Nie wiem, jeżeli Ci to coś pomoże to spoko :P

0

W porządku, ale moje pytanie dotyczy czegoś innego. :)

Tu nie o to chodzi, że chcę znaleźć wartość min w rzędzie, a nr kolumny, w której jest minimum w danym rzędzie.

1
const int width = 4;
const int height = 4;

int matrix[width][height] = 
{ 
   {1,-2,3,5},
   {6,5,4,-30},
   {3,2,-40,55},
   {-200,5,3,2}
};

vector<int> indexes;

for (int i=0; i<width; i++)
{
    int min = matrix[i][0];
    int min_index = 0;
    for (int j=0; j<height; j++)
    {
        if (min > matrix[i][j])
        {
            min = matrix[i][j];
            min_index = j; 
        }
    }
    indexes.push_back(min_index);
}

for (int val : indexes)
{
    cout << val << endl;
}

output:

1
3
2
0

seems 'bout right

0

Dzięki wielkie! Właśnie przed chwilą też wyszedłem z opresji. W każdym razie dziękuję Ci za fatygę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1