Gå til innhold

Flere input på en linje?


Anbefalte innlegg

Hei!

 

Er det mulig bare vet hjelp av standard-biblioteket å gjøre flere input på en linje? Prøver nemlig å lage en kalkulator, og vil gjerne at det automatisk skal dukke opp et pluss-tegn etter brukerens første input, samt å la brukeren skrive inn etter tegnet. Slik jeg har forstått, er nesten alle slike spesielle ting plattformorientert?

 

Det jeg prøver å oppnå er (i input):

4 + 4

 

Det jeg klarer er:

4

+ 4

 

 

Forresten, en ting til. Hvordan er resursbruken på stacks i forhold til vectors? Jeg vet at vectors tar mye kapasitet, og jeg er dermed ute etter en filo-container som vector, bare ikke så krevende for systemet. Jeg bruker nesten alltid vectors, siden jeg trivest med å bruke de, og jeg synst det er lett (lett nok i alle fall... ;)).

 

 

Med vennlig hilsen

 

Arne Kristoffer

Lenke til kommentar
Videoannonse
Annonse

Og så lurer jeg på en ting til;

 

Av og til er det at cin.get() ikke funker. Dette eksempelprogrammet jeg lagte viser det:

 

Klikk for å se/fjerne innholdet nedenfor

#include <iostream>
#include <stack>
using namespace std;

int main()
{
stack<int> a;
stack<int> b;
stack<int> c;
int d = 0;
int e = 0;

int howmany;
cout << "How many additions?" << endl;
cin >> howmany;

for (int x = 1; x != howmany+1; x++)
{
	cout << x << ":" << endl;
	cin >> d;
	cin >> e;
	a.push(d);
	b.push(e);
	c.push(d+e);
	d = 0;
	e = 0;
}
while(!a.empty())
{
	cout << a.top() << " + " << b.top() << " = " << c.top() << endl;
	a.pop();
	b.pop();
	c.pop();
}
cin.get();
return 0;
}

 

Jeg har også prøvt å cleare streamen før jeg cin.get()'er, men det funker heller ikke. Vinduet lukker seg før du får sagt sjokoladekake... ;)

Lenke til kommentar
Og så lurer jeg på en ting til;

 

Av og til er det at cin.get() ikke funker. Dette eksempelprogrammet jeg lagte viser det:

 

Klikk for å se/fjerne innholdet nedenfor

#include <iostream>
#include <stack>
using namespace std;

int main()
{
stack<int> a;
stack<int> b;
stack<int> c;
int d = 0;
int e = 0;

int howmany;
cout << "How many additions?" << endl;
cin >> howmany;

for (int x = 1; x != howmany+1; x++)
{
	cout << x << ":" << endl;
	cin >> d;
	cin >> e;
	a.push(d);
	b.push(e);
	c.push(d+e);
	d = 0;
	e = 0;
}
while(!a.empty())
{
	cout << a.top() << " + " << b.top() << " = " << c.top() << endl;
	a.pop();
	b.pop();
	c.pop();
}
cin.get();
return 0;
}

 

Jeg har også prøvt å cleare streamen før jeg cin.get()'er, men det funker heller ikke. Vinduet lukker seg før du får sagt sjokoladekake... ;)

cin.ignore(numeric_limits<int>::max(), '\n'); rett før cin.get().

Endret av THROBiX
Lenke til kommentar

Er ikke helt sikker på om dette funker i og med at jeg ikke får testa dette på jobb men iaf.

 

#include <iostream>

using namespace std;

int main()
{
  int a,b,retval;
  cout << "Calc:" << endl;
  cin >> a;
  cout << " + ";
  cin >> b;
  retval = (a+b);
  cout << endl << "Summen er: " << retval << endl;
}

 

- Aleksander -

Lenke til kommentar
Og så lurer jeg på en ting til;

 

Av og til er det at cin.get() ikke funker. Dette eksempelprogrammet jeg lagte viser det:

 

Klikk for å se/fjerne innholdet nedenfor

#include <iostream>
#include <stack>
using namespace std;

