• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[Zadanie 11] Szukanie maksymalnej liczby z pętlą bez wbudowanej zmiennej max itd

Object Storage Arubacloud
0 głosów
326 wizyt
pytanie zadane 25 maja 2016 w C i C++ przez iai Nowicjusz (200 p.)

Chciałbym zastąpić to pojedyńcze wypisanie 4ciu ifów pętlą ale nie wiem czy to możliwe, chcę uniknąć używania wbudowanej zmiennej max.

Oto kod źródłowy..

#include <iostream>
#include <time.h>
#include <cstdlib>

using namespace std;

int liczba[5];
int suma = 0;
int srednia;
int maks;

int main()
{
    for(int i = 0; i < 5; i++)
    {
        cout << "Podaj: " << i+1 << " liczbe: ";
        cin >> liczba[i];

        maks = liczba[0]; //przypisałem umowną wartosc maks tak jak w filmiku z zad 11

    if (liczba[i] > maks) maks = liczba[1]; //tutaj chciałbym zapętlać w jednej linii
    if (liczba[2] > maks) maks = liczba[2];
    if (liczba[3] > maks) maks = liczba[3];
    if (liczba[4] > maks) maks = liczba[4];

        suma += liczba[i];
    }

    srednia = suma / 5;

    cout << "\nSuma wynosi: " << suma<< "\n";
    cout << "Srednia wynosi: " << srednia << "\n";
    cout << "Sprawdzanie najwiekszej liczby z 5 podanych liczb: \n";

    cout << "Najwieksza liczba to: " << maks << "\n";
}

 

2 odpowiedzi

0 głosów
odpowiedź 25 maja 2016 przez niezalogowany
wybrane 26 maja 2016 przez iai
 
Najlepsza
Jasne, że to możliwe; to co zrobiłeś to napisałeś rozwiniętą reprezentację takiej pętli (btw nawet tej lepszej wersji) więc w czym problem?
komentarz 25 maja 2016 przez DragonCoder Nałogowiec (36,500 p.)
Zapytam i może odpowiem :D. Czy chodzi o zapetlenie w for? A i daj może ilość liczb jako i a nie 5, bo nigdy nie wiadomo ile liczb poda użtkownik
1
komentarz 26 maja 2016 przez niezalogowany
edycja 26 maja 2016

Moja propozycja (kod ogólny wyszukiwania maxa):

int my_max(int t[], int size)
{
  int max = t[0];
  for (int i=1; i<size; ++i)
  {
    if (t[i] > max)
      max = t[i];
  }
}

Cały proces możesz nieco zoptymalizować jeżeli chcesz w jednej pętli znaleźć maxa, obliczyć średnią i sumę:

#include <iostream>
#include <limits>

using namespace std;

int main()
{
  int size;
  cin >> size;
  int *t = new int[size];
 
  int sum = 0;
  int mmax = std::numeric_limits<int>::min(); // ustawiamy na najmniejszą możliwą wartość
 
  for (int i=0; i<size; ++i)
  {
    cin >> t[i];
 
    if (t[i] > mmax) // max
      mmax = t[i];
 
    sum += t[i]; // suma liczb
  }
 
  float avg = sum / size; // obliczenie średniej
  cout << "MAX: " << mmax << " SUM: " << sum <<  " AVG: " << avg << "\n";
 
  delete[] t;
}

 

komentarz 26 maja 2016 przez iai Nowicjusz (200 p.)
edycja 26 maja 2016 przez iai

Musiałem to przerobić bo nie chciało się kompilować u mnia. Z początku chciałem uniknąć korzystania z wbudowanej zmiennej max i tylko przypisywać do jakiejś zwykłej zmiennej mojego umownego maxa ale chyba przestane szukać tego rozwiązania. Czyli np int maksymalna = tablica[0] a pozniej przypisywac iteracja tego maksa do ideksow w tablicy ale widze ze tak sie nie da w przypadku gdy uzytkownik podaje liczbę do tablicy.

Co innego w przypadku gdy z góry ustalam ilosc w tablicy np 5 to wtedy nie ma z niczym problemów. Dobrze mówię czy poprostu czegoś nie ogarniam?

int max = std::numeric_limits<int>::min(); -- ta linijka dla mnie to juz w ogóle jakiś kosmos nie do ogarnięcia :D

 Mianowicie musiałem zmienić na takie coś:

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

