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

    • Chociaż faktycznie, niezawarcie umowy o produkcji w Polsce plus offset to wina Plaszczaka który brał wszystko z półki. Z samolotami bez uzbrojenia też się popisał, więc pewnie MON odkręca wszystko i spróbuje podpisać offset + produkcję w ostatniej umowie. Czemu się nie dało w drugiej? A no Plaszczak to Plaszczak co tutaj więcej dodawać.   Jak podpisywać umowy z Niemcami potrafią Czesi którzy w Europie mniej znaczą niż Polska ale jednak potrafią negocjować. Pomysł żeby brać pociski z Korei jako lewar na Niemcy nawet nie skomentuję, bo to poziom debila mógł wymyślić. 
    • Przede wszystkim to przynajmniej moim zdaniem zmiana bez sensu. Co do OC to jest to poblokowany CPU (coś jak non k u intela), więc tylko UV  
    • Fajnie że podałeś typ tego extendera bo z samego zdjęcia tak niskiej jakości trudno wywnioskować. Po zdjęciu wnioskuje, że to ten typ:  https://rbline.pl/extender-poe-pft1320-36882.html    Ogólnie standardowe extendery jakie stosowałem tylko regenerują sygnał nie są switchami czyli nie rozdzielają sygnału. W tym przypadku mają w sobie switcha. Różnica jest taka, że takie urządzenie różni się od typowego switcha tym, że zasilanie bierze z "głównego" switcha POE i nie ma w sobie zasilacza (taka jest idea extenderów). Na stronie którą podlinkowałem jest informacja  Więc można łączyć kaskadowo. Jednak pod 1 wyjście nie podłączysz kolejnych 2 extenderów (pewnie sam z siebie pobiera na własne działanie ze 2 W) oraz 3 kamer (każda np. po 6W). Czyli nie możesz podłączyć urządzeń które w sumie biorą więcej niż 15W.
    • Zamierzam przesiąść się z 13700kf na 7800x3d i chciałbym go posadzić na dobrej płycie x670e w rozsądnej cenie, używki też wchodzą w grę, co byście polecili powiedzmy do kwoty 1500 zł im mniej tym lepiej. Nie śledziłem wątku więc nie wiem jak z oc wyżej wymienionego procka, mocno wyżyłowany czy mozna go jeszcze podkręcić czy lepiej iść w UV? 
    • Pograłem trochę dłużej: VRR i flickering - testowałem Squad gdzie FPS potrafi spaść ze 120 do 80 FPS, zero mignięć. Zablokowałem FPSy w grze na 45 i też zero mignięć. Może są różne wersje softu albo nie wiem, u mnie nie miga. Smużenie - jak się przypatrzy to jest przy ciemnych kolorach, ale na pewno nie taka skala jak kiedyś to było na VA. Na tyle małe że podczas normalnej rozgrywki tego nie widać i można pominąć (pewnie subiektywne, ale mi nie przeszkadza).  Skalibrowałem HDR w apce do kalibracji W11, wyszło że max jasnosć to jakieś 1150-1200 nitów. Wieczorem w grach robi serio robotę, pierwszy raz musiałem oczy zmrużyć patrząc na płomienie  Jakieś tam VA/IPS z podświetleniem krawędziowym to w ogóle nie ma jak porównać... Oby więcej takich Miniled powstawało, pakować więcej stref, walczyć ze smużeniem i super sprzęt za nieduże pieniądze.  Dziwi mnie trochę polityka cenowa, kupiłem go za 1600 zł, a na drugi dzień kosztował 2000 zł, potem 1800 zł i znowu 2000 zł. Chyba malutko ich produkują że ceny tak skaczą. Za 2k to nie warto zdecydowanie, 1600 adekwatna cena.
  • Aktywni użytkownicy

×
×
  • Dodaj nową pozycję...