int main()
{
stack<int> a;
stack<int> b;
stack<int> c;
int d = 0;
int e = 0;

int howmany;
cout << "How many additions?" << endl;
cin >> howmany;

for (int x = 1; x != howmany+1; x++)
{
	cout << x << ":" << endl;
	cin >> d;
	cin >> e;
	a.push(d);
	b.push(e);
	c.push(d+e);
	d = 0;
	e = 0;
}
while(!a.empty())
{
	cout << a.top() << " + " << b.top() << " = " << c.top() << endl;
	a.pop();
	b.pop();
	c.pop();
}
cin.get();
return 0;
}

 

Jeg har også prøvt å cleare streamen før jeg cin.get()'er, men det funker heller ikke. Vinduet lukker seg før du får sagt sjokoladekake... ;)

cin.ignore(numeric_limits<int>::max(), '\n'); rett før cin.get().

Det compiler ikke:

1>c:\users\arne\documents\visual studio 2008\projects\test2\test2\main.cpp(35) : error C2065: 'numeric_limits' : undeclared identifier
1>c:\users\arne\documents\visual studio 2008\projects\test2\test2\main.cpp(35) : error C2062: type 'int' unexpected

Lenke til kommentar

Noe sånt da:

 

// win2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "conio.h"
#include "windows.h"

void ClearScreen( void );

HANDLE  hConsoleOut;
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;

int ReadInt();

int _tmain(int argc, _TCHAR* argv[])
{
// Get display screen information & clear the screen.
hConsoleOut = GetStdHandle( STD_OUTPUT_HANDLE );
GetConsoleScreenBufferInfo( hConsoleOut, &csbiInfo );

int nc, tall1, tall2;
while (1)
{
	ClearScreen();
	_tprintf(_T("Calc(+): "));

	tall1 = ReadInt();
	ClearScreen();

	_tprintf(_T("Calc(+): %d + "),tall1);
	tall2 = ReadInt();
	ClearScreen();

	_tprintf(_T("Calc(+): %d + %d = %d\r\n"), tall1, tall2, tall1 + tall2);

	nc = _getch();
	if (nc == _T('q'))
		break;
}

return 0;
}

int ReadInt()
{
_TCHAR buff[12];
int factor = 1;
int i(0);
while (i<11)
{
	while (0 == _kbhit())
		Sleep(10);
	int nc = _getch();
	if (i == 0 && nc == _T('-'))
		factor = -1;
	else if (nc >= _T('0') && nc <= _T('9'))
		buff[i++] = nc;
	else
		break;
	_tprintf(_T("%c"),nc);
}
buff[i] = 0;

return (i>0) ? factor * _tstoi(buff) : 0;
}

void ClearScreen( void )
{
DWORD	dummy;
COORD	Home = { 0, 0 };
FillConsoleOutputCharacter( hConsoleOut, ' ', 
							csbiInfo.dwSize.X * csbiInfo.dwSize.Y, 
							Home, &dummy );
SetConsoleCursorPosition(hConsoleOut,Home);
}

Endret av OldMan
Lenke til kommentar

Først og fremst så vil jeg poengtere at dette ikke er svar på hvordan man gjør det førsteposter spør om. Men det er et svar på hvordan jeg mener man bør gjøre det førsteposter prøver å gjøre.

 

Det ser ut som at du ber brukeren taste inn først en verdi så en operator fulgt av en annen verdi.

 

Altså, det virker som at brukeren skriver "4[enter]+4[enter]" mens det du sannsynligvis vil gjøre er å ha brukeren til å skrive "4+4[enter]" og deretter behandle dette uttrykket.

 

Rangeringen for å trekke sammen mattematiske uttrykk er divisjon, multiplikasjon og adisjon/subtraksjon.

 

I dette eksemplet bruker vi 5*3+10/2-5*9/3

Så det første man gjør er å splitte uttrykket ut fra de laveste rangrete operatørene. Først + og - slik at du har en stabel som ser ut som

5*3+
10/2-
5*9/3

Så splitter vi denne stakken på multiplikasjon slik at stabelen ser ut som

5*
3+
10/2-
5*
9/3

Vi er nå klare til å trekke sammen divisjonene som er den høyeste rangerte operasjonen. Da går vi igjennom stabelen og ser etter divisjoner og utfører dem. Det gir da stabelen

5*
3+
5-  //Her har 10/2 blitt til 5
5*
3   //Her har 9/3 blitt til 3

