Pitäisi saada ohjelmalle syötetyn merkkijonon kirjaimet korvattua toisilla merkeillä. Eli syötetyn sanan kirjain 'a' korvattaisiin vaikkapa 'q':lla, 'b' korvattaisiin 'w':llä jne... Käyttäjä siis syöttää ohjelmalle myös sen merkkijonon, jolla normaalit aakkoset korvataan. Eli jos ohjelmalle syöttää merkkijonon "qwertyuiop" niin sen pitäisi korvata aakkosten "abcdefghij" ja käyttää tätä "uutta aapista" syötetyn sanan uudelleenkirjoittamiseen.
Tuli kyllä tosi epäselvä selostus =/
Ihan aloittelija vasta olen, ja oon viikon verran tätä nyt pähkäillyt ja alkaa mennä hermot. Ohjelmoinnin peruskurssia käyn, ja tämä on osa sitä. En viitti suoraa vastausta tulla kysymään kun oppia kerta on tarkoituksena :)
Kuulemma pitäisi ASCII arvoja (tyyppimuunnokset?) ja kirjainten järjestysnumeroita hyödyntää, mutta kun ei osaa niin ei osaa :(
EDIT: Niin ja C++ on kyseessä :)
castratus kirjoitti:
Pitäisi saada ohjelmalle syötetyn merkkijonon kirjaimet korvattua toisilla merkeillä. Eli syötetyn sanan kirjain 'a' korvattaisiin vaikkapa 'q':lla, 'b' korvattaisiin 'w':llä jne...
Toimisiko näin:
#include <string> std::string mjono="abcdefg"; // muutetaan a-kirjain q-kirjaimeksi for (int i=0; i<mjono.length(); i++) if (mjono[i]=='a') mjono[i]='q';
Loppu onnistuu varmaankin itse.
No jokseenkin ton näkönen se ohjelma nyt jo on, mutta ei se silti oikeen toimi :)
#include <iostream> #include <cstdlib> #include <string> using namespace std; int main() { string salausavain=" "; cout << "Syötä salausavain: " << endl; cin >> salausavain; string sana=" "; cout << "Syötä salattava sana: " << endl; cin >> sana; for (unsigned int i = 0; i < sana.length(); i++) { if(sana[i]=='a'+i) { sana[i]=salausavain[i]; } } cout << sana << endl; return EXIT_SUCCESS; }
Tolta se nyt näyttää. Eikä siis tietty toimi oikein :D
Jos salausavaimeksi antaa esim "qwerty" ja salattavaksi sanaksi "abcdef" niin kyllä se sitten toimii oikein eli tulostaa "qwerty", mutta jos eka kirjain ei olekkaan 'a' ja seuraava 'b' jne niin sitten se ei korvaa niitä millään.
Eli if-lauseessa varmaan jotain häikkää? Tai uuden sanan tulostusvaiheessa? (cout << sana << endl;) ?
Sori tuplapostaus mutta ei antanut painaa "muokkaa" nappia :P
Ohjelmoinnin peruskurssi tty:llä? Juuri olen kaveria neuvonut tuossa harjoituksessa:)
Vika on tuossa for-silmukassa. Mietipäs mitä se nyt tekee: tarkistaa onko sanan i:s merkki aakkosten i:s merkki. Eihän siinä ole järkeä, lähtisin tekemään jotenkin näin:
for (int i=0; i < sana.length(); i++) { // Käydään sanan merkit läpi for (char c='a'; c<='z'; c++) { // Käydään aakkoset a-z läpi if (sana[i]==c) // I:s merkki on aakkosten kirjain (järjestysnumero int n=c-'a') } }
Toisaalta voit hyödyntää myös seuraavia std::stringin metodeja:
Täydellinen lista: http://www.cppreference.com/cppstring/index.html
Kirjautuisit sisään, niin voisipa antaakin muokata.
Teepä niin, että korvaat merkin aina salausavaimen merkillä (merkki - 'a'). Eli a korvautuu avaimen 0. merkillä jne.
Voit vielä tehdä varmuuden vuoksi (avaimen ulkopuolisten merkkien varalta) niin, että teet 256-alkioisen korvaustaulun ja laitat annetun avaimen muutokset siihen.
char korvaus[256]; for (i = 0; i < 256; ++i) { // Oletuksena merkki korvataan itsellään korvaus[i] = i; } for (i = 0; i < avain.length(); ++i) { // Avaimen arvot paikalleen korvaus[(unsigned char)('a' + i)] = avain[i]; } // Voisi ne arvot kopioida hienosti funktiollakin, ilman for-silmukkaa: // memcpy(&korvaus[(unsigned char)'a'], avain.data(), avain.length()); for (i = 0; i < sana.length(); ++i) { sana[i] = korvaus[(unsigned char)sana[i]]; }
for (char c='a'; c<='z'; z++) { // Käydään aakkoset a-z läpi
Olisikohan kuitenkin c++? :)
Kappas... no, tuollaisia virheitä tulee kun kirjoittaa koodin suoraan tähän viestiboksiin.
Heikki kirjoitti:
for (int i=0; i < sana.length(); i++) { // Käydään sanan merkit läpi for (char c='a'; c<='z'; c++) { // Käydään aakkoset a-z läpi if (sana[i]==c) // I:s merkki on aakkosten kirjain (järjestysnumero int n=c-'a') } }
Tota koetin soveltaa jotenkin, mutta en ole ihan varma tajusinko. Tohon if-lauseeseen pitäis varmaan lisätä joku "tehtävä" vielä tai jotain? Kaikkea kokeilin, mutta ohjelma tulosteli millon mitäkin ihmeellistä :)
Heikki kirjoitti:
Ohjelmoinnin peruskurssi tty:llä?
Joo sehän se. Taidan vaan olla liian tyhmä sinne :>
Metabolix kirjoitti:
Voit vielä tehdä varmuuden vuoksi (avaimen ulkopuolisten merkkien varalta) niin, että teet 256-alkioisen korvaustaulun ja laitat annetun avaimen muutokset siihen.
Tässä tapauksessa saa olettaa, että ohjelmalle syötetään vain pieniä kirjaimiä väliltä a-z. Ja syötetyn salausavainmen pitäis olla 26 merkkiä pitkä, eli kaikki aakkoset kattava.
castratus kirjoitti:
Tässä tapauksessa saa olettaa, että ohjelmalle syötetään vain pieniä kirjaimiä väliltä a-z. Ja syötetyn salausavainmen pitäis olla 26 merkkiä pitkä, eli kaikki aakkoset kattava.
Juuri äskettäin oli jokin muu aihe näitä aloittelijoiden kysymyksiä, siellä vastaava tapaus: "Tälle ei kuulu syöttää kuin lukuja." Sama se, vaikka ohjelma kaatuisi, eihän sen tarvitsekaan toimia, jos sitä ei ole tarkoitus käyttää niin. Kuvittelepa, jos tekstinkäsittelyohjelmasi kaatuisi aina, kun klikkaat vahingossa hieman ohi jostakin, sellaiseen kohtaan, josta mitään ei tapahdu. Varmasti lohduttaa paljon se ajatus, että ohjelman suunnittelijan mielestä siihen ei ollut tarkoitus klikata. Hieman kärjistetty esimerkki, mutta idea on kuitenkin siinä: ohjelman pitäisi yrittää selvitä järkevästi myös silloin, kun syöte on viallinen tai vaikkapa käyttäjä mokaa jotenkin.
Juu olihan se hyvä vinkki että kannattaisi siten tehdä, mutta tämän ohjelman kuitenkin tarkastaa toinen ohjelma, joka on ohjelmoitu tarkastamaan ohjelmani toiminta vain kirjaimilla a-z :D
Mutta juu jos tulevaisuudessa alan enemmänkin ohjelmoimaan niin onhan tuo tärkeä tieto
Niin ja kuuluu tähän ohjelmaan myös virheilmoituksen antaminen käyttäjälle, jos syötetystä salausavaimesta puuttuu jokin kirjain (eli kaikille aakkosille kuuluu olla oma vastine)tai jotain kirjainta on enemmän kuin yksi. Mutta siihen asti tuskin edes ehdin ennen deadlinea tällä tahdilla :P
Aihe on jo aika vanha, joten et voi enää vastata siihen.