Testa GNAW - yet another command line calculator

Permalänk

Testa GNAW - yet another command line calculator

Hej glada forumsbesökare!

Jag har just bestämt mig för att mitt program GNAW är redo för betastadiet och skulle tycka att det var roligt om ni ville testa det och skriva vad ni tycker.

GNAW är en konsolbaserad miniräknare skriven i C++ som stöder vanliga aritmetiska operationer och lite mer avancerade saker som trigonometri och logaritmer etc. Det går att definiera egna variabler och syntaxen påminner om den hos grafritande räknare.

Om ni har lust får ni gärna kompilera själva och meddela hur det gick, jag är nämligen lite osäker på hur det fungerar med olika kompilatorer. Jag har försökt följa ANSI-C++ så det borde fungera oavsett plattform och kompilator, men man vet ju aldrig.

Detaljer om användningen finns i readme:n.

Filerna hittar ni här:
http://sourceforge.net/projects/gnaw/

Permalänk
Medlem

jag har bara en sak att säga och det är ...
Great Job Dude

Visa signatur

Samsung TFT 22" 2233RZ Svart 120HZ - 640GB Western Digital Black 64MB SATA III - Corsair 4GB (2x2048MB) 1333MHz XMS3-10600 - AMD Phenom2 X4 965 3,4GHz Black Edition - Gigabyte GeForce GTX 460 1GB OC - Fractal Design Define R3, Svart - Corsair TX 650W 80+ - Gigabyte GA-870A-UD3 - Cooler Master Hyper 212 Plus

Permalänk
Medlem

Bygger fint på OSX 10.3, FreeBSD 5.3 och Solaris 9, men jag var tvungen att inkludera stdio.h och stdlib.h på OpenBSD 3.6 för att få deklarationer av remove() och atoll(). Programmet verkar även hänga sig i en loop om man skriver ctrl-D från prompten, vilket annars brukar funka för att avsluta såna här program.

Permalänk
Medlem

Provade bara lite hastigt, men jag gillar programmet. Syntaxen känns välbekant och det verkar räkna rätt... Fast den trigonometriska delen känns lite ofärdig, t ex ger cos(pi/2) en aproximation nära noll istället för just noll. Kan du inte använda redan bestämda värden och gränsvärden för trigonometriska funktioner av vinklar som pi/2, pi/3, osv, i alla fall för sin, cos och tan?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Masamune
Provade bara lite hastigt, men jag gillar programmet. Syntaxen känns välbekant och det verkar räkna rätt... Fast den trigonometriska delen känns lite ofärdig, t ex ger cos(pi/2) en aproximation nära noll istället för just noll. Kan du inte använda redan bestämda värden och gränsvärden för trigonometriska funktioner av vinklar som pi/2, pi/3, osv, i alla fall för sin, cos och tan?

Är cos(pi/2) = 0?

Min TI-30 miniräknare ger 0.999624217

Visa signatur

Asus P5K-Premium WiFi | Intel Core2Quad Q6600 @ 3.3Ghz | 4x2GB OCZ Platinum | Radeon HD6950GB | Intel SSD 160GB

Permalänk
Medlem

Har du den inställd på grader eller radianer?

Visa signatur

www.filipsprogram.tk - lite freeware
"Delight, herregud. Talang är bara förnamnet."

Permalänk
Citat:

Ursprungligen inskrivet av Intel_Power

Min TI-30 miniräknare ger 0.999624217

Som Delight sa, så är din räknedosa inställd i grader istället för radianer. Då får man det värdet du får.
Ang fuska och ge ett bestämt värde så gör inte matlab det heller. Programmet redovisar vad den har räknat ut, och sedan får man själv tolka svaret.
Det du bör lägga till är rad/grader inställning.

Visa signatur

[Core i7-3930K med 32GB ram, 2*256GB SSD] & [Core i7 3770K med 16 GB RAM, 256GB SSD] som tillsammans har ett [HD 5850 1GB] och 3st 24".

Permalänk
Medlem

En sak som jag fann i koden på rad 1353:

c2[0] == '\0';

Som min kompilator säger: gnaw.cpp:1353: warning: statement has no effect
long long finns tyvärr inte i ISO C++ (men i C99) så det kanske inte går att kompilera på precis alla kompilatorer (bara dom som har det som c++-extension), men gick bra på gcc 4.0 iaf.

Permalänk

Tack för alla svar!

m0rris: Dags att inkludera cstdio och cstdlib i början av koden då för att lösa problemen i OpenBSD. För de övriga kompilatorerna borde det väl inte innebära någon skillnad? Det där med ctrl-C hade jag ingen aning om (jag är en smutsig windowsanvändare till stor del), men jag inkluderade csignal och det verkade lösa samma problem på Solaris 9 i alla fall. Behöver man inte göra något mer än att inkludera den?

Masamune: Jag har också funderat på om man ska lägga in färdiga värden för vissa operationer, dock så känns det lite som att föra användaren bakom ljuset så jag har avstått. Beräkningarna är trots allt inte helt exakta, så det är lika bra ett de inte ger intryck av att vara det heller.

hivemind: Så long long finns inte? Det kanske är lika bra att använda vanliga int:ar då, men då får man ju inte leka med lika stora tal ;).
Jag kan dock inte hålla med kompilatorn om att den kodraden är meningslös, har jag inte den så kan jag inte vara säker på att textsträngens längd är noll om jag inte har lagt in något i den efteråt.

EDIT: budbundy: Jo, grader/radianer måste man naturligtvis kunna välja. När man ändå ska börja med "inställningar" så är det kanske läge för att lägga in lite mer valmöjligheter också. Vilka inställningarsmöjligheter skulle ni vilja ha?

Permalänk
Medlem

Nej, long long finns bara i den senaste standarden av C som kallas C99.

Och raden är visst meningslös för du lägger inte in nåt (tilldelar), du använder en jämförelseoperator som testar likhet och den är meningslös om det inte används i samband med en villkorssats. Du vill nog ha tilldelningsoperatorn istället (=).
Sen jämför du signed numbers med unsigned på ett otal platser i koden. Det är inte säkert att det är ett problem (jag har inte detaljgranskat koden), men det kan bli problem beroende på vad variablerna har för värden. Föreslår att du drar upp varningsnivån ett snäpp i din kompilator om du vill ha hjälp att identifiera sådana problem.

Permalänk

Oj, det var ju två = där ja. Tänk vad blind man kan vara ibland, tack för att du uppmärksammade det.
Det borde inte vara något problem med unsigned/signed, de enda gångerna jag använder unsigned är i medlemsfunktionerna factor() och prime() som faktoriserar respektive testar heltal för primalitet. Alla potentiella primtal som testas mot unsigned-talet är ju positiva ändå.

EDIT: m0rris: Jag blandade ihop ctrl-d med ctrl-c, ctrl-d ger fortfarande fel. Jag tyckte att det verkade vara en konstig lösning.

Permalänk
Medlem

Att skriva ctrl-D bör väl skicka EOF till programmet, så du ska nog bara kolla returvärdet på read() eller vad som nu används för IO. Ska inte behövas någon signalhanterare i alla fall.

För mig räckte det med att inkludera headrarna, så det ska nog räcka. Det är rätt vanligt att olika OS lägger deklarationer i olika headers, typisk grej att tänka på när man ska skriva portabel kod.

Permalänk

Ah, nu har jag varit lite förvirrad tror jag. Det var inte svårare än så alltså. Jag la till en koll i main() som gjorde att om cin.good() är falsk (det vill säga om eof, failbit eller badbit är satt) så avslutas programmet precis som om man skrivit "exit" eller "quit".

ctrl-z verkar vara det som används i Windows, i Solaris fungerar både ctrl-z och ctrl-d, fast på lite olika sätt.

Permalänk
Medlem

Ctrl-Z brukar vara suspend i Unix (dvs, en SIGTSTP), så man droppar tillbaka till shell. I så fall kan du skriva "fg" för att komma tillbaka, eller "jobs" för att se vilka program som ligger i bakgrunden.

Permalänk

Nu börjar mina bristande *nix-kunskaper lysa igenom :rolleyes:, ganska smart system dock.

Permalänk

Tycker du skall vara lite stolt över att du faktiskt försökt fullborda ett projekt och inte övergivit det i ett halvfärdigt stadium bara för att det börjar bli "tråkigt".

Skall försöka mig på att bidra med lite konstruktiv kritik och du får helt enkelt lita på mitt ord när jag säger att inte försöker såga ditt projekt. Det kändes väldigt mycket "prototyp" när jag skummade igenom koden och jag antar att du håller med mig om att det känns lite "rörigt". Mycket av detta beror på att du har stoppat in så mycket funkationlitet i själva miniräknare-klassen, men det är sånt du kommer utveckla en känsla för om ett par projekt.