Så trekker vi sammen stabelen slik at vi har multiplikasjonene i orden

5*3+
5-
5*3

Så går vi igjennom stabelen og utfører multiplikasjoner der vi finner dem

15+ //Her har 5*3 blitt til 15
5-
15 //Her har 5*3 blitt til 15

Nå sitter vi igjen med en liste over addisjoner og subtraksjoner og kan trekke sammen uttrykket med addisjon og subtraksjon og sitter igjen med 5 til slutt.

 

En slik fremgangsmåte tillater flere operatorer forutsatt at du har kode for å rangere operatorer og gruppere uttrykk.

 

Dette er nok garantert ikke den mest effektive måten å gjøre dette på, men det var det jeg kom på i farten. Fordelen med denne fremgangsmåten er at du kan legge til nye operatorer ved å definere dem med et tegn, en rangering og en funksjon som tar to tall. Da kan du enkelt legge til potens (^), modulus (%) og så videre. Det vil også være mulig å legge til spesielle funksjoner som cos, sin og tan bare man enten definerer tegn som kan ha flere karakterer eller tegn som representerer disse operasjonene.

 

Det er også viktig å ta i betraktning eventuelle parentheser. Hvis uttrykket er 5*3+10/2-(5*9)/3 så må parenthesen behandles som et eget uttrykk og regnes sammen før operatøren etter parenthesen utføres.

Endret av BlueEAGLE
Lenke til kommentar
Først og fremst så vil jeg poengtere at dette ikke er svar på hvordan man gjør det førsteposter spør om. Men det er et svar på hvordan jeg mener man bør gjøre det førsteposter prøver å gjøre.

 

....

 

 

 

Det ser ut som at du ber brukeren taste inn først en verdi så en operator fulgt av en annen verdi.

 

Altså, det virker som at brukeren skriver "4[enter]+4[enter]" mens det du sannsynligvis vil gjøre er å ha brukeren til å skrive "4+4[enter]" og deretter behandle dette uttrykket.

 

Rangeringen for å trekke sammen mattematiske uttrykk er divisjon, multiplikasjon og adisjon/subtraksjon.

 

I dette eksemplet bruker vi 5*3+10/2-5*9/3

Så det første man gjør er å splitte uttrykket ut fra de laveste rangrete operatørene. Først + og - slik at du har en stabel som ser ut som

5*3+
10/2-
5*9/3

Så splitter vi denne stakken på multiplikasjon slik at stabelen ser ut som

5*
3+
10/2-
5*
9/3

Vi er nå klare til å trekke sammen divisjonene som er den høyeste rangerte operasjonen. Da går vi igjennom stabelen og ser etter divisjoner og utfører dem. Det gir da stabelen

5*
3+
5-  //Her har 10/2 blitt til 5
5*
3   //Her har 9/3 blitt til 3

Så trekker vi sammen stabelen slik at vi har multiplikasjonene i orden

5*3+
5-
5*3

Så går vi igjennom stabelen og utfører multiplikasjoner der vi finner dem

15+ //Her har 5*3 blitt til 15
5-
15 //Her har 5*3 blitt til 15

Nå sitter vi igjen med en liste over addisjoner og subtraksjoner og kan trekke sammen uttrykket med addisjon og subtraksjon og sitter igjen med 5 til slutt.

 

En slik fremgangsmåte tillater flere operatorer forutsatt at du har kode for å rangere operatorer og gruppere uttrykk.

 

Dette er nok garantert ikke den mest effektive måten å gjøre dette på, men det var det jeg kom på i farten. Fordelen med denne fremgangsmåten er at du kan legge til nye operatorer ved å definere dem med et tegn, en rangering og en funksjon som tar to tall. Da kan du enkelt legge til potens (^), modulus (%) og så videre. Det vil også være mulig å legge til spesielle funksjoner som cos, sin og tan bare man enten definerer tegn som kan ha flere karakterer eller tegn som representerer disse operasjonene.

 

Det er også viktig å ta i betraktning eventuelle parentheser. Hvis uttrykket er 5*3+10/2-(5*9)/3 så må parenthesen behandles som et eget uttrykk og regnes sammen før operatøren etter parenthesen utføres.

 

 

 

Evt RPN

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...