ďťż

Ładny brzuch

Czesc mam takie zadanie niby proste a jednak cos nie gra:

Chodzi oto, aby:
Napisz program, który oblicza sumę pojawiających się na wejściu liczb.
Wejście

Na wejście programu podana zostanie pewna ilość liczb całkowitych. Poszczególne liczby zostaną rozdzielone znakiem nowej linii.
Wyjście

Na wyjściu ma się pojawić ciąg liczbowy, którego i-ty element jest równy sumie i pierwszych wczytanych z wejścia liczb. Poszczególne liczby należy rozdzielić znakami nowej linii.
Przykład

Wejście:

6
8
-3

Wyjście:

6
14
11

moj kod:
#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) { int a, b, c, e; cin>>a; cin>>b; cin>>c; cout<<a<<endl; cout<<a+b=e<<endl; cout<<e+c<<endl; system("PAUSE"); return EXIT_SUCCESS; }



A jaki błąd ci wyskakuje, że nie działa??
edit:
czyli tak:
#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) { float a, b, c, e, d; cin>>a; cin>>b; cin>>c; cout<<a<<endl; e=a+b; d=e+c; cout<<d<<endl; system("PAUSE"); return EXIT_SUCCESS; }
Użytkownik prondzyk edytował ten post 18 październik 2007, 17:16
To jest źle napisane:
cout<<a+b=e<<endl;
może być zamiast tego:
cout<<e=(a+b)<<endl;
Nie jestem pewny, czy nawiasy muszą być, ale z nawiasami powinno zadziałać

no chyba nie tak :
#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) { int a, b, c, e; cin>>a; cin>>b; cin>>c; cout<<a<<endl; cout<<e=(a+b)<<endl; cout<<e+c<<endl; system("PAUSE"); return EXIT_SUCCESS; }

