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

Problem z zadaniem Proszę o pomoc

Object Storage Arubacloud
0 głosów
1,105 wizyt
pytanie zadane 8 października 2017 w C i C++ przez Artur313 Użytkownik (790 p.)
edycja 8 października 2017 przez Eryk Andrzejewski

Witam uprzejmie. Prosiłbym o pomoc w jednym zadaniu z C++, a mianowicie:

Dany jest ciąg n-elementowy liczb całkowitych. Opracuj algorytm, narysuj schemat blokowy programu wypisującego najmniejszą różnicę pomiędzy dwoma kolejnymi liczbami w ciągu. Wstaw punkty przerwania w miejscach wybranych przez siebie, śledź wybrane zmienne.

Póki co mój kod wygląda tak :

#include <iostream>

using namespace std;

int main()

{
    int ilosc_wyrazow,x1,x2,i=1;

    cout << "Witaj w programie obliczajacym najwieksza roznice w ciagu: "<<endl;
    cout <<"podaj ilość wyrazow w ciagu: "<<endl;
    cin >> ilosc_wyrazow;

     while(i<=ilosc_wyrazow)
    {
        i++;
        cout <<"wpisz liczbe  "<<i-1<<":"<<endl;
    cin >>x1;
    x2=x1;

    }

    return 0;
}


Ale nie mam pojęcia co dalej. Z góry dziękuję.

komentarz 8 października 2017 przez Artur313 Użytkownik (790 p.)
przepraszam tam było najmniejszą
komentarz 8 października 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Kod proszę umieszczać w bloczek i proszę dbać o interpunkcję oraz ortografię. smiley

komentarz 8 października 2017 przez Szahid Pasjonat (20,930 p.)
Mam 2 koncepcje. Jedna jest bardziej złożona obliczeniowo a druga chyba bardziej optymalna ale wymaga dołęczenia biblioteki < limits >

Może być ta druga ?
komentarz 8 października 2017 przez Artur313 Użytkownik (790 p.)

Dziękuję za rady językowesmiley na pewno skorzystam w przyszłości a czy byłbyś w stanie pomóc mi z programem??

komentarz 8 października 2017 przez Artur313 Użytkownik (790 p.)
Może być każda :)

2 odpowiedzi

0 głosów
odpowiedź 8 października 2017 przez Igor Użytkownik (740 p.)

Może być? Zapewne można to zrobić ładniej ale zapewne zależy ci na czasiesmiley


#include <iostream>
#include <cmath>
#include <vector>

using namespace std;

int main()

{
    int ilosc_wyrazow,x,y,z,element0,element1;
    bool first_time=true;

    vector<int>tab;

    cout << "Witaj w programie obliczajacym najwieksza roznice w ciagu: "<<endl;
    cout <<"podaj ilosc wyrazow w ciagu: ";
    cin >> ilosc_wyrazow;

     for(int i=0;i<ilosc_wyrazow;i++)
    {
        cout<<"Wpisz liczbe "<<i+1<<": ";
        cin>>x;
        tab.push_back(x);
        if(i>0)
        {
            y=abs(tab[i-1]-tab[i]);
            if(z>y||first_time==true)
            {
                    z=y;
                    element0=i;
                    element1=i+1;
                    first_time=false;
            }
        }
    }

    cout<<"Najmniejsza roznica to: "<<z<<" pomiedzy "<<element0<<" i "<<element1;

    return 0;
}

Chyba działa laugh

 

komentarz 8 października 2017 przez Artur313 Użytkownik (790 p.)

ok tylko jak dasz rade to mi to wytłumacz smiley bo ja jestem na pierwszym roku informatyki i to jedno z zadań i pewnie  wykładowca będzie chciał będzie chciał żebym to wyjaśnił a szczerze średnio to rozumiem smiley

komentarz 8 października 2017 przez Artur313 Użytkownik (790 p.)

sorki za błędy ale szybko piszę smiley bo jak wspomniał kolega zależy mi na czasie smiley 

komentarz 8 października 2017 przez Igor Użytkownik (740 p.)
Mogę ci to wytłumaczyć:

#include <vector>

http://cpp0x.pl/kursy/Kurs-STL-C++/Kontener-tablicy-std-vector/119

To jest lista czyli taka tablica która ma "elastyczna liczbę elementów" jak dodasz element push.back(/*wartość*/); to maksymalna ilość ... a dobra to jest struktura danych

https://www.youtube.com/watch?v=_V7a1Gwuj5k

Obejrzyj fragmęt o liście

abs(/*działanie*/); zwraca wartość bezwzględną działania (po to <cmath>)

Trochę chaotycznie ale napisz czego nie wiesz konkretnie. Sorrki nie umiem tłumaczyć, ale jak zadasz pytanie to postaram się na nie wyczerpująco odpowiedzieć
komentarz 8 października 2017 przez Igor Użytkownik (740 p.)

Można bez <cmath> i wtedy zamiast abs napiszesz później

if(y<0)
{
y*=-1;
}

I to chyba rozumierz

 

0 głosów
odpowiedź 8 października 2017 przez Szahid Pasjonat (20,930 p.)

Na początek tworzysz 3 zmienne. Dzwie na porównane liczby i 1 na różnice. Inicjalizujesz zmienna rożnica największą zmienną jaką może pomieścić( tu używasz biblioteki limits)

A dalej to czysta matematyka i warunek logiczny

 

PS Napisałem przykładowy kod. Część matematyczna wygląda tak

