enter przerywa pętle while(1)

0

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?

0

cin.ignore();

0

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

0

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();

0

http://www.cplusplus.com/reference/iostream/istream/ignore/
jak dasz cin.ignore(INT_MAX,'\n'); to wywali ci wszystko do znaku enter włącznie.

0

jemu raczej chodzi o coś takiego:

string line;
getline(cin, line);
stringstream dane(line);
while(dane >> a) {
      // przetwarzaj dane tylko z jednej linii
}
0

@zonkoo22, pokaż kod w który ty chcesz to wkomponować. Bo może @MarekR22 ma racje a może @krwq a może nikt z nas nie rozumie o co ci biega. Bo z tego co napisałeś może wynikać sporo różnych rzeczy.

0

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".

0

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?

0

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)
0

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.

0

Będziesz mógł dokładnie tak samo jak dotychczas.

0
#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.

1

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;
  }
0

nie cierpie tego:D
'EOF' was not declared in this scope
uzywam dev c++

0

działa:) ostatnie pytanie: czy to rozwiązanie jest szybkie?

1

Bardziej wolnego i bardziej niebezpiecznego chyba nie da się zrobić.

1

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');
0

to przez
while(((bin=cin.get())!=EOF)&&(bin!='\n'))
prawda?

1

Nie, to akurat w miarę sensowne.

0

wiec co jest wolnego w tym rozwiązaniu? liczymy przeciez "w locie", nie zapamietjemy nawet calej liczby binarnej

1

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 :]

0

najgorszy jest pow

0

for (float i=0.5; i>0; i/=2) ?
czy moze przesuwanie bitow w prawo?

0

Warunek zakończenia zostaw taki jaki był.
Zmiennych zmiennoprzecinkowych nie przesuwa się bitowo.

0

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

0

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

0

to zadanie z inf, sprawdzanie online. zaczynają sie wyscigi.. ;p
wielkie dzieki :)) mam rozumiec, ze szybciej sie nie da?

0

Owszem, da się.

0

Powaznie? Jak? Nie musisz pisac całego programu, jestem ciekaw tylko idei.

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