Problem z kodem

0
#include<cstdio>

int main(){
    unsigned int suma, l;
    short z, n;
    scanf("%d", &z);
    while(z--){
             suma = 0;
             scanf("%d", &n);
                         if(n>1) suma+=(n-1);
                         while(n--){
                                    scanf("%d", &l);
                                    std::cin>>l;
                                    suma+=l;
                         }
    printf("%d\n", suma);
    }
    return 0;
}                         

Program nie działa do końca poprawnie, sądze że coś źle robię ze scanf()?

0

Staraj się opisywać dokładnie swój problem. Niewiele osób ma ochotę dociekać co Twój program ma tak właściwie robić i co oznacza "złe działanie".
Co do scanf(), to nie jestem fanem używania tej funkcji do wczytywania wejścia od usera. Wielki worek problemów, szczególnie jeśli user jest kreatywny. Proponuję użyć fgets() do wczytania linii i prawidłowo wykorzystać strtol() do konwersji. Przy okazji załatwisz sobie prawidłową kontrolę wejścia. No i najważniejsze, będzie działać.

0
#include<cstdio>

int main(){
    unsigned int suma, l;
    short z, n;
    scanf("%d", &z);
    while(z--){
             suma = 0;
             scanf("%d", &n);
                         if(n>1) suma+=(n-1);
                         while(n--){
                                    scanf("%d", &l);
                                    suma+=l;
                         }
    printf("%d\n", suma);
    }
    return 0;
}              

Program ogólnie nie działa poprawnie, kiedy zapodam do z 5 to pętla kończy swoje działanie po pierwszym przebiegu, o co kaman?

1

Po pierwsze: nie mieszaj. Albo strumienie, albo printf/scanf.

Z formatowania wnioskuję że to Dev-C++. Tylko on tak ohydnie proponuje wcięcia. deva powinni dawno z obiegu w internecie wycofać, albo wydać kolejną wersję, tyle żeby był to faktycznie Code::Blocks tylko pod nazwą "dev-c++", wtedy nawet na maturze by można go wybrać (dzięki dopiskowi "lub nowszy").

Do debugowania można też użyć printfów, żeby po prostu wypisywał o jakie części kodu zahacza i jakie są wtedy wartości zmiennych.

A co do problemu: http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

**modifiers**
Specifies a size different from int (in the case of d, i and n), unsigned int (in the case of o, u and x) or float (in the case of e, f and g) for the data pointed by the corresponding additional argument:
__h : short int (for d, i and n), or unsigned short int (for o, u and x)__
l : long int (for d, i and n), or unsigned long int (for o, u and x), or double (for e, f and g)
L : long double (for e, f and g)

Do shortów odwołujesz się przez %hd

0

Okey, teraz jak wprowadze 4 1 0 to wyświetla mi duże liczby, zauważyłem że kiedy dam zamiast scanfa -> cin to wtedy nie ma tych problemów. Ale co jest nie tak ze scanfem?

0

Dzięki serdeczne @Razi91 :) faktycznie źle używałem typy zmiennych :/ Będę pamiętał na przyszłość.

0

Zrobiłem mały eksperyment:

#include <cstdio>
using namespace std;
int main(){
  short sb;
  short sa;
  printf("a: %d: %d  \n",&sa, &sb-&sa);
  scanf("%x", &sa);
  printf("%hx;%hx\n\n", sa, sb);
}

W pamięci te 2 zmienne są zapisane: |sa|sa|sb|sb| (wniosek z pierwszsego printrfa: &sb-&sa jest równy 1) .

następnie ładujemy liczbę całkowitą i zapisujemy ją do 4 bajtów na adres od pierwszego bajtu zmiennej sa, dla ułatwienia: w formacie szesnastkowym. Wpiszę 12345678. Jako że mam procesor little-endianowy, jak niemal każdy desktopowy, taka wartość w pamięci po kolej się zapisze w formie: 87654321, co odpowiada w bajtach:

|87|65|43|21|
|sa|sa|sb|sb|

Przy wypisaniu szesnastek wypisuje po 2 bajty z sa i sb. Jako że "wie", że ma czytać "od tyłu", to wypisuje: 5678 i 1234.

0

Razi91: coś przeinaczasz. Wartość szesnastkowa 12345678 zapisze się jako kolejne bajty 78 56 34 12, czyli cyfry parami będą odwrotnie, a nie całkiem odwrotnie.
Tak naprawdę to złudzenie odwrotności wynikające z przyjętego kierunku zapisu cyfr arabskich, ale to temat na osobnego flejma :-)

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