Tablica dwuwymiarowa, szukanie elementów

0

Mam w zadanie wczytać liczby z pliku. i w każdym wierszu znaleźć najmniejszy element.
mam pytanie, dlaczego ostatni najmniejszy element nie wczytuje się do tablicy w której przechowywane są najmniejsze elemnety?
Oto mój kod:

#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char* argv[]) {
	const int w = 4;
	const int k = 5;
	const int p = 10;
	int tab[w][k];
	int naj[w];
	int i;
	int j;
	int najmniejszy = -10;

	ifstream plk("dane.txt");
	if (!plk.good()) {
		cout << "Nie udało sie otworzyc pliku\n";
		return 1;
	}
	while (!plk.eof()) {
		for (i = 0; i < w; i++) {
			for (j = 0; j < k; j++) {
				plk >> tab[i][j];				
			}
			
		}
	}
	for (i = 0; i < w; i++) {		
		for (j = 0; j < k; j++)
			cout << tab[i][j] << "\t";

		cout << endl;
	}
	cout << endl;
	cout << endl;

	for (i = 0; i < w; i++) {
		najmniejszy =tab[i][j];
		for (j = 0; j < k; j++) {	
			if (tab[i][j] < najmniejszy) {
				najmniejszy = tab[i][j];
			}
		}
		naj[i] = najmniejszy;
	}
	for (i = 0; i < w; i++)
		cout << naj[i] << "\t";


	return 0;
}

screenshot-20200619185323.png

4

Masz UB, gdyż czytasz elementy z poza tablicy tab, dokładnie dla j=5.
Zamień na

najmniejszy = tab[i][0];

Błędy tego rodzaju powstają w momencie, kiedy w programie mamy do czynienia z dużą ilością zmiennych operujących na indeksach tablic. Łatwo się wtedy pogubić i wyjść poza zakres.

Dlatego kiedy tylko można to lepiej ich nie używać, a dzisiejszy standard języka C++ na to pozwala. Zobacz

#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>

using namespace std;

void display( const vector<vector<int>>& tab )
{
    for( const auto& row : tab )
    {
        for( const auto& element : row )
        {
            cout << element << "\t";
        }
        cout << endl;
    }
}

int main()
{
    vector<vector<int>> tab(4,vector<int>(5));

    ifstream plk("dane.txt");

    if( !plk.good() )
    {
        cout << "Error : cannot open file\n";
        return 1;
    }

    for( auto& row : tab )
    {
        for( auto& element : row )
        {
            plk >> element;
        }
    }

    display(tab);
    cout << endl;

    for( const auto& row : tab )
    {
        cout << *min_element(row.cbegin(),row.cend()) << "\t";
    }

    return 0;
}
1

A co to najmniejszy = tab[i][j];? Jakie tam jest j?

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