aurel Opublikowano 13 Września 2007 Zgłoś Opublikowano 13 Września 2007 mam na przykład do napisanie prościuchny programik: https://pl.spoj.pl/problems/SUMA/ jak widać, program ma sie wykonywać aż skończy się podawanie danych na wejście. a więc robie tak, że mój program: #include <cstdlib>#include <iostream>using namespace std;int main(int argc, char *argv[]){ int c, a=0, b=0; while ((c=getchar())!=EOF) { ungetc(c, stdin); cin >> a; b=b+a; cout << b << "\n"; } return EXIT_SUCCESS;} o kodzie prostym jak drut, otwieram przez cmd program.exe < dane.txt > wynik.txt jako dane podaje mu: 6 8 -3 a jako wynik wyrzuca: 6 14 11 8 dlaczego ten drań wykonuje się jeszcze raz po zakończeniu podawania testów?! jest mi ktoś w stanie pokazać błąd? :( Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Nargil Opublikowano 14 Września 2007 Zgłoś Opublikowano 14 Września 2007 while ((c=getchar())!='k') { ungetc(c, stdin); cin >> a; b=b+a; cout << b << "\n"; fflush(stdin); } czysc bufor wejsciowy na koniec petli fflushem Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
kenji Opublikowano 14 Września 2007 Zgłoś Opublikowano 14 Września 2007 zobacz to: #include <iostream.h>#include<fstream.h>#include <stdlib.h> using namespace std;int main(){ int a=0,b=0,c=0; ifstream plikWe; plikWe.open("c:\\dane.txt"); while((plikWe>>a)&&!plikWe.eof()) //wersja while(!plikWe.eof()) //{ //plikWe>>a; // dziala podobnie do twojej { b=b+a; cout<<b<<endl; } plikWe.close(); system("PAUSE"); return 0;} Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Nargil Opublikowano 14 Września 2007 Zgłoś Opublikowano 14 Września 2007 (edytowane) kiedy wy sie nauczycie ze w naglowkach c++ nie ma .h ? Poza tym nie wiem czy zauwazyles, ale on nie operuje na plikach ;P while((plikWe>>a)&&!plikWe.eof()) <-- niepotrzebna podwojna zlozonosc obliczeniowa. Po co dwa razy sprawdzac czy nie nastapil koniec pliku ? samo while((plikWe>>a)) by wystarczylo. Edytowane 14 Września 2007 przez Nargil Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
kenji Opublikowano 14 Września 2007 Zgłoś Opublikowano 14 Września 2007 kiedy wy sie nauczycie ze w naglowkach c++ nie ma .h ? Poza tym nie wiem czy zauwazyles, ale on nie operuje na plikach ;P while((plikWe>>a)&&!plikWe.eof()) <-- niepotrzebna podwojna zlozonosc obliczeniowa. Po co dwa razy sprawdzac czy nie nastapil koniec pliku ? samo while((plikWe>>a)) by wystarczylo. po co te złośliwości i ironiczny ton? 1. #include <iostream.h> #include<fstream>.h #include <stdlib.h> moja wersja devcpp (4) 'wybacza' takie nieścisłości. w pracy mam XP, w cpp nie pracuje więc devcpp mi wystarcza. 2. po tym o kodzie prostym jak drut, otwieram przez cmd program.exe < dane.txt > wynik.txt wnoszę że może mu się przydać wersja na plikach. 3. while((plikWe>>a)) bez czyszczenia wejścia działa tak samo jak kod aurala co mu nie wystarcza. kiedy piszę kod na forum zawsze sprawdzam wcześniej jego działanie. ps. czy potrzeba się wywyższać? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
aurel Opublikowano 14 Września 2007 Zgłoś Opublikowano 14 Września 2007 (edytowane) operacje na plikach w tym wypadku są wykluczone czyszczenie bufora na koniec działania programu nie pomaga (wciąż wyświetla się jedno b za dużo) zadziałało gdy dodałam if (feof(stdin)) break; tuż po wczytaniu danych :) Edytowane 14 Września 2007 przez aurel Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Nargil Opublikowano 14 Września 2007 Zgłoś Opublikowano 14 Września 2007 po co te złośliwości i ironiczny ton? ps. czy potrzeba się wywyższać? Zle mnie zrozumiales :) Aczkolwiek jak udzielasz komus rad to warto znac specyfikacje jezyka i male upomnienie chyba tutaj nie szkodzi ? :> czyszczenie bufora na koniec działania programu nie pomaga (wciąż wyświetla się jedno b za dużo)bo masz go czyscic na koniec PĘTLI, a nie PROGRAMU. U mnie pomoglo, ale przyznaje ze nie sprawdzalem jak z przekierowaniami to dziala, tylko na konsoli. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
aurel Opublikowano 17 Września 2007 Zgłoś Opublikowano 17 Września 2007 miałam na mysli koniec pętli :P przecież głupia bym była jakbym czyściła po pętli :/ Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...