Aloittelen C++ ohjelmointia. Ja eteeni tuli tällainen perus ongelma. Eli tällainen koodi on edessä nyt ja pienestä on kiinni että koodi toimisi, mutta kun ei tiedä oikeaa merkintätapaa..
while (1) { //toimintaa... if (muuttuja = ) break; }
Eli loopista poistuminen. Loopissa pitäisi pyöriä niin pitkään että en anna muuttujalle enää mitään arvoa, vaan painan vain enteriä. Jos kirjoitan
if (muuttuja = 0)
pitää antaa arvo 0 jotta loopista päästään ulos...
Eli itse While rakenne toimii kyllä ihan ok...
if (muuttuja == 0)
?
Eli yksi = merkki sijoittaa, kaksi vertailee..
Tuo while kun perustuu siihen että looppia jatketaan kunnes ehto on nolla. Eli siis näin:
while (muuttuja) { //toimintaa //kunnes muuttuja = 0; }
Koitappas muuttaa
if (muuttuja = 0)
muotoon
if (muuttuja == 0)
Muistaakseni tuo ylempi on vain sijoittaa arvon nolla muuttujaan, ja alempi vertaa.
while (1) { //toimintaa... if (muuttuja == 0) break; }
Tuntuu tämänkin muutoksen jälkeen vain haluavan muuttujan arvoksi 0 ennenkuin Breikkaa Loopin...
No mitenkäs muuten se muuttuja olisi tyhjä? Minkälainen muuttuja se on? C++:n stringistä voi tarkistaa vaikkapa pituuden.
Jos yrität saada tietovirrasta luettua, niin >>-operaattori odottaa, kunnes sieltä jotakin tulee. Silloin tuo ei auta, vaan joudut lukemaan getline-funktiolla stringiin, tekemään stringille (pituus)tarkistuksen ja siitä jatkamaan stringstreamilla muihin muuttujatyyppeihin.
viljami kirjoitti:
Tuntuu tämänkin muutoksen jälkeen vain haluavan muuttujan arvoksi 0 ennenkuin Breikkaa Loopin...
Tietysti, sinähän nimenomaan breikkaat juuri silloin kun muuttujan arvo on nolla.
Muutenkin, parempi idea kuin
while(1) { if(ehto) { break; } }
on
while(!ehto) { }
viljami kirjoitti:
Loopissa pitäisi pyöriä niin pitkään että en anna muuttujalle enää mitään arvoa, vaan painan vain enteriä.
Näkemättä muuta koodiasi arvaan, että kun "vain painat enteriä", on muuttujassa tyhjä merkkijono, eli ""
Blaze kirjoitti:
viljami kirjoitti:
Tuntuu tämänkin muutoksen jälkeen vain haluavan muuttujan arvoksi 0 ennenkuin Breikkaa Loopin...
Tietysti, sinähän nimenomaan breikkaat juuri silloin kun muuttujan arvo on nolla.
Muutenkin, parempi idea kuin
while(1) { if(ehto) { break; } }on
while(!ehto) { }viljami kirjoitti:
Loopissa pitäisi pyöriä niin pitkään että en anna muuttujalle enää mitään arvoa, vaan painan vain enteriä.
Näkemättä muuta koodiasi arvaan, että kun "vain painat enteriä", on muuttujassa tyhjä merkkijono, eli ""
Alkaa poltaa.. eli juurikin silloin kun muuttujan arvo = "" eli tavallaan pelkkä entteri, niin silloin pitäisi ehto täyttyä ja tulla silmukasta ulos...
Pelkkä entteri? '\n'? muuttuja == '\n'?
#include <stdio.h> void main (void) { char puskuri[128]; int muuttuja; int suurin; int pienin; int i; suurin =0; pienin =0; printf("luku:"); gets(puskuri); sscanf(puskuri,"%d",&muuttuja); suurin= muuttuja; pienin= muuttuja; while (1) { printf("luku:"); gets(puskuri); sscanf(puskuri,"%d",&muuttuja); if (muuttuja > suurin) { suurin=muuttuja; } if (muuttuja < pienin) { pienin=muuttuja; } if (muuttuja == ) break; } printf("Suurin luku: %d \n Pienin luku: %d",suurin,pienin); getchar(); }
Ei vieläkään.
Tässä on kokonaisuudessaan tuo minun koodi... Mutta en edelleenkään saa koodia toimimaan... koodin kai nyt pitäis kysellä numeroita loputtomiin, ja ottaa talteen suurin ja pienin arvo... Kun en anna enää uutta arvoa, eli painan vain entteriä. Pitäisi koodin ilmoittaa minulle suurin ja pienin arvo...
Mikä ihmeen if (muuttuja == )
?
Tarkista nyt jo hyvä ihminen siitä puskurista, onko siinä sisältöä!
Sitä paitsi tuo ohjelma kaatuu iloisesti, jos syöttää pikkuisen yli 127 merkkiä. Ei pitäisi käyttää tuollaisia funktioita. Jos kerran yrität C++:aa opetella, niin ota tietovirrat, string-tyyppi, getline-funktio ja stringstream.
Ei minun tarvi syöttää yli 127 merkkiä...
Jos tarvii voi suurentaa puskuria.
Kiitos vinkistäsi. Otan sitte seuraavaksi työn alle mainitsemasi asiat...
Mutta ilmeisesti VB mies ei voi oppia C:tä, kun en saa sitten kirvelläkään tuota toimimaan...
No esimerkiksi näin:
// Kiva otsikko (C:ssä siis ctype.h) #include <cctype> // Käytämme std-nimiavaruuden isdigit-funktiota using std::isdigit; // Totuusarvon palauttava funktio, joka ottaa tekstiä syötteenään eikä muuta syötettä miksikään. // Palauttaa toden, jos numeroita EI ollut. bool ei_ole_numeroita(const char *buf) { int i; // Syöte läpi for (i = 0; buf[i]; ++i) { // Jos on numero if (isdigit(buf[i])) { // Palautetaan false, kun kerran löytyi return false; } } // Nyt ne on käyty, ja ei tainnut siis olla numeroa. return true; } //--- Siellä koodissa (ennen sscanf:ää) if (ei_ole_numeroita(puskuri)) { break; }
Tuota voisi vielä muuttaa niinkin, että syötteen pitäisi olla ainakin osaksi numeroita (isdigit) ja muilta osin tyhjiä (isspace), jotta se kelpaisi.
Ja kysymys ei ole, tarvitseeko merkkejä syöttää enempää kuin 127, vaan että jos joku niin vahingossakin tekee, se on menoa. Hyvä ohjelma pysyy pystyssä, vaikka joku käyttäisi sitä toisin, kuin tekijä on ajatellut.
viljami kirjoitti:
Ei minun tarvi syöttää yli 127 merkkiä...
Jos tarvii voi suurentaa puskuria.
Luet vähän väliä uutisia jossain tunnetussa ohjelmassa olevasta puskuriylivuotohaavoittuvuudesta. Teit juuri omaan ohjelmaasi sellaisen. Ei kannata ehdoin tahdoin opetella pahoja tapoja, niistä voi olla vaikea opetella pois.
No kiitos. Kotin jotain koodia opetella käsittelemään ja katsomaan sitä. En ole toistaiseksi tekemässä mitään tunnettua ohjelmaa. Kysyin vain että voinko muokata omaa ohjelmaani niin että sille kelpo vastaus on pelkkä Entteri.
Jos Haluan tehdä enemmän tunnettua ohjelmaa niin, aloitan sen mielummin minulle vahvemmalla kielellä Visual Basicilla.
Eli tarkoituksenani oli vain saada jonkun tyyppistä pintaraapaisua C kielen perusteista.
viljami kirjoitti:
Aloittelen C++ ohjelmointia.
viljami kirjoitti:
Eli tarkoituksenani oli vain saada jonkun tyyppistä pintaraapaisua C kielen perusteista.
Päätä jo, oletko ohjelmoimassa C:llä vai C++:lla :)
Vilikki kirjoitti:
Päätä jo, oletko ohjelmoimassa C:llä vai C++:lla :)
Täällä tunnutaan yleensä sekoitettavan C ja C++ keskenään ja puhutaan jostain mystisestä C/C++ -kielestä. C ja C++ ovat eri kieliä. C++ on perinyt piirteitä C:stä ja Smalltalkista ja sisältää C-kielen kirjastot. C++ vain C-alijoukkoa käyttäen ei ole 1:1 -yhteensopivan C:n kanssa.
Java on saanut piirteitä C++:sta ja Smalltalkista, mutta ei kuitenkaan puhuta C++/Java -kielestä ja -kääntäjästä.
History Of Programming Languages: http://www.cs.iastate.edu/~leavens/
Nonii. Otin asioista selvää siellä missä halutaan auttaa, niin tämänkin sain sitten vihdoin viimein toimimaan...
Laitan tämän tänne, jos joku muukin sattuu joskus hamassa tulevaisudessa tätä tarvimaan:
#include <stdio.h> void main (void) { char puskuri[128]; int muuttuja; int suurin; int pienin; int i; suurin =0; pienin =0; printf("luku:"); gets(puskuri); sscanf(puskuri,"%d",&muuttuja); suurin= muuttuja; pienin= muuttuja; muuttuja =0; while (1) { printf("luku:"); gets(puskuri); sscanf(puskuri,"%d",&muuttuja); if (muuttuja > suurin) { suurin=muuttuja; } if (muuttuja < pienin) { pienin=muuttuja; } if (puskuri[0] == NULL) //Luetaan vain puskurin ensimmäinen numero... voidaan käyttää '\0' tai NULL break; } printf("Suurin luku: %d \n Pienin luku: %d",suurin,pienin); getchar(); }
Nyt kun tässä on vielä vartti aikaa ennen ah, niin ihanaa matematiikan tuntia (vasta toka kurssi, polynomifunktiot. Nää on varmaan helppoja, eiks?) voinen ehkä huomauttaa, että ensinnäkin gets(); on vähän kyseenalainen funktio.. Se kun ei ole mistään varmimmasta ja parhaasta päästä. gcc:kään siitä tykkää. Sen lisäksi varmaan kätevämpää olisi, jos sen sijaan, että lopettaisit whilen kun tietty ehto tapahtuu, niin suorittaisit whilen vain tietyn ehdon ollessa totta tai epätotta, tyyliin näin:
while (puskuri[0] != NULL) {....
Joo, varmaan ihan olematon seikka, mutta kun ei ole muutakaan tekemistä niin kirjoitan tänne tätä turhaa =)
Sen lisäksi tuosta getsista, kun se ei ole se paras vaihtoehto välttämättä ja kun kielenäsi on nyt ilmeisesti nimenomaan C++, niin suosittelisin käyttämään tietovirtoja (streams), eli sen sijaan, että tekisit gets(puskuri); voisitkin tehdä std::cin>>puskuri;
Joo, nää on tälläsiä olemattomia ja pieniä asioita, mutta tylsyyden puuskassa vaan huomauttelen :) Ei mitään vakavampaa. Vähän sama asia kuin jos englanniksi sanon jollakin peliservulla tai irkissä jotakin vähän väärin tai huonosti, niin mielellänihän siitä palautetta otan.
EDIT: hävettää jo nyt niin paljon, etten viitsi viestiäni uudelleen lukea, mutta puolet siitä saattaa olla puutaheinää, mietin vähän matskuntunnilla, että miksi edes kirjoitan tavaraa väsyneenä kofeiinin avulla hereillä pysyvänä..
Ja kokeilepa, mitä tapahtuu, kun käyttäjä syöttää tuolle ohjelmalle vaikkapa välilyönnin tai pisteen.
Mikähän minun vastauksessani oli vikana, kun ei kerran kelvannut?
Ohjelmalleni ei tarvi syöttää muuta kuin numeroita tai pelkkä entteri.
Enkä suinkaan ole arvostellut Metabolix:n koodia... Päinvastoin se tuntuu toimivan oikein hyvin. Kiitos siitä!
----
Ja tuossa ajatuksissani olin kirjottanut kahdesta täysin eri kielestä.. C:stä ja C++:sta... Siitä anteeksipyyntö... Eli kyseessähän oli C++ kieli.
Joo'o, mutta parempi se on heti alusta lähtien oppia "oikeat" tavat koodinsa tekemiseen.. Ei tule sitten päänsärkyä myöhemminkään.
Esimerkiksi, vaikka tämä onkin aivan eri tason juttua kuin se, mitä itse tarvit ja tarkoitit, niin ei pelissä voi olettaa, että kukaan ei koskaan mene seinään kiinni, vaan ihan oikeasti tehdä se törmäystarkistus :)
Toki esimerkki on melkoisen kärjistetty, mutta tajuat varmaan pointin.
Näistä koodin vikasietoisuuksista ja muista vastaavista voisi melkeinpä kirjoittaa oppaan kaveriksi sille Näin pääset alkuun ohjelmoinnissa -oppaalle. Eli vaikka ohjelmalle ei tarvitsisi jotakin syöttää, on ohjelman syytä selvitä siitäkin tilanteesta kunnialla. Jos vahingossa osuu sormi vähän näppäimen viereen ja tuleekin syötettyä ohjelmalle jotakin muuta kuin numeroita, mieluummin ottaa vastaan huomautuksen "syöte ei kelpaa, anna uusi" kuin kaatumisen tai muun aivan odottamattoman toiminnan.
A-P kirjoitti:
Vilikki kirjoitti:
Päätä jo, oletko ohjelmoimassa C:llä vai C++:lla :)
Täällä tunnutaan yleensä sekoitettavan C ja C++ keskenään ja puhutaan jostain mystisestä C/C++ -kielestä. C ja C++ ovat eri kieliä. C++ on perinyt piirteitä C:stä ja Smalltalkista ja sisältää C-kielen kirjastot. C++ vain C-alijoukkoa käyttäen ei ole 1:1 -yhteensopivan C:n kanssa.
Mutta pystyt ohjelmoimaan kumpaakin sekasi jos muistat includea kummankin standardikirjastot ^^
No ei oikeasti pysty, kuitenkin käännät sen C++-kääntäjällä. Ei sitä sitten lasketa =P
Aihe on jo aika vanha, joten et voi enää vastata siihen.