Haluaisin tehdä c++ ohjelman jolla voi tehdä palindromeja mutta en tiedä mistä aloittaa =( yyh. Siis mitä funktioita yms. tarvin siihen? help
No mieti vaikka aluksi, miten itse ratkaisisit, onko merkkijono palindromi vai ei. Tämän jälkeen voit miettiä, miten toteutat moisen ohjelmoiden.
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/
Tahtoisin oikeastaan siis tehdä funktion joka kääntää vaikka sanan Ohjelmointiputka -> aktupitniomlejho. Anteeksi jos olin hieman epäselvä ekassa viestissä..
Lue merkit vektoriin ja tulosta käänteisessä järjestyksessä.
Jaska kirjoitti:
Lue merkit vektoriin ja tulosta käänteisessä järjestyksessä.
Miten saisin luettua 1 merkin kerrallaan?
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.
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.