Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Palindromit

Sivun loppuun

Aloittelija3 [26.06.2007 20:39:16]

#

Haluaisin tehdä c++ ohjelman jolla voi tehdä palindromeja mutta en tiedä mistä aloittaa =( yyh. Siis mitä funktioita yms. tarvin siihen? help

tgunner [26.06.2007 20:43:58]

#

No mieti vaikka aluksi, miten itse ratkaisisit, onko merkkijono palindromi vai ei. Tämän jälkeen voit miettiä, miten toteutat moisen ohjelmoiden.

T.M. [26.06.2007 20:46:30]

#

Tehdä palindromeja? Siis tarkoitatko että se suoltaisi suomenkielisiä sanoja taikka lauseita jotka ovat etu ja takaperin samoja tämän säännön mukaan jonka wikipediasta lainasin:

lainaus:

Palindromi on sana, virke, luku tai mikä tahansa merkkijono, jonka merkkien järjestys on etu- ja takaperin sama. Palindromia toiseen suuntaan luettaessa voivat sanavälit, välimerkit ja isot kirjaimet olla eri kohdissa.

Tuota varten tarvitset suomen kielen sanalistan, joka löytyy osoitteesta:
http://kaino.kotus.fi/sanat/nykysuomi/

Aloittelija3 [26.06.2007 20:46:55]

#

Tahtoisin oikeastaan siis tehdä funktion joka kääntää vaikka sanan Ohjelmointiputka -> aktupitniomlejho. Anteeksi jos olin hieman epäselvä ekassa viestissä..

Jaska [26.06.2007 20:52:00]

#

Lue merkit vektoriin ja tulosta käänteisessä järjestyksessä.

Aloittelija3 [26.06.2007 20:57:17]

#

Jaska kirjoitti:

Lue merkit vektoriin ja tulosta käänteisessä järjestyksessä.

Miten saisin luettua 1 merkin kerrallaan?

Pekka Karjalainen [26.06.2007 21:29:35]

#

Sinun ei tarvitse tehdä funktiota, joka kääntää merkkijonon toisinpäin, koska sellainen on valmiiksi olemassa. C++-kielen standardikirjastossa on joukko algoritmeja, jotka toimivat kaikille sopiville tietorakenteille. Niistä erityisesti reverse()-metodi kääntää ihan mitä vain, mille kääntöoperaatio on järkevä. Se on ns. geneerinen funktio. C++-oppaat kertovat lisää.

Tässä on lyhyt esimerkkiohjelma, jossa toivottavasti ei ole tyhmyyksiä. En ole vähään aikaan käyttänyt C++:aa tällä tasolla, joten toivon lukijoiden korjaavan, jos joku tyhmyys kuitenkin ujuttautui mukaan. Oma vikani joktap.

#include <algorithm>
#include <iostream>
#include <string>

// ohjelma kääntää merkkijonoja takaperoisiksi
// kunnes annetaan merkkijono "loppu"

int main () {
	std::string input;
	do {
		std::cout << "anna sana tai kirjoita 'loppu' lopettaaksesi" << std::endl;
		std::cin >> input;
		std::reverse( input.begin(), input.end() );
		std::cout << "käännettynä se on " << input << std::endl;
        } while( input != "uppol" ); // koska käännettiin
	std::cout << "ohjelman lopetus" << std::endl;
	// system( "pause" ); // Windowsin käyttäjille
	return 0;
}

Voit ottaa kommenttimerkin pois system-riviltä, jos käytät Windowsia ja ohjelma sulkeutuu liian nopeasti lopettaessa. Siitä aloittelijat aina kysyvät.

Kokeile, miten ohjelma toimii, jos annat kerralla useita välilyönnillä erotettuja sanoja. Se on tarkoituksella nyt niin. Voit myöhemmin miettiä, miten toisin voisi tehdä syötteen käsittelyn.

Antti Laaksonen [26.06.2007 22:44:51]

#

Ja ilman C++:n hienouksia sanan voi kääntää näin:

#include <stdio.h>
#include <string.h>

void kaanna(char sana[]) {
    int i, p;
    char v;
    p = strlen(sana);
    for (i = 0; i < p / 2; i++) {
        v = sana[p - i - 1];
        sana[p - i - 1] = sana[i];
        sana[i] = v;
    }
}

int main(void) {
    char sana[] = "Ohjelmointiputka";
    printf("%s\n", sana);
    kaanna(sana);
    printf("%s\n", sana);
    kaanna(sana);
    printf("%s\n", sana);
    return 0;
}

C:ssä sanan kirjaimia on helppoa siirtää ympäriinsä, koska merkkijono on taulukko. Kun ensimmäisen ja viimeisen merkin, toisen ja toiseksi viimeisen merkin jne. vaihtaa keskenään, koko sana kääntyy ympäri. Käytännössä hyvä ratkaisu on for-silmukka, jossa kirjaimia vaihdetaan alkuosan ja loppuosan välillä sanan puoliväliin asti.

Pekka Karjalainen [28.06.2007 11:51:55]

#

Kiitos Antti toisesta näkemyksestä. Aloittelijalle ei ole yhtä oikeaa tapaa ja järjestystä opetella asiat, joten hyvä vain, että voi nähdä erilaisia tapoja.


Sivun alkuun

Vastaus

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

Tietoa sivustosta