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ę.

  • Popularne aktualnie

  • Tematy

  • Odpowiedzi

    • Cześć,  Składałem wczoraj znajomemu komputer. Z ważniejszych części: Mobo msi pro z790-p wifi Cpu i5 12600kf Gpu Gigabyte GeForce RTX 4060 Eagle OC 8GB GDDR6 Zasilacz Gigabyte P750GM Reszta chyba mało istotna. Po złożeniu wszystko śmigało. Windows się zainstalował, sterowniki do płyty głównej też. Niestety w trakcie instalacji sterowników do karty graficznej komputer się resetuje i już nie chce się włączyć. Wyskakuje naprawa systemu, która nic nie daje, ewentualnie można przywrócić system, to się włącza. I tak w kółko. Zrobiłem update biosu płyty głównej, bez zmian. Sprawdzałem CPU i ram jakimiś programami do sprawdzania, temperatury są super, nie wywala żadnych błędów. Ale gdy tylko instaluję sterowniki do GPU, następuje śmierć  Mam już zero pomysłów o co może chodzić. Spotkał się ktoś kiedyś z takim problemem?   
    • Ostatni duży patch był jeszcze w styczniu, od tamtego czasu cisza, a jak pojawił się jakiś patch z pierdołami. Ta gra jest martwa.
    • Już jak tak się bawimy to skoro jesteś tylko pilotem, to Twoim zadaniem jest wyłącznie latanie, sprawy techniczne, rejestracja lotu itd. realizuje ktoś inny. Natomiast operator drona to osoba, która odpowiada również za całą techniczno-organizacyjną otoczkę lotu dronem   Dlatego napisałem, żebyś przeczytał ze zrozumieniem, bo wszystkie przywołane przepisy i to co wielokrotnie pisałem o tym właśnie mówią, że latać możesz, ale równie dobrze może się to wiązać z konsekwencjami od osób, których prywatność możesz naruszyć wykonywaniem swoich czynności... A czy kręcąc z chodnika kamerą mieliby podgląd na to jak wyglądają działania na całej posesji?
    • Kiedyś jak zacząłem chodzić na siłownię w wieku 17 lat to jak widziałem typów co mieli po 30 lat to od razu myślałem, Jezu co za stary dziad, że to się jeszcze rusza.
    • Ale kim przeprowadzą tę ofensywe? Nie spotkałem się z opiniami analityków żeby mieli jakieś wolne niezagospodarowane wojska w tym momencie. 
  • Aktywni użytkownicy

×
×
  • Dodaj nową pozycję...