int main()
{
    int size;
    cout << "Wprowadz ile liczb: ";
    cin >> size;
    int *tablica;
    tablica = new int [size];


    int max = std::numeric_limits<int>::min();

     // ustawiamy na najmniejszą możliwą wartość

    for(int i = 0; i < size; i++)
    {
        cin >> *tablica;

        if(*tablica > max) max = *tablica;
    }

    cout << "Najwieksza liczba wynosi" << max;

    delete [] tablica;
}

 

 

komentarz 26 maja 2016 przez niezalogowany

Błąd jaki znalazłem w moim kodzie to jedynie nazwanie zmiennej max oraz brak gwiazdki przy t (miał to być wskaźnik), poza tym wszystko działa jak powinno (piszę kod na czuja i na "sucho", więc minimalne błędy mogą się zdarzyć), powyżej edytowałem już kod na taki, który jest dobry.

Przykładowe uruchomienie:

$ ./a.out 
3
7
13
11
MAX: 13 SUM: 31 AVG: 10

Co do numeric_limits<int>::min() to ta linia jedynie co robi to mówi: weź podaj mi najmniejszą możliwą wartość int'a.

 

komentarz 26 maja 2016 przez iai Nowicjusz (200 p.)

@ Szymon Siarkiewicz Dzięki za pomoc ;) Zaś coś więcej się nauczyłem ;)

+1 głos
odpowiedź 25 maja 2016 przez Ditrix Mądrala (5,650 p.)
maks = liczba[0];
    for(int i = 0; i < 5; i++)
    {
        cout << "Podaj: " << i+1 << " liczbe: ";
        cin >> liczba[i];

        if(liczba[i] > maks) maks = liczba[i];

        suma += liczba[i];
    }

 

komentarz 25 maja 2016 przez iai Nowicjusz (200 p.)
O tak też robiłem ale nie do końca :D bo wystarczyło wpisać maks = liczba[i] przed pętle for a u mnie było za pętlą, dzięki wszystkim za zainteresowanie ;) No to teraz biorę się za szukanie najbliższe liczby średniej podobnym sposobem ;)
komentarz 25 maja 2016 przez niezalogowany
@Ditrix to nie sztuka podać gotowy kod, sztuka to wyjaśnić jakąś ideę.

Nawiasem mówiąc twój kod jest niepoprawny bo przypisujesz to maks wartość, która jest śmieciowa o ile autor wcześniej nie wyzerował tablicy, a więc w 1 linii możesz przypisać wartość, która będzie maksymalną, lecz nie podaną przez użytkownika
komentarz 26 maja 2016 przez iai Nowicjusz (200 p.)

@Szymon Siarkiewicz mógłbyś podać Twój kod jaki byś użył do rozwiązania tego problemu? Zerknij jeszcze proszę na to.. tutaj gdy zastosowałem wprowadzanie liczb przez uzytkownika oraz z alokowaniem pamieci to wychodzą jakieś dziwne wysokie liczby w suma, srednia i najwieksza liczba

#include <iostream>
#include <time.h>
#include <cstdlib>

using namespace std;
int ile;
int suma = 0;
int srednia;
int maks;

int main()
{
    cout << "Podaj ile liczb do sprawdzenia maksymalnej liczby: ";
    cin >> ile;

    int * tablica;
    tablica = new int [ile];

    maks = tablica[0];
    for (int i = 0; i<ile; i++)
        {
            cout << "Podaj "<< i+1 << " liczbe: ";
            cin >> tablica[i];
            tablica++;

            suma += tablica[i];
            srednia = suma/ile;

    if(tablica[i] > maks) maks = tablica[i];


        }
        cout << "Najwieksza liczba z podanych: " << maks << "\n";
        cout << "Suma: " << suma << "\n";
        cout << "Srednia: " << srednia;
        delete [] tablica;
}

 

komentarz 26 maja 2016 przez niezalogowany
Swoją propozycję podałem w komentarzu do własnej odpowiedzi

Podobne pytania

0 głosów
1 odpowiedź 267 wizyt
pytanie zadane 7 października 2016 w Nasze projekty przez unbearable Początkujący (450 p.)
+1 głos
1 odpowiedź 702 wizyt
0 głosów
4 odpowiedzi 716 wizyt
pytanie zadane 20 marca 2016 w C i C++ przez Eliro Stary wyjadacz (12,160 p.)

92,624 zapytań

141,482 odpowiedzi

319,822 komentarzy

62,005 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...