Skocz do zawartości
Roundstic

Zadanie C++

Rekomendowane odpowiedzi

Cześć mam zadanie z którym nie mogę sobie poradzić.

 

Zadanie brzmi następująco:

 

Napisz program w języku C++, który wczyta liczbę całkowitą 1<=N<=1000, a następnie n liczb całkowitych (typu int) i znajdzie wśród tych liczb minimum i maksimum zgodnie z algorytmem jednoczesnego znajdowania minimum i maksimum.

 

Algorytm jednoczesnego znajdowania minimum i maksimum wygląda jakoś tak

 

mamy np. liczby 1 5 7 2 3 8 2 4 3 2

 

Porównujemy je parami

 

1<5 7>2 3<8 2<4 3>2

 

U góry wypisujemy większe i wsród nich szukamy max

5 7 8 4 2

 

 

 

Na dole wypisujemy mniejsze i szukamy miniumum

 

1 2 3 2 2

 

 

Proszę o podpowiedzi z wykorzystaniem pętli oraz tablic bardzo proszę bez skomplikowanych funkcji

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Cześć mam zadanie z którym nie mogę sobie poradzić.

Napisz coś więcej z czym jest problem, bo to stwierdzenie jest zbyt ogólne i nie wiadomo czy problem tkwi w użyciu języka, czy z samym algorytmem, rozwiązaniem zadania.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mam napisany taki kod do minimum:

#include <iostream>

 

using namespace std;

 

int main()

{

int T[100];

int n, i, m;

cin >> n;

for(i = 0; i < n; i++)

{

cin >> T;

}

 

m = T[0];

 

for(i = 1; i < n; i++)

{

if(m > T)

{

m = T;

}

}

 

cout << m << endl;

 

return 0;

}

 

I taki do maksimum

 

#include <iostream>

 

using namespace std;

 

int main()

{

int T[100];

int n, i, m;

cin >> n;

for(i = 0; i < n; i++)

{

cin >> T;

}

 

m = T;

 

for(i = 1; i < n; i++)

{

if(m <T)

{

m = T;

}

}

 

cout << m << endl;

 

return 0;

}

 

I nie wiem jak to połączyć

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Uwaga techniczna, jak wklejasz kod, to używaj tagów code (< > w menu).

 

Minimum

#include <iostream>

using namespace std;

int main()
{
   int T[100];
   int n, i, m;
   cin >> n;
   for(i = 0; i < n; i++)
   {
       cin >> T[i];
   }

   m = T[0];

   for(i = 1; i < n; i++)
   {
       if(m > T[i])
       {
           m = T[i];
       }
   }

   cout << m << endl;

   return 0;
}

 

Maksimum

#include <iostream>

using namespace std;

int main()
{
   int T[100];
   int n, i, m;
   cin >> n;
   for(i = 0; i < n; i++)
   {
       cin >> T[i];
   }

   m = T[i];

   for(i = 1; i < n; i++)
   {
       if(m <T[i])
       {
           m = T[i];
       }
   }

   cout << m << endl;

   return 0;
}

Prawda, że czytelniej?

 

 

Czy wiesz jak na papierze rozwiązać zadanie, jakie kroki trzeba zrobić?

Coś z programowania jarzysz, czy ciężko z tym? Rozumiesz jak działają zmienne, pętle, podane wyżej programy (w drugim jest błąd, widzisz go?)? Przydałoby się wiedzieć jakim językiem tłumaczyć.

 

Z połączenia tych dwóch programów nie do końca wyjdzie to co ma być w zadaniu, wynik będzie się zgadzał ale użyta metoda już nie. Ale na początek można zrobić taki wariant.

Żeby zrozumieć jak połączyć, to proponuję przyjrzeć się poszczególnym fragmentom i zobaczyć jaka jest część wspólna programów, a czym się różnią.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
' date='14 Listopad 2019 - 15:01' timestamp='1573740072' post='15696906']

Uwaga techniczna, jak wklejasz kod, to używaj tagów code (< > w menu).

 

Minimum

#include <iostream>

using namespace std;

int main()
{
   int T[100];
   int n, i, m;
   cin >> n;
   for(i = 0; i < n; i++)
   {
       cin >> T[i];
   }

   m = T[0];

   for(i = 1; i < n; i++)
   {
       if(m > T[i])
       {
           m = T[i];
       }
   }

   cout << m << endl;

   return 0;
}

 

Maksimum

#include <iostream>

using namespace std;

int main()
{
   int T[100];
   int n, i, m;
   cin >> n;
   for(i = 0; i < n; i++)
   {
       cin >> T[i];
   }

   m = T[i];

   for(i = 1; i < n; i++)
   {
       if(m <T[i])
       {
           m = T[i];
       }
   }

   cout << m << endl;

   return 0;
}

Prawda, że czytelniej?

 

 

Czy wiesz jak na papierze rozwiązać zadanie, jakie kroki trzeba zrobić?

Coś z programowania jarzysz, czy ciężko z tym? Rozumiesz jak działają zmienne, pętle, podane wyżej programy (w drugim jest błąd, widzisz go?)? Przydałoby się wiedzieć jakim językiem tłumaczyć.

 

Z połączenia tych dwóch programów nie do końca wyjdzie to co ma być w zadaniu, wynik będzie się zgadzał ale użyta metoda już nie. Ale na początek można zrobić taki wariant.

Żeby zrozumieć jak połączyć, to proponuję przyjrzeć się poszczególnym fragmentom i zobaczyć jaka jest część wspólna programów, a czym się różnią.

 

Tak trochę słabo jarze, teorię znam, ale jak sam mam coś napisać sprawia mi to narazie ból. Błędu nie mogę znaleźć, jedynie może m=T[0]? Co do rozwiązania zadania z połączenia tych dwóch, to może stworzyć dwie funkcje jedną i potem je wywołać?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Kolejna uwaga techniczna, nie cytuj poprzedzającej wypowiedzi.

 

Tak, przed pętlą szukającą maksimum, zamiast m=T powinno być m=T[0].

Tak jak było, to mogą wystąpić dwa błędy:

-odwołasz się do niezainicjowanego miejsca w tablicy lub co gorsza poza tablicę (tablica ma 100 elementów, przy podaniu 100 do wczytania, na koniec pętli i ma wartość 100, T[100] jest poza tablicą)

-pierwszy element tablicy nie jest uwzględniony w szukaniu (m ma inną wartość niż T[0], pętla startuje od i==1 czyli drugiego elementu tablicy)

 

 

Jak najbardziej można skorzystać z funkcji choć nie jest to konieczne, na pewno będzie eleganckie :cool:

 

To w ramach lepszego zrozumienia, trochę komentarzy

 

#include <iostream>

using namespace std;

int main()
{
   int T[100];
   int n, i, m;

//  << wczytywanie danych >>
   cin >> n;  //liczba elementów
   for(i = 0; i < n; i++)
   {
       cin >> T[i];  //kolejne elementy do tablicy
   }

// << szukanie minimum >>
   m = T[0];  //na początek za minimum przyjmujemy pierwszy element tablicy

   for(i = 1; i < n; i++)  //przeszukujemy w pętli całą tablicę
   {
       if(m > T[i])  //jeżeli minimum jest większe od i-tego elementu w tablicy, to ten element jest nowy minimum
                     //swoją drogą, to chyba łatwiej by się czytało kod, jeżeli porównanie wyglądałoby tak: T[i]<m, jak szukamy minimum, to sprawdzamy czy kolejny element nie jest mniejszy od obecnego minimum
                     //dla mnie taka kolejność jest bardziej naturalna
       {
           m = T[i];
       }
   }

// << wypisanie wyniku >>
   cout << m << endl;

   return 0;
}

 

Czyli mamy 3 główne bloki programu:

-wczytanie danych

-wyszukanie minimum

-zwrócenie wyniku

 

Po połączeniu będzie to wyglądało np. tak:

-wczytanie danych

-wyszukanie minimum

-wyszukanie maksimum

-zwrócenie wyniku

 

Jednym słowem wystarczy przepisać kawałek kodu od przeszukiwania, pamiętając, żeby użyć innej zmiennej do minimum i maksimum.

Warto komentować swój kod, bo zostaje ślad "co autor miał ne myśli". Przy większych projektach można się pogubić we własnym kodzie napisanym pół roku wcześniej. Przy nauce chyba też widać wtedy czy się rozumie co się pisze, jak nie wiadomo jak opisać kod, to znaczy, że nie wie co się robi ;)

