Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Silmukan lopetus enteristä

Sivun loppuun

viljami [07.11.2006 17:31:06]

#

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

kayttaja-2791 [07.11.2006 17:34:13]

#

if (muuttuja == 0)

?

Eli yksi = merkki sijoittaa, kaksi vertailee..

kayttaja-4976 [07.11.2006 17:34:21]

#

Tuo while kun perustuu siihen että looppia jatketaan kunnes ehto on nolla. Eli siis näin:

while (muuttuja) {
    //toimintaa
    //kunnes
    muuttuja = 0;
}

Pöytälamppu [07.11.2006 17:35:41]

#

Koitappas muuttaa

if (muuttuja = 0)

muotoon

if (muuttuja == 0)

Muistaakseni tuo ylempi on vain sijoittaa arvon nolla muuttujaan, ja alempi vertaa.

viljami [07.11.2006 17:43:19]

#

while (1)
      {
  //toimintaa...
     if (muuttuja == 0)
             break;
}

Tuntuu tämänkin muutoksen jälkeen vain haluavan muuttujan arvoksi 0 ennenkuin Breikkaa Loopin...

Metabolix [07.11.2006 18:32:02]

#

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.

Blaze [07.11.2006 18:35:37]

#

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

viljami [07.11.2006 19:17:09]

#

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

Spongi [07.11.2006 19:22:02]

#

Pelkkä entteri? '\n'? muuttuja == '\n'?

viljami [07.11.2006 20:00:11]

#

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

Metabolix [07.11.2006 20:04:11]

#

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.

viljami [07.11.2006 20:26:50]

#

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

Metabolix [07.11.2006 20:31:27]

#

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.

Blaze [07.11.2006 20:37:37]

#

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.

viljami [07.11.2006 21:06:01]

#

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.

Vilikki [08.11.2006 12:12:57]

#

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

A-P [08.11.2006 14:51:19]

#

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/ComS541Fall97/hw-pages/history/

viljami [10.11.2006 14:55:54]

#

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

Tzaeru [13.11.2006 11:23:43]

#

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

Metabolix [13.11.2006 21:30:23]

#

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?

viljami [13.11.2006 22:22:29]

#

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.

Tzaeru [14.11.2006 11:09:03]

#

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.

Metabolix [14.11.2006 19:18:23]

#

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.

tesmu [22.11.2006 18:58:24]

#

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 ^^

Tzaeru [22.11.2006 21:04:50]

#

No ei oikeasti pysty, kuitenkin käännät sen C++-kääntäjällä. Ei sitä sitten lasketa =P


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta