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

zadanie z ciągiem - zamiast poprawnych wyników -> zakres zmiennej ?

42 Warsaw Coding Academy
0 głosów
1,424 wizyt
pytanie zadane 1 maja 2017 w C i C++ przez Karina Klaś Nowicjusz (180 p.)

Mam problem z pewnym zadaniem z zaliczenia. Zadanie w skrócie brzmiało by dany ciąg liczb całkowitych zapisanych w tablicy sprawdzić funkcjami czy jest rosnący, ile jest liczb jednocześnie parzystych, podzielnych przez 3 i dwucyfrowych, oraz zsumować pierwszy i ostatni element ciągu. Mój kod wygląda tak:

 

#include <iostream>

using namespace std;

int suma (int tab[], int ile)
{
    //suma pierwszego i ostatniego elementu
    int suma1 = 0;
    int i;
    for (i=0; i<ile; i++)
    {
        suma1 = tab[0] + tab[i-1];
        tab++;
    }
    return suma1;
}

int warunek (int tab[], int ile)
{
    //sprawdzenie ile el. jest parzystych, dwucyfrowych i podzielnych przez 3
    int warunek1 = true;
    int i;
    for (i=0; i<ile;i++)
    {
        if (tab[i]%2!=0 && tab[i]%3!=0 && tab[i]<9)
        {
            //cout << tab[i];
            warunek1=false;
            ile++;
        }

    }
    if(!warunek1)
        cout << "brak elementow spelniajacych kryteria";
    else
        cout << "liczba elementow parzystych, dwucyfrowych oraz podzielnych przez 3: "<< tab[i];
}

int jakiCiag(int tab[], int ile)
{
    //sprawdzenie czy ciag malejacy, rosnacy czy inny
    int i;
    bool rosnacy=true;
    bool malejacy=true;

    //sprawdzanie czy rosnacy
    for(i=0; i<(ile-1); i++)
    {
        if (tab[i]>tab[i+1])
        {
           rosnacy=false;
           break;
        }
    }

    //czy malejacy
    for(i=0; i<(ile-1); i++)
    {
        if (tab[i]<tab[i+1])
        {
           malejacy=false;
           break;
        }
    }

    //wypisanie jaki ciag
    if (rosnacy)
    {
        cout << "ciag jest rosnacy";
    }
    else if (malejacy)
    {
        cout << "ciag jest malejacy";
    }
    else
        cout << "ciag jest inny";

    //return jakiCiag(malejacy || rosnacy);
}

int main()
{
    //pytanie o ilosc elementow ciagu
    int i, ile;

	do
	{
		cout<<"podaj ilosc elementow ? : ";
		cin>>ile;
		if (ile<=0)
		{
			cout<<"Podales nieprawidlowa wartosc!"<<endl;
		}
	}
	while(ile<=0);

	//deklaracja i uzupelnienie tablicy ciagu
    int tab[ile];

    for (i=0; i<ile; i++)
    {
        cout << "wprowadz " << i+1 <<" element tablicy: " << endl;
        cin >> tab[i];
    }

    //wyswietlanie informacji
    cout << jakiCiag(tab,ile)<<endl;
    cout << "suma pierwszego i ostatniego elementu to:" << suma(tab, ile) << endl;
    cout << warunek(tab, ile) << endl;

    return 0;
}

a wynik wygląda tak: 

czy może mnie ktoś oświecić co jest źle ? przecież liczby całkowite to int więc dlaczego wynik sumowania jest jakiś dziwny ? Męczę to już 2 dzień, był mały progress ale się skończyły pomysły

3 odpowiedzi

0 głosów
odpowiedź 1 maja 2017 przez Evelek Nałogowiec (28,960 p.)
suma1 = tab[0] + tab[i-1]; Czyli dla i = 0 dodajesz element o indeksie -1.
0 głosów
odpowiedź 1 maja 2017 przez redie Obywatel (1,490 p.)
int suma (int tab[], int ile)
{
    return (tab[0]+tab[ile-1]); // suma pierwszego i ostatniego elementu naszej tablicy :)
}

int warunek (int tab[], int ile) // twoja funkcja nie zwracała wartości (int - zwracasz liczbę)
{
    int licznik=0;
    for(int i=0;i<ile;i++)
    {
        if(tab[i]%2==0 && tab[i]%3==0 && tab[i]>=10)
            licznik++;
    }
    return licznik;
}
string jakiCiag(int tab[], int ile)
{
    bool type = false;
    for(int i=0;i<ile-1;i++)
    {
        if(tab[i]>tab[i+1])
            type = true;
        else
            type=false;
    }
    if(type) return "rosnący";
    else return "nie rosnący";
}

Poprawiłem kod :) Teraz będzie działać :)

Jak sprawdzasz czy ciąg jest rosnący, to tylko tyle wystarczy, nie musisz sprawdzać czy jest malejący bo jak pierwszy warunek się nie sprawdzi to masz odpowiedź do zadania ;)

Dwa: W sumie(funkcji), do zmiennej wpisujesz tab[0] + tab[i-1] (gdzie i zaczynasz od 0) i nie potrzebujesz tej informacji :) Pierwszy element z ostatnim to tab[0] + tab[ile-1] ;)