Warto też nazywać zmienne po imieniu. Wiem, że to upierdliwe i zabiera czas wpisanie minimum czy maksimum zamiast m ale jest czytelniejsze i tak samo przy większym programie łatwiej się połapać, która zmienna jest od czego. Wiadomo, że na ogół w pętlach i, j, k to liczniki i nie ma potrzeby z długimi nazwami.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

#include <iostream>
using namespace std;
int main()
{
   int T[100];
   int n, max, min, i, j, g;
   //n - liczba elementow
   //max- maksimum
   //min- minimum
   //i- licznik pętli dla maksimum
   //j- licznik pętli dla minimum

   cin>>n; //wczytuje dane

   for(g=0; g<n; g++)
   {
       cin>>T[g];//kolejne elementy do tablicy
   }
//szukanie maksimum
   max=T[0];
   for(i=1; i<n; i++)
   {
       if(max<T[i])
       {
           max=T[i];
       }

   }
   //*****************************************************


   //szukanie minimum
   min=T[0];

   for(j=1; j<n; j++)
   {
       if(min>T[j])
       {
           min=T[j];
       }
   }
  //Wypisanie wyniku

   cout<<"Maksimum to: "<<max<<endl;
   cout<<"Minimum to: "<<min<<endl;


}

 

Bardzo dziękuję za wyjaśnienie. Czy tak może być?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Może, tylko pamiętaj, że to nie jest rozwiązanie zadania.

 

Komentarze do zmiennych zwykle robi się tak

int T[100];  //tablica elementow
int n;      //liczba elementow
int max;    //szukane maksimum
int min;    //szukane minimum
int i, j, g; //liczniki petli (tu już mi się nie chciało rozbijać na poszczególne  )

Jak nie masz zagnieżdżonych pętli, to nie potrzeba do każdej deklarować innej zmiennej (chyba że licznik pętli chcesz wykorzystać poza nią). Przy większych programach zabraknie literek ;)

 

 

Teraz trzeba dorobić część od jednoczesnego znajdowania minimum i maksimum. Nie wiem jaką macie definicję tego algorytmu ale znalazłem dwa warianty:

-dzieli zbiór na połowy min/max względem porównania kolejnych par, w zbiorze min wyszukuje się minimum, w max maksimum

-prawie to samo ale w jednej pętli, bez dzielenia zbioru i ponownego przeszukania podzielonych

 

Pierwszy wariant wydaje się prostszy, drugi powinien być ciut szybszy i oszczędniejszy na pamięci ale trochę bardziej skomplikowany.

Edytowane przez Bono[UG]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dzięki, to mam teraz kolejne pytanie chyba związane nadal z tym tematem, dlatego nie będę tworzył nowego.

 

Zadanie brzmi:

 

Napisz funkcję znajdzMinimum(...), która wśród elementów tablicy (wczytanych uprzednio od użytkownika) znajdzie element minimalny.

 

Wersja I:

 

Program ma wypisywać znaleziony element minimalny.

 

Wersja II:

 

Program ma wypisywać indeks w tablicy odpowiadający znalezionemu minimum oraz element minimalny.

 

 

 

 

Czy mogę zrobić to zadanie modyfikując to:

 

#include <iostream>

using namespace std;

