Witam. Potrzebuje wartosci parametru if:
while(1)
{
if(zostal nacisniety klawisz ENTER) break;
}
opcjonalnie:
char a;
while(cin>>a)
{
if(a==ENTER) break;
}
Mam nadzieje, ze rozumiecie, o co mi chodzi:) Jak to zrobic?
Witam. Potrzebuje wartosci parametru if:
while(1)
{
if(zostal nacisniety klawisz ENTER) break;
}
opcjonalnie:
char a;
while(cin>>a)
{
if(a==ENTER) break;
}
Mam nadzieje, ze rozumiecie, o co mi chodzi:) Jak to zrobic?
cin.ignore();
na windowsie mozesz uzyc getch z biblioteki conio.h to by bylo mniej wiecej:
while (getch()!=13) {}
tyle ze petla zawsze bedzie czekac na klawisz, wiec mozesz rowniez pobawic sie z funkcji kbhit
Dodam, że wprowadzam tylko znaki bitowe. Tzn: wprowadzam liczbę bitowa, dzialam na każdym z osobna znaków a po naciśnięciu enter wykonuje się to, co poza pętla. Nie rozumiem rozwiązania z cin.ignore();
http://www.cplusplus.com/reference/iostream/istream/ignore/
jak dasz cin.ignore(INT_MAX,'\n'); to wywali ci wszystko do znaku enter włącznie.
jemu raczej chodzi o coś takiego:
string line;
getline(cin, line);
stringstream dane(line);
while(dane >> a) {
// przetwarzaj dane tylko z jednej linii
}
Autorowi tematu chodzi chyba o to żeby pętla nieskończona wykonywała się cały czas aby pobieranie klawisza nie blokowało programu. Można ten problem rozwiązać tak:
#include <Windows.h>
#include <iostream>
int main(int argc, char ** argv) {
bool press;
while(true) {
short int keystate = GetKeyState(VK_RETURN);
press = (keystate &= 0x1000) == 0x1000;
if(press) {
std::cout <<"nacisnieto enter\n";
}
}
std::cin.get();
}
Tylko ten sposób ma małą wadę pętla wyprzedza kolejkę zdarzeń i jak raz nacisniemy enter to pojawi się kilkanaście razy napis "nacisnieto enter".
Program na wejsciu ma przyjmowac liczbe rzeczywistą w postaci binarnej <1 (w postaci np. 0.110101). Na wyjsciu ma wyrzucic liczbe w systemie dziesietnym. Zalezy mi na rozwiązaniu "w locie" tzn nie pamietaniu tych bitow.. bo po co?
#include <cstdlib>
#include <iostream>
#include <math.h>
#include<stdio.h>
using namespace std;
int main(int argc, char *argv[])
{
char bin;
float dz=0; //zmienna, w ktorej zapisuje wartosc w systemie dziesietnym
int i= -1; //jakistam licznik
cin>>bin>>bin; //dla '0' i '.' w zapisie 0.[...]
while(cin>>bin)
{
if(bin=='1')dz=dz+pow(2, i);
i--;
}
cout<<dz;
system("PAUSE");
return EXIT_SUCCESS;
}
Program działa bardzo dobrze, ale trzeba wrzucic EOF (^Z), zeby wykonało sie to, co poza pętlą. a wejscie jest takie(przykład):
0.101011 ENTER
wiec enter na przerwac działanie pętli. Jak to zrobic?
dwie zmiany:
int bin;
while((bin=cin.get())!=EOF)
lub dodajesz funkcję:
istream &ent(istream &s)
{
while(s) if(s.get()=='\n') s.clear(ios::fail);
return s;
}
i jedna zmiana:
while(cin>>bin>>ent)
jak bin bedzie na incie to nie bede mogł działac na kazdym znaku z osobna. tzn jak wpisze na wejscie: 0.11101 to int bin==11101
chce działac po kolei, wczytując jeden znak.
Będziesz mógł dokładnie tak samo jak dotychczas.
#include <cstdlib>
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <conio.h>
using namespace std;
int main(int argc, char *argv[])
{
int bin;
float dz=0;
int i=-1;
cin>>bin>>bin;
//while(1) cout<<getchar()<<endl;
while((bin=cin.get())!=EOF)
{
if(bin==1)dz=dz+pow(2, i);
i--;
//if(getch()==13) break;
//if((int)bin!=48 && (int)bin!=49) break;
//cout<<"(int)bin dla bin: "<<bin<<" jest rowne: "<<(int)bin<<endl;
}
cout<<dz;
//system("PAUSE");
return EXIT_SUCCESS;
}
złe wyniki. ciągle wyrzuca 0.
No racja jeszcze kilka rzeczy masz:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int bin;
float dz=0;
int i=-1;
cin.ignore(2);
while(((bin=cin.get())!=EOF)&&(bin!='\n'))
{
if(bin=='1')dz=dz+pow(2,i);
i--;
}
cout<<dz;
cin.sync(); cin.get();
return 0;
}
nie cierpie tego:D
'EOF' was not declared in this scope
uzywam dev c++
działa:) ostatnie pytanie: czy to rozwiązanie jest szybkie?
Bardziej wolnego i bardziej niebezpiecznego chyba nie da się zrobić.
ja bym to tak ugryzł:
float dec = .0f;
int i = 1;
char c;
do {
cin >> c;
if (c == '1')
dec += pow(2, i);
--i;
} while(cin.peek() != '\n');
to przez
while(((bin=cin.get())!=EOF)&&(bin!='\n'))
prawda?
Nie, to akurat w miarę sensowne.
wiec co jest wolnego w tym rozwiązaniu? liczymy przeciez "w locie", nie zapamietjemy nawet calej liczby binarnej
chociażby wywoływanie tego "pow" za każdym razem, które liczy potęgę od początku. W tym miejscu zastanowiłbym się na szukaniem optymalizacji :]
najgorszy jest pow
for (float i=0.5; i>0; i/=2) ?
czy moze przesuwanie bitow w prawo?
Warunek zakończenia zostaw taki jaki był.
Zmiennych zmiennoprzecinkowych nie przesuwa się bitowo.
Nie chce ruszac warunku zakonczenia. Pomysł jest taki:
#include <iostream>
#include <math.h>
using namespace std;
int main(int argc, char *argv[]) {
float dec = .0f;
double i = 2;
char c;
do {
cin >> c;
if (c == '1')
dec += i;
i/=2;
} while(cin.peek() != '\n');
cout<<dec;
return 0;
}
czyli nie podnosimy 2 do ujemnych potęg tylko dzielimy. bo xy = 2*xy-1
Jeżeli użytkownik nie będzie wydziwiał przy wprowadzeniu to powinno być dobrze i szybko. Ale nie masz żadnego zabezpieczenia przed tymi wydziwieniami.
Np wprowadzenie:
XX1a1b1c1
0.123^Z
to zadanie z inf, sprawdzanie online. zaczynają sie wyscigi.. ;p
wielkie dzieki :)) mam rozumiec, ze szybciej sie nie da?
Owszem, da się.
Powaznie? Jak? Nie musisz pisac całego programu, jestem ciekaw tylko idei.