komentarz 1 maja 2017 przez Karina Klaś Nowicjusz (180 p.)
próbowałam również z ile ale też wypisywało ciąg znaków co z suma nic wspólnego nie miał

w zadaniu jest napisane, że jeśli ciąg jest rosnący to ma wypisać, ze rosnący; jeśli malejący to wypisuje malejący, jeśli inny to wypisze inny, Więc moim zdaniem tak to musiało być ;)

w każdym razie dziękuję za pomoc :) programować nienawidzę, ale jestem zmuszona polubić (studia informatyczne) więc jak lubić to po całości
komentarz 1 maja 2017 przez redie Obywatel (1,490 p.)
To równie dobrze możesz zrobić dwie funkcje sprawdzające czy funkcja malejaca, czy rosnąca.

I w tej co ja stworzyłem(string) dać po prostu tak:

if(rosnacy()) return "rosnący";

else if(malejacy()) return "malejący";

else return "inny";

i w funkcjach rosnacy i malejacy (typu bool) sprawdzasz sobie czy rosnie czy maleje :)
komentarz 1 maja 2017 przez Evelek Nałogowiec (28,960 p.)
Sprawdzanie rodzaju ciągu można jeszcze ułatwić korzystając z is_sorted().
komentarz 1 maja 2017 przez Karina Klaś Nowicjusz (180 p.)
to już będzie zaawansowane a ja jestem laik ;)
komentarz 1 maja 2017 przez redie Obywatel (1,490 p.)
Też racja :) Ale tam chyba uzyskamy true dla rosnącej i false dla innych (malejące i nie monotoniczne) ?
komentarz 1 maja 2017 przez Evelek Nałogowiec (28,960 p.)
Domyślnie is_sorted() korzysta ze znaku <, czyli zwraca True, jeśli a<b, b<c itd. Dla funkcji malejącej możemy napisać w przypadku vectora np. is_sorted(vec.cbegin(), vec.cend(), [](int x, int y) { return x > y; });
0 głosów
odpowiedź 3 maja 2017 przez Karina Klaś Nowicjusz (180 p.)

jak mogę jeszcze wyciągnąć i wypisać liczby, które spełniają warunek ? wyświetla mi ciąg znaków a nie konkretne liczby. Zliczanie działa już poprawnie, ale...

int warunek (int tab[], int ile)
{
    //sprawdzenie ile el. jest parzystych, dwucyfrowych i podzielnych przez 3
    int licznik = 0;
    int i;
    for (i=0; i<ile;i++)
    {
        if (tab[i]%2==0 && tab[i]%3==0 && tab[i]>=10 && tab[i]<100)
        {
            licznik++;

        }
       // else

    }
    if (licznik)
        cout << "liczba elementow parzystych, dwucyfrowych oraz podzielnych przez 3: "<< licznik << " sa nimi: " << tab[i];
    else
        cout << "brak elementow spelniajacych kryteria";
    return licznik;
}

wypisuje mi też poprawnie czy ciąg rosnący czy malejący, ale też dodaje ciąg cyfr. Już nie mam siły na to :(

komentarz 3 maja 2017 przez Karina Klaś Nowicjusz (180 p.)
o vectorach się jeszcze nie uczyłam, więc muszę to zrobić bez tego. Nauka skończona na dynamicznej alokacji i wskaźnikach.
komentarz 3 maja 2017 przez redie Obywatel (1,490 p.)
void warunek(int tab[],int ile)
{
int licznik = 0;
    int i;
    for (i=0; i<ile;i++)
    {
        if (tab[i]%2==0 && tab[i]%3==0 && tab[i]>=10 && tab[i]<100)
        {
            licznik++;
        }
    }
    if(licznik>0){
int liczby[licznik];
int x = 0;
    for (i=0; i<ile;i++)
    {
        if (tab[i]%2==0 && tab[i]%3==0 && tab[i]>=10 && tab[i]<100)
        {
            liczby[x]=tab[i];
x++;
        }
    }
            cout << "Liczby spelniajace warunek: ";
        for(i=0;i<licznik;i++)
        {
            cout << liczby[i] << " ";
        }
    cout << endl;
    }
}

 

1
komentarz 3 maja 2017 przez Karina Klaś Nowicjusz (180 p.)
komentarz 3 maja 2017 przez 10kw10 Pasjonat (22,880 p.)

znow sie przyczepie :D

int liczby[licznik];

tak sie nie tworzy dynamicznej tablicy.

komentarz 3 maja 2017 przez redie Obywatel (1,490 p.)
Wiem, że można int* liczby = new int[licznik];

Ale jak koleżanka tak sobie to robi tez może być :D Przy dynamicznym alokowaniu pamięci trzeba pamietać o jej usuwaniu :D Czyż nie :D ?

Podobne pytania

0 głosów
1 odpowiedź 4,080 wizyt
pytanie zadane 24 września 2017 w C i C++ przez ebone Nowicjusz (140 p.)
0 głosów
1 odpowiedź 1,486 wizyt
pytanie zadane 18 października 2016 w C i C++ przez czujek22 Dyskutant (7,670 p.)
0 głosów
2 odpowiedzi 2,499 wizyt

93,383 zapytań

142,382 odpowiedzi

322,539 komentarzy

62,744 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
...