ten kod tez nie dziala wywala bledy:
G:\Zadania Spoj na ocene\1\main.cpp In function `int main(int, char**)':
15 G:\Zadania Spoj na ocene\1\main.cpp invalid operands of types `int' and `<unknown type>' to binary `operator<<'
G:\Zadania Spoj na ocene\1\Makefile.win [Build Error] [main.o] Error 1

ZRESZTA to i tak sie chyba i tak nie zgadza z adaniem bo maja wyjsc wyniki w liniach i tylko same wyniki nic wiecej
ten prorgam jest zly, ale tak myslalem ;/ :
#include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) { int a, b, c; cin>>a; cin>>b; cin>>c; cout<<a<<endl; cout<<a+b<<endl; cout<<(a+b)+c<<endl; return 0; }
Użytkownik ProgrammingMachine edytował ten post 18 październik 2007, 17:24


cout<<(e=a+b)<<endl;
Tak jak napiszesz, to nie będzie tego komunikatu błędu, tym razem sprawdzałem.
Ten drugi kod, co podałeś też działa całkiem dobrze, więc nie bardzo wiem w czym jest problem. Może z treścią zadania? Takie zadania zwykle mają sprecyzowane wejście oraz oczekiwany format wyjścia.

Nietestowane, ale powinno działać.
int main(int argc, char *argv[]) { vector<int> x; int number, temp=0; for(int i=0;i!=3;++i){ cin >> number; x.push_back(number); } for(int i=0;i<x.size();++i){ cout << (temp + x[i]) << endl; temp+=x[i]; } }

ale to i tak bezsensu bo na koncu ma wydrukowac

samo a+b a my may dopisanie a+b=e
wiec jest zle

w 3 linijce moze tak byc, ale nie w 2 nie wiem jak to zrobic..;/

ISZk niestety zle :((
oto Twoj wynik:
ID DATA UŻYTKOWNIK ZADANIE REZULTAT CZAS MEM JĘZYK
1042420 2007-10-18 18:37:03 nighttrain Sumy progresywne błąd kompilacji - - C++
Użytkownik ProgrammingMachine edytował ten post 18 październik 2007, 17:39
po pierwsze, zadania typu SPOJowego najlepiej robić na cstdio, a nie na iostream, ze względu na wydajność

po drugie, wybrałeś sobie zadanie, w którym nie wiesz ile masz danych wejściowych, więc musisz sprawdzać czy wejście ci sie nie skończyło: while(scanf("%d",&n)!=EOF) (takich zadań na konkursach programistycznych już się nie spotyka, zwykle masz podane w 1 linii liczbę linijek wejścia)

po trzecie, musisz być w 100% zgodny z opisem wejscia/wyjścia, bo to sprawdza bezduszna maszyna

#include <cstdio> int main() { int n; int sum=0; while(scanf("%d",&n)!=EOF) { sum += n; printf("%d\n",sum); } return 0; }
mi zaakceptował

po Twoim kodzie pokazalo
opis na SPOJu : bledna odpowiedz.. ;/

no to pewnie przekroczył zakres zmiennej, i zgłupiał

daj mi link do tego zadania, bo to jednak jest nie to co myślałem :>

to jest zamkniety kurs na spoju tylko dla kilku osob wiec tam nie wejdziesz..

zadanie wyglada dokladnie tak:

Zadanie w systemie SPOJ 1882. Sumy progresywne Kod zadania: KC006 Napisz program, który oblicza sumę pojawiających się na wejściu liczb. Wejście Na wejście programu podana zostanie pewna ilość liczb całkowitych. Poszczególne liczby zostaną rozdzielone znakiem nowej linii. Wyjście Na wyjściu ma się pojawić ciąg liczbowy, którego i-ty element jest równy sumie i pierwszych wczytanych z wejścia liczb. Poszczególne liczby należy rozdzielić znakami nowej linii. Przykład Wejście: 6 8 -3 Wyjście: 6 14 11
Użytkownik ProgrammingMachine edytował ten post 18 październik 2007, 18:06
to spróbuj zmienić typ zmiennej 'sum' z int na long long

zadanie o prawie identycznej treści -> https://pl.spoj.pl/problems/SUMA/ mój kod przeszedł (;
Użytkownik bryn edytował ten post 18 październik 2007, 18:09
ten kod tez nie przechodzi :
#include <cstdio> int main() { int n; long long int sum=0; while(scanf("%lld",&n)!=EOF) { sum += n; printf("%lld\n",sum); } return 0; }

aj, no bo n też może być większe niż int, inwencji trochę... ; )

#include <cstdio>

int main()
{
long long int n;
long long int sum=0;
while(scanf("%lld",&n)!=EOF)
{
sum += n;
printf("%lld\n",sum);
}
return 0;
}

blad ;/ nie mam juz pomyslow :(

rozwiazanie :

#include <cstdlib> #include <iostream> #include <stdio.h> using namespace std; int main(int argc, char *argv[]) { long long int n; long long int sum=0; while(scanf("%lld",&n)!=EOF) { sum += n; printf("%lld\n",sum); } system("PAUSE"); return EXIT_SUCCESS; }

Tak ot zapytam - Czy to może zadanie KC006? :>

tylko zbytnio nie rozumiem tego :

while(scanf("%lld",&n)!=EOF) // dopoki pobiera liczby rozne od zakonczenia pobierania liczb

jest tu petla, ktora sprawdza, czy uzytkownik nadal ine wpisuje liczb, az do zakonczenia ? Ale End of files to kiedy jest bo zalozmy jak wpisze:
4 liczby:

4
5
8
to po kazdej nastepuje eneter to kiedy jest end of files?

sum += n;
tu natomiast wlasnie nie wiem, chodzi o to ze jezeli pisalem np 1 liczbe

2
i wcisnalem ENTER i zaczyna sie znowu petla pote wpisze zalozmy

4

to suma bedzie 2+4 ?
bo ja myslalem, ze chodzi o (+=) powiekszenie o 1 liczby ? A na to wychodzi, ze poprzednia liczbe dodaje do kolejnej ?

P.S tak Ali jak to znalazles :) ?
Użytkownik ProgrammingMachine edytował ten post 18 październik 2007, 19:00
eti? Kierunek, grupa? :)
spoj wyrzuca dla programu dane tak (w każdym bądź razie idea się zgadza :P):
linux: cat dane.in | ./program
windows: type dane.in | program.exe
oczywiście dane.in to plik z danymi wejściowymi. Jak będziesz klepał "ręcznie" na wejście, to program nigdy nie skończy wczytywać ;).


sum += n;
tu natomiast wlasnie nie wiem, chodzi o to ze jezeli pisalem np 1 liczbe

To jest równoznaczne z zapisem:
sum = sum + n;
Użytkownik Ali240 edytował ten post 18 październik 2007, 19:18

linux: cat dane.in | ./program
windows: type dane.in | program.exe


raczej program.exe < dane.in - różnica w wydajności (chyba). :P

a jeżeli zadanie wymaga "system("PAUSE");" na końcu, to znaczy, że twórca zadania jest lamą :D


raczej program.exe < dane.in - różnica w wydajności (chyba). :P
Z tym że tutaj nie użyjesz np. echo -e 1\\n2\\n3... (nie wiem jak tam winda :P)


a jeżeli zadanie wymaga "system("PAUSE");" na końcu, to znaczy, że twórca zadania jest lamą :D
Możesz rozwinąć myśl? Bo nie bardzo wiem co masz na myśli (wiem co robi pause ale nie rozumiem wypowiedzi) ;).


Możesz rozwinąć myśl? Bo nie bardzo wiem co masz na myśli (wiem co robi pause ale nie rozumiem wypowiedzi) .
bartek@bartek-ubuntu:~$ pause bash: pause: command not found bartek@bartek-ubuntu:~$ PAUSE bash: PAUSE: command not found
'Pause' to windowsowa komenda, a poza tym zawsze w konkursach programistycznych funkcja 'system' jest zabroniona... Jej brak nie może wpływać na poprawność rozwiązania, bo nie ma w treści zadania o niej mowy
Użytkownik bryn edytował ten post 18 październik 2007, 20:06
Panowie, a co mysliscie o tym programiku ?

Zadanie w systemie SPOJ 1853. Formularz Kod zadania: KC005 Napisz program, który sprawdza, czy dany formularz osobowy został prawidłowo wypełniony. Formularze, których poprawność należy sprawdzić, mają postać: Imie: II; Nazwisko: NN; Data ur.: RRRR-MM-DD gdzie II jest napisem złożonym z co najwyżej 10 znaków, NN jest napisem złożonym z co najwyżej 20 znaków, RRRR jest 4-znakowym napisem, a MM i DD są 2-znakowymi napisami. Wejście Na wejście programu podana zostanie pewna liczba zestawów danych. Każdy z zestawów składa się z 3 rozdzielonych średnikiem napisów, o postaci opisanej powyżej (można przyjąć, że pola II, NN, RRRR, MM i DD składają się wyłącznie z czarnych znaków różnych od średnika). Poszczególne zestawy zostaną rozdzielone znakiem nowej linii. Wyjście Na wyjściu ma się pojawić ciąg liczbowy, którego i-ty wyraz jest równy: * 0, jeżeli i-ty wczytany z wejścia formularz nie zawiera poprawnego imienia; poprawne imiona zaczynają się od wielkiej litery, po której następują małe litery; * 1, jeżeli i-ty wczytany z wejścia formularz zawiera poprawne imię, a nie zawiera poprawnego nazwiska; poprawne nazwiska zaczynają się od wielkiej litery, po której następują małe litery; * 2, jeżeli i-ty wczytany z wejścia formularz zawiera poprawne imię i nazwisko, a nie zawiera poprawnej daty; w poprawnej dacie pole RRRR jest liczbą całkowitą z zakresu 1900-2000, pole MM jest liczbą całkowitą z zakresu 1-12, a pole DD liczbą całkowitą z zakresu 1-31; * 3, w pozostałych przypadkach. Poszczególne elementy tego ciągu należy rozdzielić znakiem nowej linii. Przykład Wejście: Imie: Roman; Nazwisko: Kowalski6; Data ur.: 1900-01-30 Imie: Andrzej; Nazwisko: Kowal; Data ur.: 1899-10-10 Imie: roman; Nazwisko: No-wak; Data ur.: 1099-11-12 Imie: Alicja; Nazwisko: Nowak; Data ur.: 1990-01-01 Wyjście: 1 2 0 3
Użytkownik ProgrammingMachine edytował ten post 18 październik 2007, 20:20
Co ja o nim myślę? Hmm musiała by tu paść seria niecenzuralnych słów na temat spoja więc nie powiem co myślę :P. Ogólnie spoj zalicza to zadanie chyba z użyciem generatora liczb losowych (i liczba która zalicza dane zadanie pada niezwykle rzadko) :D.

@Bryn: nie zauważyłem tego w kodzie ;). Pewnie pytacz piszę w Dev'ie i łatwiej mu debugować (a raczej sprawdzać działanie ;]). Ale w programie wyjściowym nie będzie tego miał na pewno ;).

@Down: terefere :P. Teoretycznie tak, ale dla spoja niekoniecznie :D.
@ProgrammingMachine: czemu nie spróbujesz sam rozwiązać tego zadania, a w razie problemów zasięgnąć pomocy na laborkach? Toć one po to są ;).
http://www.cplusplus.com/ - polecam.
Użytkownik Ali240 edytował ten post 18 październik 2007, 20:30
Ja sądzę, że jeżeli sie jest na wyższych studiach, to nieumiejętność napisania go jest nieco wstydliwa :P Wczytywanie znak po znaku przez while; break w przypadku natknięcia się na błąd + wypisanie trójeczki w razie poprawnego zestawu i gotowe

fragment kodu, ale co dalej ? jak to zrobic?
#include <cstdlib> #include <iostream> #include <stdio.h> #include <ctype.h> using namespace std; int main(int argc, char *argv[]) { string imie, nazwisko; int data_ur; char imie[10]; char nazwisko[30]; int data_ur[ ???? ]; scanf("Imie: %[^;]; Nazwisko: %[^;]; Data_ur: %s", imie, nazwisko, data) isupper(imie[0]) && islower(imie[]) //pierwsza najwieksza litera && reszta male ??;/ isupper(nazwisko[0] && islower(nazwisko[]) // ------------||---------------------- ?? isdigit(data ??????? { if isupper(imie[0]) && islower(imie[]) && isupper(nazwisko[0] && islower(nazwisko[]) && isdigit(data ??????? printf('3'); if else else system("PAUSE"); return EXIT_SUCCESS; }
Użytkownik ProgrammingMachine edytował ten post 18 październik 2007, 21:01
for, char, < 'a', > 'z' itp. Coś jeszcze potrzebne? :)

ali moglbys zapodac czyms konkretniejszym :) ?


ali moglbys zapodac czyms konkretniejszym :) ?
Nie mogę za dużo konkretów dawać bo wyjdzie plagiat xD. Sprawdzenie czy jest duże + małe - pętla po imieniu i nazwisku ze sprawdzeniem czy dany znak < 'A', > 'Z' (pierwsza litera) oraz < 'a', > 'z' (reszta) (dla błędu). Cyferki analogicznie sprawdzamy => < '0', > '9'. Ot cała walidacja ;].
Hint: rozbij sobie drobniej datę. Sprawdź funkcję atoi. Sprawdzaj po kolei tak jak są przypadki.

Ali wspolnie z pomoca reVisa zrobilismy zadanie z tym formularzem, ale spoj wywala blad oto program :
#include <iostream> #include <string> #include <sstream> bool Parse(const std::string& str) { if(isupper(str[0])!=0) { for(int i=1; i<str.length(); i++) if(islower(str[i])==0) return false; } else return false; return true; } bool ParseDate(const std::string& str) { char r[5],m[3],d[3]; str.copy(r,4,0); r[4]=''; str.copy(m,2,5); m[2]=''; str.copy(d,2,8); d[2]=''; int ir = atoi(r); if(ir<1900 || ir>2000) return false; int im = atoi(m); if(im<1 || im>12) return false; int id = atoi(d); if(id<1 || id>31) return false; return true; } int main() { std::string temp; std::string dane; while(std::getline(std::cin,dane)) { std::stringstream ss; ss << dane; //wczytanie imienia ss >> temp >> dane; dane.erase(dane.length()-1); if(Parse(dane)==false) { std::cout << 0 << std::endl; continue; } //wczytanie nazwiska ss >> temp >> dane; dane.erase(dane.length()-1); if(Parse(dane)==false) { std::cout << 1 << std::endl; continue; } //wczytanie daty ss >> temp >> temp >> dane; if(ParseDate(dane)==false) { std::cout << 2 << std::endl; continue; } std::cout << 3 << std::endl; temp.clear(); dane.clear(); } return 0; }

Tak jak mówiłem... Pewnie przekraczany jest czas albo możliwe wykorzystanie pamięci. Będziesz to jednak musiał sobie przepisać na zwykłe tablice i stdio.

wlasnie tak myslalem
chce stworzyc

imie[10]
nazwisko[20]
char data[??]

potem zrobic jakies sprawdzajace petlew, ale nie wiem jaks ie do tego zabrac

z wykorzystaniem funkcji z biblioteki <ctype.h>

imie[0]
imie[1]
....
....

#include<ctype.h> i w tym mamy funkcje:
islower() - sprawdzanie najmniejszej litery
isupper() - sprawdzanie najwiekszej litery
isdigit

isuper(imie[0])

nie wiem moze jakas petelka sprawdzajaca for ?
Użytkownik ProgrammingMachine edytował ten post 21 październik 2007, 12:07
A jaki błąd wywala? Bo dla przekroczenia pamięci i przekroczenia czasu są inne błędy niż "błędna odpowiedź"...
// Błędy (to co od razu na oko mi się rzuciło ;)):
1. Zawsze musisz zczytać pełen wiersz (z wiadomych przyczyn)
2. Błąd przy walidacji macie. Sprawdź ten kod:

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

int main()
{
char x[4]= "12c";
printf("%d\n", atoi(x));
return 0;
};

Użytkownik Ali240 edytował ten post 21 październik 2007, 13:05
Racja Ali zapomniałem o tym:
bool ParseDate(const std::string& str) { char r[5],m[3],d[3]; for(int i=0; i<4; ++i) { if(isdigit(str[i])==0) return false; r[i] = str[i]; } r[4]=(char)NULL; for(int i=0; i<2; ++i) { if(isdigit(str[5+i])==0) return false; m[i] = str[5+i]; } m[2]=(char)NULL; for(int i=0; i<2; ++i) { if(isdigit(str[8+i])==0) return false; d[i] = str[8+i]; } d[2]=(char)NULL; int ir = atoi®; if(ir<1900 || ir>2000) return false; int im = atoi(m); if(im<1 || im>12) return false; int id = atoi(d); if(id<1 || id>31) return false; return true; }

wklejam ten kod, ale wywala blad kompilacji ;/

#include <iostream> #include <string> #include <sstream> bool Parse(const std::string& str) { if(isupper(str[0])!=0) { for(int i=1; i<str.length(); i++) if(islower(str[i])==0) return false; } else return false; return true; } bool ParseDate(const std::string& str) { char r[5],m[3],d[3]; for(int i=0; i<4; ++i) { if(isdigit(str[i])==0) return false; r[i] = str[i]; } r[4]=(char)NULL; for(int i=0; i<2; ++i) { if(isdigit(str[5+i])==0) return false; m[i] = str[5+i]; } m[2]=(char)NULL; for(int i=0; i<2; ++i) { if(isdigit(str[8+i])==0) return false; d[i] = str[8+i]; } d[2]=(char)NULL; int ir = atoi®; if(i<1900 || ir>2000) return false; int im = atoi(m); if(i<1 || im>12) return false; int id = atoi(d); if(id<1 || id>31) return false; return true; } int main() { std::string temp; std::string dane; while(std::getline(std::cin,dane)) { std::stringstream ss; ss << dane; //wczytanie imienia ss >> temp >> dane; dane.erase(dane.length()-1); if(Parse(dane)==false) { std::cout << 0 << std::endl; continue; } //wczytanie nazwiska ss >> temp >> dane; dane.erase(dane.length()-1); if(Parse(dane)==false) { std::cout << 1 << std::endl; continue; } //wczytanie daty ss >> temp >> temp >> dane; if(ParseDate(dane)==false) { std::cout << 2 << std::endl; continue; } std::cout << 3 << std::endl; temp.clear(); dane.clear(); } return 0; }
Użytkownik ProgrammingMachine edytował ten post 21 październik 2007, 19:23

wklejam ten kod, ale wywala blad kompilacji ;/
To może skompilujesz i sprawdzisz co jest nie tak? Mam nadzieje że nie info... :P

@Pinochet, również witam :). No siedzę tutaj od paru latek :P. Też nie skojarzyłem że to Ty :D.
Użytkownik Ali240 edytował ten post 23 październik 2007, 10:47
dziala juz poprawilem

No to bardzo dobrze, że działa... Na przyszłość jednak jak wywala błąd kompilacji i już lądujesz z kodem na forum to podaj treść komunikatu.

ps. ciekawe czy coś z tego wszystkiego wyniosłeś i rozumiesz ten kod.

@ali240 Cześć Ali ;-) nie wiedzialem ze jestes na tym forum ;]
@ProgrammingMachine
Hint1. Czytaj treść zadania jeżeli masz "pewna ilość liczb całkowitych" to znaczy ze bedzie ich pewna liczba a tylko w tym szczególnym przypadku jest 3.
Hint2. Najpierw spróbuj sam rozwiązać problem potem męcz innych ;-)

Sorki ale nie moglem sie powstrzymac sesese

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •