Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Stringin kirjainten korvaaminen toisilla

Sivun loppuun

castratus [22.11.2006 21:41:56]

#

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

A-P [23.11.2006 10:13:30]

#

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.

castratus [23.11.2006 14:43:25]

#

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.

castratus [23.11.2006 14:46:25]

#

Eli if-lauseessa varmaan jotain häikkää? Tai uuden sanan tulostusvaiheessa? (cout << sana << endl;) ?

Sori tuplapostaus mutta ei antanut painaa "muokkaa" nappia :P

Heikki [23.11.2006 14:59:51]

#

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

Metabolix [23.11.2006 15:01:54]

#

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]];
}

Legu [23.11.2006 15:05:46]

#

for (char c='a'; c<='z'; z++) {  // Käydään aakkoset a-z läpi

Olisikohan kuitenkin c++? :)

Heikki [23.11.2006 15:15:14]

#

Kappas... no, tuollaisia virheitä tulee kun kirjoittaa koodin suoraan tähän viestiboksiin.

castratus [23.11.2006 20:05:41]

#

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.

Metabolix [23.11.2006 20:11:35]

#

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.

castratus [23.11.2006 20:26:21]

#

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


Sivun alkuun

Vastaus

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

Tietoa sivustosta