Problem z kodem

Odpowiedz Nowy wątek
2011-08-19 23:04
zielony
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()?

Co tam robi cin? - Zjarek 2011-08-19 23:11

Pozostało 580 znaków

2011-08-19 23:26
Kumashiro
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ć.

Pozostało 580 znaków

2011-08-19 23:58
zielony
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?

i weź sformatuj to jak człowiek.Mało kto tutaj będzie miał ochotę tracić swój czas na twoje niedbalstwo.Poza tym o czymś takim jak debugowanie,zakładanie brakpointów słyszałeś? - MasterBLB 2011-08-20 00:11
Bo przypisujesz zmiennej z 0. Przeczytaj dokumentacje scanfa. - Zjarek 2011-08-20 00:11

Pozostało 580 znaków

2011-08-20 01:26
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

Pozostało 580 znaków

2011-08-20 01:50
zielony
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?

Co jest nie tak z tym scanfem? Źle go używasz. Używasz shortów, a w formacie podajesz inta. Traktuje więc shorta tak jak inta i wchodzi na sąsiednie bajty, przez co powstają dziwne wyniki. W strumieniach sam wykrywa typ zmiennej, dlatego błędu nie ma. - Razi91 2011-08-20 02:08

Pozostało 580 znaków

2011-08-20 02:17
zielony
0

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

Pozostało 580 znaków

2011-08-20 11:58
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.

Pozostało 580 znaków

2011-08-20 12:48
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 :-)

edytowany 2x, ostatnio: Azarien, 2011-08-20 12:51

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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