int main()
{
   int T[100];
   int n, i, m;
   cin >> n;
   for(i = 0; i < n; i++)
   {
       cin >> T[i];
   }

   m = T[0];

   for(i = 1; i < n; i++)
   {
       if(m > T[i])
       {
           m = T[i];
       }
   }

   cout << m << endl;

   return 0;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mam takie coś

 

 

#include <iostream>
using namespace std;

int ZnajdzMinimum(int T[], int n)// nagłówek funkcji
{

int i;// licznik pętli
int min; // minmum

min=T[0];// przyjmuje, że minumum równa się pierwszemu elementowi w tablicy



for(i=1; i<n; i++)//szukanie minumum
{
   if(min>T[i])
   {
       min=T[i];
   }
}

       return min; //zwrócenie wartości

}


int main()
{
   int m; //liczba elementow
   int T[100];

   cin>>m; //wczytanie danych

   for(int i=0; i<m; i++)//kolejne dane do tablicy
   {
       cin>>T[i];
   }

   cout<<"Minimum to: "<<ZnajdzMinimum(T, m);

   return 0;
}

Edytowane przez Roundstic

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tak. Trzeba fragment wyszukujący minimum zamknąć w funkcji.

W zależności od wersji, będzie trzeba dostosować argumenty funkcji oraz to co zwraca. Przydadzą się pojęcia przekazywania argumentów przez wartość i przez referencję.

 

Edit:

Masz złe warunki w pętlach, za dużo razy pętla przechodzi.

Edytowane przez Bono[UG]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Uwaga jakościowa. Zmienne powinno się inicjalizować wartościami zawsze gdy to tylko możliwe. To znaczy zamiast

int i;// licznik pętli
int min; // minmum

min=T[0];// przyjmuje, że minumum równa się pierwszemu elementowi w tablicy

for(i=1; i<n; i++)//szukanie minumum

Lepiej napisać tak:

int min=T[0]; // minmum - przyjmuje, że minumum równa się pierwszemu elementowi w tablicy

for(int i=1; i<n; i++)//szukanie minumum

 

Ponadto - enigmatyczne i jednoliterowe nazwy zmiennych i funkcji to (poza pewnymi wyjątkami) bardzo zła praktyka. Po co zaciemniać kod i doklejać do każdej deklaracji/definicji komentarz, jeżeli można po prostu dobrze rzeczy nazywać?

Komentowanie wszystkiego co popadnie również jest złą praktyką. Ktokolwiek kto miał styczność z cin będzie wiedzieć, że cin >> m; wczytuje. Komentarz zbędny. Tak samo - ktokolwiek, kto pisał funkcje doskonale wie, jak wygląda jej sygnatura/nagłówek - taki komentarz również nic nie wnosi, a jest tylko szumem informacyjnym.

Komentarze się przydają, gdy sam czytelny kod nie wystarcza do przekazania idei. Ale generalnie im ich mniej tym lepiej.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dziękuję za odpowiedzi, komentarze są narazie dla mnie, bo w ten sposób lepiej zapamiętuje( uczę się c++ dopiero od miesiąca dlatego przepraszam za tak banale pytania/ błędy)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

on ma tam małą optymalizacje

min=T[0];

wiec w 1 kroku pętli było by porównanie T[0] > T[0] co zawsze jest fałszywe

 

fragment

int T[100];

może a nawet powinien wygadać

const int N = 100;
int T[N];

a puryści jeżykowi mogą się już domagać

constexpr int N = 100;

 

cin>>m; //wczytanie danych

nigdzie nie sprawdzasz czy ilość danych mieści się w 100 element-owej tablicy int ...

co już jest buffer overflow'em zaliczanym do błędów bezpieczeństwa (witamy w C++ :P)

no i kompletnie nie sprawdzasz poprawności wczytania danych ze strumienia cin

[wprowadź literę zamiast cyfry to się przekonasz]

słowem obsługa błędów nie istnieje

 

jednoliterowe nazwy i, j, k iteratorów pętli stały się już nie pisanym standardem

ale "m" dla liczby "wczytanych danych" jest złym pomysłem (ratuje tylko komentarz)

standardem samych komentarzy niby ma być język Szekspira ... :P

 

wartości nie zainicjowanych zmiennych (nie elementów tablic) de-facto zalezą od implementacji kompilatora dla profilu "debug" będą rożne od "release"

no i oczywiście wartości na różnych kompilatorach mogą być różne ponieważ standard C++ nie ich definicje (a chodżą słuchy że ma zacząć)

z tego powodu hard-koduje się wartości początkowe w ramach internalizacji zmiennych

 

te funkcje są tak krótkie i nigdzie indziej nie wykorzystywane że jest to głównie ćwiczenie :P

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zluzuj, po jaką cholerę męczyć się ze sprawdzaniem poprawności wczytywanych danych do tak prostego programu, gdzie podstawową trudnością jest sam algorytm.

Definiowanie stałej określającej rozmiar tablicy, gdzie będzie wykorzystana raz też lekki przerost formy nad treścią.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

  • Tematy

  • Odpowiedzi

    • Ale bez problemu sobie podróżujesz po UE. No i jakoś te miliony nielegalnych imigrantów też sobie są i podróżują po całej UE. Nikt ich specjalnie nie sprawdza i nie zatrzymuje. Na pewno są lub będą fundacje które w tym pomogą.
    • Witam. Komputer z obudową BQ 500DX w której siedzi na stock ustawieniach Ryzen 5700X na którym zamontowane jest chłodzenie Noctua UH-14S z 2 wentylatorami w push-pull Arctic P12 PWM PST. Temperatury są bardzo spoko jednak przy każdym grzebaniu w budzie, czyszczeniu czy też wymianie pasty raz na 6-12msc to już mnie krew zalewa od tych zapinek i demontażu tejże wieży. Buda dość mała więc AIO na górę to można zapomnieć o ALF'ie, a z przodu by nie pasowało estetycznie... Zresztą to komp żony więc "trochę" to utrudnia (wizualnie musi się podobać, a AIO jej się nie podoba...). 1. W oko wpadł mi ostatnio Arctic 36 ARGB - montaż wentylatorów wydaje się znacznie bardziej komfortowy niż te zapinki, wieża niższa, wydajność na papierze wydaje się OK. Jedyne czego się obawiam to 4 heatpipow i czy ram Corsair Vengeance  LPX wejdzie/zmieści się pod spód (obecnie 2 używane kanały pamięci są pod Noctua/jej wentylatorem). Co sądzicie o tym? 2. Coś innego sensownego jeszcze znajdę gdy stawiamy na komfort montażu/demontażu/czyszczenia, cisza, chłód i wincyj światełek jak na choince...?
    • Ale jak wyjedziesz dalej  jak nie masz  aktualnych dokumentów  ? W jaki sposób znajdziesz prace ,mieszkanie  , jak się zarejestrujesz  jako uchodźca   wojenny  ,  jak  zawnioskujesz  o bonusy   socjalne .... Zwykłe zatrzymanie /konrola przez policję   i nie masz aktualnych papierów i już jesteś zatrzymany . A   na pewno   w najbliższym  czasie będzie   jeszcze wiekszy focus służb na  UA  i kontroli będzie więcej  na ulicach  .      
    • Dzięki za odp. Najnowszy Office w wersji Home & Student. Opcja z RTX 4080 Super na pokładzie bardziej mi odpowiada. Pozwoliłem sobie wczytać koszyk z morele z zeszłego roku: https://www.morele.net/inventory/info/e12f63f5/ Rzuć proszę okiem na powyższy config. Jako CPU wybrałem wówczas Procesor Intel Core i5-13600K, 3.5 GHz, 24 MB, BOX (BX8071513600K), teraz zaproponowałeś Procesor AMD Ryzen 7 7700 AM5 OEM. Na co postawić? Co do mnie, chyba mam większą słabość do Intela, ale odłóżmy sentymenty na bok ; -). Przy wyborze nie kierujmy się też ceną (+/- 300-400zł różnicy mogę przełknąć), ale wydajnością oraz który z tych CPU lepiej będzie współpracować z Nvidią. Inne propozycje także mile widziane. Oczywiście zmiana CPU domagać się będzie zmiany MOBO. Rok temu pod Intela wybrałem: Płyta główna Gigabyte Z790 UD AX Przypomnę, że monitor, który GPU musi obsłużyć to niniejsza bestia: https://mi-home.pl/products/mi-curved-gaming-monitor-34 Dalej, potrzebuję SSD minimum 2T, zasilacz (czy 750W wystarczy, by udźwignąć kompa z peryferiami?), Pamięć Kingston Fury Renegade, DDR5, 32 GB, 6000MHz, CL32 (KF560C32RSK2-32) vs Pamięć Lexar ARES RGB DDR5 32GB (2x16GB) 6000MHz CL30 LD5BU016G-R6000GDLA, Chłodzenie CPU SilentiumPC Fortis 5 140mm (SPC306) vs Chłodzenie procesora Arctic Freezer 36 Black, pozostaje kwestia dobrej obudowy i chłodzenia.
    • jakaś nowa technologia. Niszczyciel oledów. https://ithardware.pl/aktualnosci/technologia_qdel_jest_coraz_blizej_moze_zwiastowac_zmierzch_oledow-32722.html
  • Aktywni użytkownicy

×
×
  • Dodaj nową pozycję...