• 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

0 głosów
1,603 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,970 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,970 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,970 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,970 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 (158,580 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,970 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,970 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 (158,580 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 1,417 wizyt
0 głosów
0 odpowiedzi 120 wizyt
0 głosów
3 odpowiedzi 165 wizyt
pytanie zadane 26 grudnia 2016 w PHP przez Wonderpol Gaduła (3,730 p.)

93,426 zapytań

142,421 odpowiedzi

322,647 komentarzy

62,787 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...