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

Suma w jezyku C.

+1 głos
173 wizyt
pytanie zadane 21 listopada 2021 w C i C++ przez Raven2221 Nowicjusz (200 p.)

Witam!

Jestem studentem pierwszego roku informatyki, i dopiero zaczynam przygode z programowaniem. Mam problem z jednym, dosc prostym zadaniem - mam napisac program, ktory bedzie obliczal sume podanej liczby naturalnej. Dla liczby mniejszej od 0 program ma prosic o podanie innej liczby (nie musi wyswietlac komunikatu) Napisalem cos takiego:


#include <stdio.h>
#include <math.h>
int main(){
    int n, suma, i;
    scanf("%d", &n);
    i=0;
    while(n<0){
        scanf("%d", &n);
    }
    for(suma=0; i!=(n+1); i++){
        suma=suma+i;
    }
    printf("%d", suma);
    
}

Program ogolnie dziala - co by nie wpisac ladnie wszystko sumuje. Problem jest tylko w tym, ze zadania sa sprawdzane automatycznie - sa automatycznie poddawane kilku testom. Moj program nie zdaje jednego testu - prawidlowy wynik to 6, a moj program wylicza 0. Niestety nie wiem co to za test, i nie wiem co jest nie tak w tym kodzie.

 

PS: Z gory przepraszam za brak Polskich znakow, pisze z anglojezycznego linuxa.

2
komentarz 21 listopada 2021 przez tkz Nałogowiec (41,900 p.)

bedzie obliczal sume podanej liczby naturalnej

Co to znaczy?

komentarz 21 listopada 2021 przez Raven2221 Nowicjusz (200 p.)
przeniesione 21 listopada 2021 przez ScriptyChris

Dobrze, podaje zatem przyklad zeby bylo jasniej

Σ5 = 1+2+3+4+5 = 15. Takie dzialanie ma rozwiazywac moja petla. Liczba naturalna jest 5, i moja petla ma wyznaczyc jej Σ.

1
komentarz 21 listopada 2021 przez Oscar Pasjonat (24,050 p.)

6 = 1+2+3 sprawdzałeś ręcznie co twój program piszę jak się poda 3 na wejście?

Dla testów możesz instrukcję print przenieść, a nawet lepiej, skopiować do wnętrza pętli - zobaczysz jakie są kolejne sumy.

Troche dziwnie napisałeś kod

scanf();
while (n<0) {
    scanf();
}

Jeśli instrukcje mają się wykonać co najmniej raz bardziej naturalne jest wykorzystanie pętli do-while

do {
    scanf();
} while (n<0)

Zerowanie zmiennych i i suma masz tak bardzo dziwnie. Zmienną sterującą pętli zwykle inicjuje się na wejściu pętli, często ją się tam nawet deklaruje.

Z kolei suma - wypadałoby ją zainicjować wyraźnie przed pętlą. Oczywiście tak jak jest powinno działać, ale jakoś dziwnie ten kod wygląda.

Można też wyzerować obie zmienne w inicjalizacji pętli

for (suma = 0, i = 0; ...

PS. Suma liczb od 1 do N włącznie to N*(N+1)/2 - łatwiej będzie sprawdzać.

komentarz 22 listopada 2021 przez Raven2221 Nowicjusz (200 p.)

Troszke zmienilem kod, ale niestety, nadal nie dziala jak trzeba. Teraz wyglada tak:

#include <stdio.h>
#include <math.h>
int main(){
    double n, suma;
    scanf("%lf", &n);
    while(n<0){
        scanf("%lf", &n);
    }
    suma=n*((n+1)/2);
  
    printf("%.lf", suma);     
}


Zmienilem int na double bo po zmianie wczesniejszego kodu wyskakiwal dodatkowy blad. Kombinowalem tez z nawiasami we wzorze, niestety bezskutecznie. Teraz jest znow to samo co poprzednio:

Probowalem recznie wpisywac 3, program wylicza dobrze, czyli 6. 

PS: Troche celowo nie uzylem petli do-while, bo to tresc nastepnego zadania- trzeba przerobic ten kod z wykorzystaniem petli do-while :) 

komentarz 23 listopada 2021 przez Oscar Pasjonat (24,050 p.)
edycja 23 listopada 2021 przez Oscar

Trochę niepotrzebne użyłeś nawiasów. Jeśli n jest nieparzyste to n+1 jest parzyste i odwrotnie. Stąd iloczyn n * (n+1) jest zawsze parzysty więc dzieli się przez 2.

Jeśli dzielisz jeden z tych czynników to dostajesz ułamek i trzeba użyć liczb zmiennoprzecinkowych.

Dopisz może '\n' w printfie - tak zwyczajowo program powinien kończyć swoje wyniki nową linią. Nie wiadomo dokładnie jak działają te testy.

komentarz 23 listopada 2021 przez Raven2221 Nowicjusz (200 p.)
Probowalem tez bez tego dodatkowego nawiasu, efekt jest ten sam. I z \n tez to samo. Zaczynam podejrzewac, ze to w zadaniu jest blad, nie wiem czemu ciagle w tym tescie wychodzi 0 zamiast 6.

2 odpowiedzi

+1 głos
odpowiedź 22 listopada 2021 przez TOM_CPP Pasjonat (22,320 p.)

bedzie obliczal sume podanej liczby naturalnej

Zamiast pętli możesz użyć wzoru n(n+1)/2 i zamiast liniowej mieć stałą złożoność obliczeniową.

0 głosów
odpowiedź 21 listopada 2021 przez Wiciorny Ekspert (217,990 p.)

Możesz jasniej napisać co twoja pętla for robi? :) 

  for(suma=0; i!=(n+1); i++){
        suma=suma+i;
    }

zwróć uwagę na uzycie sumy.

Podobne pytania

0 głosów
1 odpowiedź 162 wizyt
pytanie zadane 21 maja 2019 w C i C++ przez kkajet007 Nowicjusz (180 p.)
0 głosów
2 odpowiedzi 297 wizyt
pytanie zadane 11 listopada 2017 w C i C++ przez KeJJeJ Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 121 wizyt
pytanie zadane 9 sierpnia 2016 w C i C++ przez Gebann Nowicjusz (160 p.)

87,894 zapytań

136,484 odpowiedzi

304,291 komentarzy

58,280 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...