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

Suma w jezyku C.

Object Storage Arubacloud
+1 głos
660 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 (42,000 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 Nałogowiec (29,290 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 Nałogowiec (29,290 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,640 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 (269,710 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ź 616 wizyt
pytanie zadane 21 maja 2019 w C i C++ przez kkajet007 Nowicjusz (180 p.)
0 głosów
2 odpowiedzi 400 wizyt
pytanie zadane 11 listopada 2017 w C i C++ przez KeJJeJ Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 174 wizyt
pytanie zadane 9 sierpnia 2016 w C i C++ przez Gebann Nowicjusz (160 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

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

...