Sumowanie liczb w pętli

0

Hej,
mam problem ze zrozumieniem błędu w napisanym przeze mnie programie na potrzeby zadania ze spoj-a.
Treść zadania:
Twoim zadaniem jest dodać wszystkie liczby całkowite podane na wejściu.

Wejście
W pierwszym wierszu znajduje się liczba t testów (0 < t < 100) Każdy test opisany jest w następujący sposób. W pierwszym wierszu dana jest liczba n - liczba liczb do zsumowania. Następnie podanych jest n liczb pooddzielanych spacją.

Przykład
Input:
2
5
1 2 3 4 5
2
-100 100

Output:
15
0

Program, który napisałem jest akceptowany jedynie przez kompilator Clang i tylko w wersji, gdy zmienna int wynik znajduje się w głównej pętli for oraz jest do niej przypisana wartość 0 tzn ma postać int wynik=0;. W przypadku samego int wynik; również odpowiedź zostaje odrzucona (co bardzo mnie dziwi, bo przecież domyślnie ma wówczas wartość 0?). Z kolei kompilator GCC wyrzuca błędną odpowiedź za każdym razem. Poniżej treść programu.

#include <stdio.h>
#include <stdlib.h>

int liczbatestow;
int liczbaliczb;

int main(){

  scanf("%d", &liczbatestow);
  for(int i=0; i<liczbatestow; i++){
    scanf("%d", &liczbaliczb);
    int suma[liczbaliczb];
    liczbaliczb--;
    int j = liczbaliczb;
    
    for (;j>=0;j--){    
     scanf("%d", &suma[j]);
    }

    int wynik=0;  

    while(j<=liczbaliczb){
        wynik = suma[j]+wynik;
        j++;
    }

    printf("%d\n", wynik);
  }
  
  return 0;
}
3
podkowiasty napisał(a):

W przypadku samego "int wynik;"" [...] (co bardzo mnie dziwi, bo przecież domyślnie ma wówczas wartość 0?).

untrue

5

Małgosia dostała 5 jabłek. Ile jabłek ma Małgosia?

Potrafisz na to odpowiedzieć? Dokładnie to samo się dzieje jak napiszesz int wynik; zamiast int wynik = 0;.


Używasz tutaj VLA, które nie jest poprawnym kodem w C++ (mimo iż część kompilatorów to dopuszcza):

int suma[liczbaliczb];

Zamiast tego poprawnym podejściem byłoby:

std::vector<int> suma{liczbaliczb};

Ale po prawdzie nawet tego nie potrzebujesz, bo nie potrzebujesz tych liczb składować w tablicy nigdy. W końcu ich jedynym zadaniem jest to, że masz je wczytać, zsumować, i następnie do niczego Ci się już nigdy nie przydadzą. Więc zamiast wczytywać je i zapisywać w tablicy możesz je zwyczajnie zsumować tu i teraz.

3

Jaką wartość ma j przed wejściem do tej pętli? Jaką ma wartość przy pierwszym obiegu pętli?

    while(j<=liczbaliczb){
        wynik = suma[j]+wynik;
4
podkowiasty napisał(a):

aczkolwiek wciąż nie rozumiem czemu wyciągnięcie zmiennej "wynik" poza pętle for powoduje błąd.

A nie wynika to z faktu, że w zmiennej wynik, przy drugim okrążeniu głównej pętli, będziesz zaczynał z sumą nie równą 0, a równą sumie liczb z poprzedniego przypadku testowego?

1

Zmienne liczbaliczb i liczbatestow mogłyby być lokalne.

2

Btw, można to zapisać tak jak poniżej, prościej, zwięźlej, skuteczniej:

#include <stdio.h>

void test() {
  int liczba_liczb;
  scanf("%d", &liczba_liczb);

  int wynik = 0;
  while (liczba_liczb--) {
    int x;
    scanf("%d", &x);
    wynik += x;
  }
  printf("%d\n", wynik);
}

int main(){
  int liczba_testow;
  scanf("%d", &liczba_testow);
  while (liczba_testow--) {
    test();
  }
  return 0;
}

1
#include <stdio.h>

int readint() { int v; scanf("%d",&v); return v; }

int main()
{
  for(int sum=0,testcount=readint();testcount--;printf("%d\n",sum),sum=0)
  {
    for(int valuecount=readint();valuecount--;) sum+=readint();
  }  
  return 0;
}

lub jeżeli już dzielimy na funkcje:

#include <stdio.h>

int readint(int v) { scanf("%d",&v); return v; }
int sumvalues(int sum) { for(int valuecount=readint(0);valuecount--;) sum+=readint(0); return sum; }
int main() { for(int testcount=readint(0);testcount--;) printf("%d\n",sumvalues(0)); return 0; }
1
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int t,n,v,i=0,j,r=0;
    for(scanf("%d",&t);++i<=t;printf("%d\n",r),r=0,j=0)
    for(scanf("%d",&n);++j<=n;scanf("%d",&v),r+=v){}

    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1