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

Suma w jezyku C.

VPS Starter Arubacloud
+1 głos
630 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,120 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ź 586 wizyt
pytanie zadane 21 maja 2019 w C i C++ przez kkajet007 Nowicjusz (180 p.)
0 głosów
2 odpowiedzi 390 wizyt
pytanie zadane 11 listopada 2017 w C i C++ przez KeJJeJ Nowicjusz (150 p.)
0 głosów
2 odpowiedzi 170 wizyt
pytanie zadane 9 sierpnia 2016 w C i C++ przez Gebann Nowicjusz (160 p.)

92,455 zapytań

141,263 odpowiedzi

319,100 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...