Arne Skrevet 22. juli 2008 Del Skrevet 22. juli 2008 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
Arne Skrevet 22. juli 2008 Forfatter Del Skrevet 22. juli 2008 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
Tannkrem1 Skrevet 23. juli 2008 Del Skrevet 23. juli 2008 (endret) 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 23. juli 2008 av THROBiX Lenke til kommentar
Arne Skrevet 23. juli 2008 Forfatter Del Skrevet 23. juli 2008 Takk skal du ha, skal teste det ut! Men problemet er ikke løst! Utfyllende info i første post. Lenke til kommentar
亚历山大 Skrevet 27. juli 2008 Del Skrevet 27. juli 2008 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
Arne Skrevet 29. juli 2008 Forfatter Del Skrevet 29. juli 2008 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
Arne Skrevet 29. juli 2008 Forfatter Del Skrevet 29. juli 2008 Danke schön! Men det var det med å få input på en linje da! Zorigon: Akkurat det jeg prøvte uten hell. Lenke til kommentar
OldMan Skrevet 29. juli 2008 Del Skrevet 29. juli 2008 Hvorfor skal du gjøre det på denne måten ? Ville det ikke vært bedre å la brukerene skrive "4+4" eller "4*4/3" osv selv, og så parse det hele etterpå ? Lenke til kommentar
Arne Skrevet 29. juli 2008 Forfatter Del Skrevet 29. juli 2008 Oppgaven er nok definert fra før av! Lenke til kommentar
OldMan Skrevet 29. juli 2008 Del Skrevet 29. juli 2008 (endret) 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 29. juli 2008 av OldMan Lenke til kommentar
BlueEAGLE Skrevet 29. juli 2008 Del Skrevet 29. juli 2008 (endret) 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 29. juli 2008 av BlueEAGLE Lenke til kommentar
aC Skrevet 30. juli 2008 Del Skrevet 30. juli 2008 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
BlueEAGLE Skrevet 31. juli 2008 Del Skrevet 31. juli 2008 Det er mulig jeg har misoppfattet RPN, men er det ikke slik at den ikke kan prioritere operasjoner og derfor påkrever at parentheser blir satt manuelt i uttrykket? Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå