Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Funkcja for z dwoma zmiennymi [i].

Ostatnio zmodyfikowano 2014-07-08 11:19
Autor Wiadomość
MeM
Temat założony przez niniejszego użytkownika
Funkcja for z dwoma zmiennymi [i].
» 2014-07-07 15:47:42
Witajcie. Od niedawna uczę się programować w C++ korzystając z tutoriali Mirosława Zelenta. Jako zadanie domowe trzeba było stworzyć program w którym:
- Podajemy 5 liczb
- Wyliczamy średnią
- Podajemy, która liczba jest najbliżej średniej.

Stworzyłem coś takiego:
C/C++
#include <iostream>
#include <cstdlib>

using namespace std;

float liczba[ 4 ], l[ 4 ];
float srednia, r, wynik;

int main()
{
    cout << "Podaj 5 liczb: " << endl;
    cin >> liczba[ 0 ] >> liczba[ 1 ] >> liczba[ 2 ] >> liczba[ 3 ] >> liczba[ 4 ];
   
    srednia =( liczba[ 0 ] + liczba[ 1 ] + liczba[ 2 ] + liczba[ 3 ] + liczba[ 4 ] ) / 5;
    cout << "Srednia to: " << srednia << endl;
   
    for( int i = 0; i < 5; i++ )
    {
        l[ i ] = liczba[ i ] - srednia;
    }
   
    for( int i = 0; i < 5; i++ )
    {
        if( l[ i ] < 0 )
             l[ i ] =- l[ i ];
       
    }
   
    wynik = liczba[ 0 ];
    r = l[ 0 ];
   
    if( r > l[ 1 ] )
         r = l[ 1 ];
   
    wynik = liczba[ 1 ];
    if( r > l[ 2 ] )
         r = l[ 2 ];
   
    wynik = liczba[ 2 ];
    if( r > l[ 3 ] )
         r = l[ 3 ];
   
    wynik = liczba[ 3 ];
    if( r > l[ 4 ] );
   
    wynik = liczba[ 4 ];
   
    cout << "Liczba najbliższa sredniej to: " << wynik;
   
    return 0;
}

Niestety, problem polega na tym, że nie mam pojęcia dlaczego, jako wynik wychodzi
l[ 0 ]
 (różnica pomiedzy pierwsza liczba a srednia), a nie liczba poprawna czy nawet pierwsza podana liczba. Nie przerabiałem jeszcze wartości bezwzględnych toteż chciałem:
- od każdej liczby odjąć średnią
- w przypadku ujemnej wartości zmienić znak na przeciwny
- porównać ze sobą różnice
- ta która będzie najmniejsza, będzie miała liczbę najbliższą średniej.

Gdzie popełniłem błąd?
P-113429
Monika90
» 2014-07-07 16:00:57
Przede wszystkim twoje tablice są za małe, masz 5 liczb, a w tablicy int liczba[4] mieszczą się 4.
P-113430
pekfos
» 2014-07-07 17:26:25
C/C++
wynik = liczba[ 0 ];
r = l[ 0 ];

if( r > l[ 1 ] )
     r = l[ 1 ];

wynik = liczba[ 1 ];
if( r > l[ 2 ] )
     r = l[ 2 ];

wynik = liczba[ 2 ];
if( r > l[ 3 ] )
     r = l[ 3 ];

wynik = liczba[ 3 ];
if( r > l[ 4 ] );

wynik = liczba[ 4 ];
Gdzie sens?
P-113435
MeM
Temat założony przez niniejszego użytkownika
» 2014-07-07 22:23:53
wynik - czyli to co chcemy osiagnac
r - jest to "różnica między średnią dla poszczególnych liczb"
jeżeli różnica jest najmniejsza, wtedy jest najbliższa zeru (bo dla każdej <0 stworzyłem ifa który zamienia liczbe ujemna na dodatnia)
i jeżeli różnica jest najmniejsza, wtedy odpowiada ona określonej liczbie, dla i=0 mamy
liczba[ 0 ] i l[ 0 ]

Monika
w tablicy int liczba[4] sie mieszczą liczby od 0 do mniejszych od 5 czyli 0, 1 ,2 ,3 ,4 co daje łącznie 5 liczb
P-113471
pekfos
» 2014-07-07 22:28:06
wynik - czyli to co chcemy osiagnac
r - jest to "różnica między średnią dla poszczególnych liczb"
jeżeli różnica jest najmniejsza, wtedy jest najbliższa zeru (bo dla każdej <0 stworzyłem ifa który zamienia liczbe ujemna na dodatnia)
i jeżeli różnica jest najmniejsza, wtedy odpowiada ona określonej liczbie, dla i=0 mamy
C/C++
liczba[ 0 ] i l[ 0 ]
Tyle to sam bym się domyślił. I nie pytałbym o sens kodu, który sens ma. Przypatrz się wcięciom w sformatowanym przez forum kodzie.. ;)
P-113473
Glazus
» 2014-07-07 22:32:41
w tablicy int liczba[4] sie mieszczą liczby od 0 do mniejszych od 5 czyli 0, 1 ,2 ,3 ,4 co daje łącznie 5 liczb
Nie. Liczba w [] wskazuje Ci ile elementów mieści się w tablicy.
wynik - czyli to co chcemy osiagnac
Ale zdajesz sobie sprawę, że w cytowanym przez pekfosa fragmencie kodu zmieniasz wartość zmiennej
wynik
 pięć razy?
P-113476
MeM
Temat założony przez niniejszego użytkownika
» 2014-07-07 23:40:37
Glazus i Pekfos
A nie jest tak, że dla każdej liczba [0] jest przypisana konkretna liczba (ktora jest zczytywana z cin) i w następstwie dla każdego l[4] jest przypisana kolejna oparta na tablicy z liczba[4]? Jakbym zamienił tablice na zmienne a,b,c,d,e i analogicznie zamienil tablice l[4] to zadziałałby program, czy mam błąd logiczny? Da się jakoś usprawnić nie zmieniając przesadnie kodu?
Druga sprawa - wynik zmieniam maksymalnie 5 razy, w przypadku gdy ostatnia liczba jest najbliżej średniej. Jest to problemem? Sugerowałem się na poleceniu z wyszukiwaniem maksymalnej liczby poprzez:
C/C++
int x, y, z, m; // m - liczba maksymalna
cin >> x >> y >> z;

m = x;
if( y > m )
     m = y;

if( z > m )
     m = z;

P-113486
Glazus
» 2014-07-07 23:58:14
Druga sprawa - wynik zmieniam maksymalnie 5 razy
Nie. Ty zawsze zmieniasz pięć razy.
A nie jest tak, że dla każdej liczba [0] jest przypisana konkretna liczba (ktora jest zczytywana z cin) i w następstwie dla każdego l[4] jest przypisana kolejna oparta na tablicy z liczba[4]? Jakbym zamienił tablice na zmienne a,b,c,d,e i analogicznie zamienil tablice l[4] to zadziałałby program, czy mam błąd logiczny? Da się jakoś usprawnić nie zmieniając przesadnie kodu?
Nie wiem o co chodzi, ale mam nadzieję, że napisanie tego wprost Cię jakoś oświeci.
C/C++
int liczba[ 4 ]; // deklaracja CZTEROELEMENTOWEJ TABLICY

// taka tablica będzie zawierać elementy:
liczba[ 0 ], liczba[ 1 ], liczba[ 2 ], liczba[ 3 ]

// natomiast NIE BĘDZIE ZAWIERAĆ zmiennej
liczba[ 4 ]
P-113489
« 1 » 2
  Strona 1 z 2 Następna strona