Problem z programem, który rozbija tablice z rand. liczbami na dwie inne tablice, po czym wyszukuje liczbę najmniejszą i największą

0

Cześć! Program dokładnie ma rozbijać tablicę jednowymiarową (z rand. liczbami wpisanymi) na dwie inne, sposobem porównywania parami liczb(ta która jest mniejsza idzie do tablicy mini[n], a ta która jest większa do maxi[n]). Następnie w tablicy z mniejszymi liczbami ma wyszukać najmniejszą z nich i wypisać, potem program ma zrobić to samo z maxi[n], tylko, że ma wyszukać największą z nich. Sądzę, że tu problem tkwi w drugim for'u, ale nie wiem jak wtedy inaczej go rozpisać. Z góry dziękuję za wszelkie rady!

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;

int main()
{
    srand(time(NULL));
    int n=10;
    int tab[n], najw, najm;
    int maxi[n],mini[n];

    for(int i=0;i<n;i++)
    {
        tab[i]=rand()%100;
        cout<<tab[i]<<endl;
    }
    for(int x=0;x<n-1;x+2)
    {

        if(tab[x]<tab[x+1])
        {
            maxi[n]=tab[x+1];
            mini[n]=tab[x];
        } else
        {
            maxi[n]=tab[x];
            mini[n]=tab[x+1];
        }
    }
    cout<<"najwieksze liczby to: "<<endl;
    for(int h=0;h<n;h++)
    {
        cout<<maxi[h]<<"\t";
    }
    cout<<endl<<"najmniejsze liczby to: "<<endl;
    for(int z=0;z<n;z++)
    {
        cout<<mini[z]<<"\t";
    }
    for(int y=0;y<n;y++)
    {
        najw=maxi[0];
        najm=mini[0];
        if(najw<maxi[y])
        {
            najw=maxi[y];
        } else {najw;}
        if(najm>mini[y])
        {
            najm=mini[y];
        } else {najm;}
    }
    cout<<endl<<"najwieksza liczba to "<<najw<<endl;
    cout<<"najmniejsza liczba to "<<najm<<endl;


    return 0;
}
3

No ale jaki jest problem?

Dobra chyba widzę, te tablice maxi i mini powinny być deklarowane maxi[n/2],mini[n/2] i w ostatniej pętli for(int y=0;y<n/2;y++). A teraz mi odpowiedz jak myślisz, czemu tak powinno być?

no i nie zauważyłem tego co @_13th_Dragon, czyli m.in. w drugiej pętli for jest błąd, powinno być x+=2, czy przypisywanie do najw i najm zerowego indeksu co każdy obieg pętli

4
  1. http://forum.4programmers.net/1101404
  2. Lepiej stosuj jednolitego nazewnictwa, radzę język angielski.
  3. x+2 nie zmienia wartości x, prawdopodobnie chciałeś użyć x+=2.
  4. Po pętli: for(int i=0;i<n;++i) możesz dać kolejną for(int i=0;i<n;++i) z niczym to nie koliduje.
  5. Potrzebujesz osobny(e) licznik(i) dla tablic maxi oraz mini ponieważ tak jak teraz do tych tablic wpisujesz co drugą wartość
  6. Przy wyszukiwaniu min/max każdy krok pętli zaczynasz od inicjalizacji najw oraz najm co doprowadzi do niepoprawnego wyniku.
  7. Zauważ że możesz wymienić w tablice tab elementy parami tak aby indeksy 0,2,4,... były tablicą mini, zaś 1,3,5,... były tablicą maxi.

To na pierwszy rzut oka.

0

@_13th_Dragon: 1. nie wiedziałem, że można tak pisać, dzięki :D
2. dobra rada
3. no tak! To by się zgadzało.. lecz program jakby wciąż nie wpisuje tych rand. liczb z tab[n] do maxi[n] czy mini[n], bo wciąż wyświetlają się dziwne liczby ;p
4. dobra rada #2
5. szczerze mówiąc nie jestem pewien, co masz dokładnie na myśli
6. o, mój błąd,, już działa
7. i program ma je zamieniać miejscami jeśli np. tab[0]>tab[1]?

1
  1. oraz 7. to niekompatybilne punkty.
  2. TAK
    for(int x=0,q=0;x<=n;x+=2)
    {
        if(tab[x]<tab[x+1])
        {
            maxi[q++]=tab[x+1];
            mini[q++]=tab[x];
1

@pavarotti: jeśli chodzi o to pytanie: nigdy wcześniej się nie spotkałem z oznaczeniem np. tab[n/2], ale na logikę to myślę, że te tablice maxi[n/2] i mini[n/2] po prostu powinny być o połowę mniejsze od tab[n], ponieważ program sprawdza parami tablicę, przez co tak naprawdę po połowie wartości z tab[n] się zapisze na tych dwóch pozostałych tablicach :D

0

@_13th_Dragon: 7. okej, już rozumiem. Choć nie wiem czy to był błąd, ponieważ program tak samo omija przypisywanie wartości z tab[n] do innych tablic :'D

3

Naucz się dzielić na drobne funkcje, uprości ci to programowanie oraz życie.

#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <cmath>
using namespace std;

void randinit(vector<int> &tb) { for(auto &v:tb) v=rand()%100; }
void show(const vector<int> &tb) 
{ 
	for(auto &v:tb) cout<<v<<' ';
	cout<<endl;
}
void showmin(const vector<int> &tb) 
{
	for(int i=0;i<tb.size();i+=2) cout<<min(tb[i],tb[i+1])<<' ';
	cout<<endl;
}
void showmax(const vector<int> &tb) 
{
	for(int i=0;i<tb.size();i+=2) cout<<max(tb[i],tb[i+1])<<' ';
	cout<<endl;
}
int minmin(const vector<int> &tb) 
{
	int best=min(tb[0],tb[1]);
	for(int i=2;i<tb.size();i+=2) best=min(best,min(tb[i],tb[i+1]));
	return best;
}
int maxmax(const vector<int> &tb) 
{
	int best=min(tb[0],tb[1]);
	for(int i=2;i<tb.size();i+=2) best=max(best,max(tb[i],tb[i+1]));
	return best;
}

int main()
{
	const int size=10;
	srand(time(0));
	vector<int> tb(size);
	randinit(tb);
	show(tb);
	showmin(tb);
	showmax(tb);
	cout<<"minmin: "<<minmin(tb)<<endl;
	cout<<"maxmax: "<<maxmax(tb)<<endl;	
    return 0;
}
0

@_13th_Dragon: aktualnie jestem początkujący w kodowaniu i nie wiem czy to czasem nie będzie już poziom wyżej ;pp

1

@pierożki z masełkiem: Możesz to spokojnie na pętli przerobić.

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