while(cin>>l1 && cin>>l2)
	{ 
		if (abs(l1 - l2) < roznica)
			roznica = abs(l1 - l2);
	}

Postaraj się napisać dalej sam. Jak nie wyjdzie to wklei to co napisałeś i pokaże Ci reszte 

 

komentarz 8 października 2017 przez Szahid Pasjonat (20,930 p.)

Dobra. Nie mam czasu siedzieć dłużej przed kompem. Łap cały. 

#include<iostream>
#include<limits>
#include<cmath>


using namespace std;

int main()
{

	int l1, l2;
	int roznica= numeric_limits<int>::max();
	cout << "Podaj ciąg lkiczb ( wartość nieliczbowa przerywa wprowadzanie)" << endl;

	while(cin>>l1 && cin>>l2)
	{ 
		if (abs(l1 - l2) < roznica)
			roznica = abs(l1 - l2);
	}

	cout << "Najmniejsza roznica " <<roznica<< endl;
	

	return 0;
}

 

komentarz 8 października 2017 przez Artur313 Użytkownik (790 p.)

Bardzo dziękuje smileyaczkolwiek czy istnieje jakaś prostsza wersja ?? Bo jak mówiłem dopiero zaczynam a c++ znam tylko podstawy smiley

komentarz 8 października 2017 przez Szahid Pasjonat (20,930 p.)
Jestem na 1 roku na PWr ale my na zajęciach nawet nie doszliśmy do cin także cieżko mi określić co Ty potrafisz . Powiedz jakie narzędzia znasz żebym wiedział czego mogę użyć
komentarz 8 października 2017 przez Artur313 Użytkownik (790 p.)

U nas to wygląda tak że w ciągu dwóch zajęć od algorytmów do warunków i pętli smiley Choć prawie nikt nie nadąża ja co prawda skończyłem technika i przynajmniej trochę ogarniam ale też  mam problem nadążyć a podobne zadania na wykładach robiliśmy przy użyciu samych warunków i pętli smiley

komentarz 9 października 2017 przez mokrowski Mędrzec (155,460 p.)
edycja 9 października 2017 przez mokrowski

Dobra. Nie mam czasu siedzieć dłużej przed kompem. Łap cały. 

....

A co jeśli wprowadzisz 1 daną?

A co jeśli ilość danych będzie nieparzysta?

A co jeśli dane wprowadzone to wartości z: numeric_limits<int>::max()  i numeric_limits<int>::min()? Jaka będzie różnica ?

komentarz 9 października 2017 przez Szahid Pasjonat (20,930 p.)
Ad 1 wtedy nie będzie można liczyć różnicy co jest niezgodne ze specyfiką

Ad2 Tu możesz mieć rację. Jeszcze to sprawdzę

Ad 3 W zadaniu nie ma określonego przedziału liczb na jakim operujemy. W podanym przez Ciebie przypadku uzyskamy UB ponieważ zmienna różnica tego nie pomieści
komentarz 9 października 2017 przez Szahid Pasjonat (20,930 p.)

Ad2 Miałeś rację. Z zadania nie wynikało że ilość podanych liczb musi być parzysta. Dziękuje za zwrócenie uwagi. Poprawiam kod

#include<iostream>
#include<limits>
#include<cmath>


using namespace std;

int main()
{

	int l1, l2;
	int roznica= numeric_limits<int>::max();
	int max= numeric_limits<int>::max();
	cout << "Podaj ciąg lkiczb ( wartość nieliczbowa przerywa wprowadzanie)" << endl;

	cin >> l1;
	cin >> l2;

	do
	{ 
		if (abs(l1 - l2) < roznica)
			roznica = abs(l1 - l2);
		l1 = l2;
	} while (cin >> l2);

	cout << "Najmniejsza roznica " <<roznica<< endl;
	

	return 0;
}

 

komentarz 9 października 2017 przez mokrowski Mędrzec (155,460 p.)

Ja napisał bym to tak. Starałem się nie używać zaawansowanych konstrukcji oprócz rzutowania:

#include <iostream>
#include <limits>

int main() {
    long roznica_liczb = std::numeric_limits<long>::max();
    long roznica_biezaca;
    int pierwsza_liczba;
    int druga_liczba;

    std::cout << "Wprowadzanie danych kończysz przez <Ctrl + d> (Gnu/Linux)"
        << " lub <Ctr + z> (MS Windows) w nowej linii: ";

    std::cin >> pierwsza_liczba;

    while(std::cin >> druga_liczba) {
        roznica_biezaca = abs(static_cast<long>(pierwsza_liczba)
                - static_cast<long>(druga_liczba));
        if(roznica_biezaca < roznica_liczb) {
            roznica_liczb = roznica_biezaca;
        }
        pierwsza_liczba = druga_liczba;
    }

    if(roznica_liczb == std::numeric_limits<long>::max()) {
        std::cerr << "Dla ilości liczb poniżej 2,"
            << " nie mogę obliczyć różnicy.\n";
    } else {
        std::cout << "Najmniejesza róźnica liczb wynosi "
            << roznica_liczb << ".\n";
    }
}

 

Podobne pytania

–2 głosów
2 odpowiedzi 868 wizyt
0 głosów
0 odpowiedzi 99 wizyt
0 głosów
3 odpowiedzi 118 wizyt
pytanie zadane 26 grudnia 2016 w PHP przez Wonderpol Gaduła (3,730 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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!

...