Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

patryk2205

Program c++, wypisywanie ciągu liczbowego

Rekomendowane odpowiedzi

Witam,

Mam do napisania program, który będzie wypisywał n wyrazy ciąg liczbowy: -4,-1,2,5.... itd czyli o 3 większa każda liczba. Napisałem program ale oczywiście nie działa jak należy. Generalnie jak mam coś zrobić przy użyciu pętli to po prostu nie daje rady. Zna ktoś jakiś dobry poradnik dotyczący pętel w C++ i czy mógłby ktoś pomóc i powiedzieć co jest źle?

 

#include<iostream>

using namespace std;

int main()
{
   int a, n, i;

   cout<< "Podaj n:";
   cin >> n;

   a=-4;

       if(n<0)
       {
           cout<<"Zle dane";
       }
       else
       {
           for(i=1; i<=n; i++)
           {
               cout << a;
               a = a + 3;


           }

       }

    return 0;

}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mnie działa za pomocą DEV C++ >> projekt konsolowy C++ .

#include <iostream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

using namespace std;

int main(int argc, char** argv) {
    int a, n, i;

   cout<< "Podaj n:";
   cin >> n;

   a=-4;

       if(n<0)
       {
           cout<<"Zle dane";
       }
       else
       {
           for(i=1; i<=n; i++)
           {
               cout << a;
               a = a + 3;


           }

       }

return 0;
}

 

Wyświetlił mi sześć liczb, pierwsza to -4, każda następna jest o 3 większa.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Hm... ja używam CodeBlocka. W moim przypadku gdy za n podaje liczbe 3 to mi wypisuje -4-12 a jak za n-5 to wtedy wypisuje -4-1258

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Czyli problem leży z formatowaniem ciągu, logika jest ok; spróbuj:

 

#include <iostream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

using namespace std;

int main(int argc, char** argv) {
           int a, n, i;

   cout<< "Podaj n:";
   cin >> n;

   a=-4;

       if(n<0)
       {
           cout<<"Zle dane";
       }
       else
       {
           for(i=1; i<=n; i++)
           {
               cout << a << endl;
               a = a + 3;


           }

       }

       return 0;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Hm... ja używam CodeBlocka. W moim przypadku gdy za n podaje liczbe 3 to mi wypisuje -4-12 a jak za n-5 to wtedy wypisuje -4-1258

 

dobrze ci wypisuje, tylko nie dodałeś przecinków między liczbami. A druga sprawa to w załączniku.

post-590401-15370195429102_thumb.png

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Kurde no tak bo spacji nie ma i się zlewają cyfry :), czyli dobrze mam. Dzięki za pomoc mimo wszystko ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Kosmetyczne zmiany

#include <iostream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

using namespace std;

int main(int argc, char** argv) {
 int a, n, i;

 cout<< "Podaj n: "; //spacja po : dla czytelności
 cin >> n;

 if(n<0)
 {
   cout<<"Zle dane";
   return 0;  //dodane wyjście z funkcji
 }
   //usunięcie else

 a=-4;  //przeniesione przypisanie wartości do a
 for(i=0; i<n; i++)  //zmiana wartości początkowej i warunku
 {
   cout << a << endl;
   a = a + 3;
 }

 return 0;
}

 

Warto się od początku przyzwyczaić, że w C/C++ pętle for iteruje się zwykle od 0. Jest to bardzo istotne przy tablicach, gdzie licznik pętli wykorzystuje się do odwołań do konkretnych pozycji w tablicy.

int tab[25] to deklaracja tablicy o 25 elementach. tab[0] to odwołanie się do jej pierwszego elementu, tab[24] to ostatni element tablicy, tab[25] to odwołanie do nieistniejącego 26 elementu tablicy.

To w sumie największa mina w tym kodzie, na któą możesz w przyszłości wdepnąć.

 

Konstrukcja if else jest tutaj dla mnie nie na miejscu. Przy większych programach zaciemnia kod, można się zgubić co w którym bloku warunku siedzi i dlaczego.

Jeżeli sprawdza się poprawność danych i wyjdzie, że są złe, to lepiej od razu wyjść z funkcji lub programu. Czytając kod będzie dużo łatwiej zorientować się co autor miał na myśli, ba nawet samemu można się zgubić i nie pamiętać od czego są te zamknięcia bloków gdzieś na końcu kodu ;)

 

Przeniosłem też przypisanie a=-4; Chyba logiczniej jest jak po wczytaniu danych od razu są sprawdzane pod względem poprawności.

Przy większych programach mogłoby dojść do sytuacji, że między wczytaniem danych, a ich sprawdzeniem zrobi się masę niepotrzebnych operacji.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
' date='15 Wrzesień 2018 - 16:28' timestamp='1537021738' post='15222490']

tab[25] to odwołanie do nieistniejącego 26 elementu tablicy.

To w sumie największa mina w tym kodzie, na któą możesz w przyszłości wdepnąć.

Mina dodatkowo o tyle niefajna, że przy takim wyjściu poza zakres mamy sytuację "niech się dzieje wola nieba" - program może się wysypać, odczyt takiej wartości zwróci bzdurne wartości, a zapis na takim indeksie... może jeszcze bardziej odjechane rzeczy spowodować.

 

W przypadku używania cywilizowanych tablic std::array/std::vector kod biblioteki standardowej może posiadać asercje sprawdzające takie rzeczy - i nawet przy użyciu operatora [] zwrócić jasny błąd, że wychodzimy poza zakres. Takie coś, jeżeli jest, włącza się dodatkowym makrem, albo automatycznie w konfiguracji debug.

W przypadku gdy nie mamy pewności czy wyjdziemy poza zakres, można użyć .at(indeks), który w przypadku błędu rzuca wyjątek, co działa niezależnie od konfiguracji.

 

Oprócz tego parę ogólnych sugestii dla autora:

 

Deklarowanie wszystkich lokalnych zmiennych na samym początku funkcji to zła praktyka. Nowe zmienne powinno wprowadzać się najpóźniej jak tylko się da - i od razu inicjalizować je wartościami, jeżeli tylko się da.

 

A więc - zamiast

int main(int argc, char** argv) {
 int a, n, i;

 // ...

 a=-4;
 for(i=0; i<n; i++)
 {
 // ...
}

 

preferuje się

int main(int argc, char** argv) {
 int n;

 // ...

 int a=-4;
 for(int i=0; i<n; i++)
 {
 // ...
}

 

Zamiast for'a bardziej pasuje while - w końcu i tak w ciele pętli do niczego indeks nie jest używany.

Fajnie też od samego początku nauczyć się sensownie nazywać zmienne - to pomaga każdemu, także twórcy kodu ;)

 

A z mało przydatnych informacji - return 0 na końcu maina w c++ jest niepotrzebne ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...