Det största problemet med koden är att den alldeles för komplex. Jag tillhör själv Feynman-skolan som tycker om att försöka klura ut lösningar på egen hand INNAN man ser efter hur mer insatta människor löst samma problem. Vad sägs om att du använder erfarenheten du hämtat från att konstruera denna prototyp till att studera hur andra människor löst samma problem? Hur har folk t.ex. löst moment som du tyckte var omständiga?

Lite söktips:

Infix, Postfix, Prefix, Binary-Tree, RPN (Reverse Polish Notation), Recursive Descent Parser

Permalänk
Hedersmedlem

Är det bara jag eller är det fler som tycker att du ska skriva

Gnaw - yet another command line calculator
istället för
GNAW - yet another command line calculator

då Gnaw inte är en akronym (vad som kommer fram iaf). Trodde att du skulle följa samma trend som de flesta andra
YACLC - Yet Another Command Line Calculator

Ska testa, återkommer med resultat och kritik.

EDIT: Tips: komprimera hela katalogen istället för innehållet i mappen, nackskott på folk som gör tvärtom (som du just nu).

EDIT2: Testat lite nu, tycker det är dåligt att man inte kan skriva in mellanslag i sina uträkningar. =/

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Citat:

Ursprungligen inskrivet av BobbyFromDallas
Tycker du skall vara lite stolt över att du faktiskt försökt fullborda ett projekt och inte övergivit det i ett halvfärdigt stadium bara för att det börjar bli "tråkigt".

Skall försöka mig på att bidra med lite konstruktiv kritik och du får helt enkelt lita på mitt ord när jag säger att inte försöker såga ditt projekt. Det kändes väldigt mycket "prototyp" när jag skummade igenom koden och jag antar att du håller med mig om att det känns lite "rörigt". Mycket av detta beror på att du har stoppat in så mycket funkationlitet i själva miniräknare-klassen, men det är sånt du kommer utveckla en känsla för om ett par projekt.

Det största problemet med koden är att den alldeles för komplex. Jag tillhör själv Feynman-skolan som tycker om att försöka klura ut lösningar på egen hand INNAN man ser efter hur mer insatta människor löst samma problem. Vad sägs om att du använder erfarenheten du hämtat från att konstruera denna prototyp till att studera hur andra människor löst samma problem? Hur har folk t.ex. löst moment som du tyckte var omständiga?

Lite söktips:

Infix, Postfix, Prefix, Binary-Tree, RPN (Reverse Polish Notation), Recursive Descent Parser

Jo, lite småstolt är jag. Det är mitt första lite större projekt och jag är väl medveten om att det kan göras bättre. Jag började inse efter en stund att "hmm... det här skulle kunna gjorts mycket enklare så här, och det här hade varit bättre att göra så här, o.s.v." Däremot så hade jag ingen lust att börja om från början när jag väl hade skrivit ett och ett halvt tusen rader kod. Det är nog som du skriver lärorikt att försöka själv innan man använder någon annans lösning, nu vet jag i alla fall att uppskatta dem.

Citat:

Ursprungligen inskrivet av m0REc
Är det bara jag eller är det fler som tycker att du ska skriva

Gnaw - yet another command line calculator
istället för
GNAW - yet another command line calculator

då Gnaw inte är en akronym (vad som kommer fram iaf). Trodde att du skulle följa samma trend som de flesta andra
YACLC - Yet Another Command Line Calculator

Ska testa, återkommer med resultat och kritik.

GNAW är som du anat inte en akronym, det är bara ett namn som jag tyckte lät roligt och hade råttig anknytning. Min tamråtta dog nämligen kvällen innan jag bestämde namnet så jag var nog lite influerad. Visst hade det varit tydligare att kalla det Gnaw, men vem har sagt att man måste vara tydlig?

Citat:

Ursprungligen inskrivet av m0REc
EDIT: Tips: komprimera hela katalogen istället för innehållet i mappen, nackskott på folk som gör tvärtom (som du just nu).

Det hade jag inte en tanke på, jag ska ladda upp nya filer.

Citat:

Ursprungligen inskrivet av m0REc
EDIT2: Testat lite nu, tycker det är dåligt att man inte kan skriva in mellanslag i sina uträkningar. =/

Det har jag fixat nu, kommer i den färdiga versionen. Varför vill man skriva mellanslag förresten?

Permalänk
Hedersmedlem

Mycket lättare att läsa uttrycken.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem

Ett tips är att du kodar in stöd för en signalhanterare, då kan du enkelt hantera CTRL+D osv..

Visa signatur

"People who invent random theories which only defend the vendor must have
been beaten as children. Beaten with sticks."
- Theo de Raadt