2009-02-07 12 views
5

Başlamak için C++ kursuna dört hafta geçiyorum ve henüz döngüleri bile bilmiyorum, bu yüzden lütfen bebek sohbeti konuşun mu?C++ 'daki Sezar şifresi

Tamam, bu yüzden bir dosyadan on iki karakter dizisi (ve NULL on üç) okuyabiliyordum ve sonra harfleri üç geriye kaydırıp sonuçlarımı ekrana ve dosyaya yazmam gerekiyordu. Değişen harflerin dışında her şeyle iyiyim. Her karakteri tek tek almak, üçünü çıkarmak ve dizeyi yeniden birleştirmek için kod mil yazmak istemiyorum, ancak tüm dizeyle aynı anda nasıl çalışacağından emin değilim. Birisi bunu yapmanın gerçekten basit bir yöntemini önerebilir mi?

+0

"Henüz döngüleri bile bilmiyorum" demek, _can't_ onları henüz kullanmadığınız anlamına mı geliyor? –

+0

Harfleri dizede re pozitionthem olarak değiştirmeyi mi yoksa alfabeden önceki karakterleri mi kullandınız? –

+0

Amanda: Lütfen bir cevabı kabul edildi olarak işaretleyiniz. Almak için birkaç iyi cevap var. – abelenky

cevap

1

Karakterleri bir for döngüsü ile yineleyin. Ve istediğin şeyi char * ile yap. Ardından yeni karakteri geri koyun.

1
for(int i=0; i<12; i++){ 
    string[i] = string[i] - 3; 
} 

Dize, karakter diziniz (dizi). Eğer periyodik yapmak istiyorsanız biraz daha fazla işiniz var (I.E.'nin Z'ye bir sargısı var, fakat yukarıdaki kodun başlamasına yardımcı olmalısınız)

2

Döngüler öğrenmeniz gerekecek. Bazı kodları bir dizenin karakterleri üzerinde tekrarlamanıza izin verir, tam olarak burada ihtiyacınız olan şeydir. Dizininizde dizginiz olacak bir tamsayı değişkeni tutacaksınız ve döngü içinde bu dizindeki karakter üzerinde harfe kayma işlemini yapın ve indeks değişkenini NULL'e ulaşıncaya kadar birer birer artırın.

Düzenleme:

string[0] -= 3; // this is short for "string[0] = string[0] - 3;" 
string[1] -= 3; 
string[2] -= 3; 
... 

Sadece 12 satır kod ziyade mil yol açacaktır: Eğer kursuna henüz döngüler hakkında bilmek beklenen değilseniz, belki bunu yapmak istiyorum . Dizeyi bu şekilde "yeniden birleştirmek" zorunda değilsiniz, her karakteri yerinde düzenleyebilirsiniz. Sonra bunu yaptıktan sonra bahse girerim, döngüler kullanarak bunu yapmanın hızlı yolunu gösterirler.

1

"Harfleri 3 geriye kaydır" ile ne demek istediğimi belirsiz miyim? Bu D ==> A anlamına mı geliyor?
Öyleyse, işte basit bir döngü.

#include <string.h> 

int main(void) 
{      
    char input[13] = "ABCDEFGHIJKL"; 
    int i; 

    int len = strlen(input); 

    for(i=0; i<len; ++i) 
    { 
     input[i] = input[i]-3; 
    } 

    printf("%s", input); // OUTPUT is: ">[email protected]" 
} 
+0

WTF aşağı oy için mi? Sanırım cevabım oldukça açık ve anlaşılır. – abelenky

+0

Seni reddetmedim, ama benim tahminim olurdu çünkü kod, sadece nasıl öğrenmeye yeni başlayan biri için o kadar faydalı olmayan problemi çözmek için * nasıl * * sağladığını söylemiş olman. – Chuck

6

basit harfler (A'dan Z'ye veya a'dan z'ye) ile ilgili iseniz (ben Dosyadan okuma veya dosyaya yazma yapmadım ... senin bölüm Thats) Daha sonra dahili kodların doğrusal olduğunu varsayabilirsiniz.

Harfler 0 arasındadır, sayı olarak kodlanmıştır ve 127. A harfleri kaydırmak için 90

olarak, 65 olarak 66 olarak B, 67 olarak C, Z kodlanmıştır, sadece iç değiştirmek zorunda harf kodu bir sayıymış gibi, yani temelde sadece 3 karakterden çıkarılıyor. Kenar durumlarına dikkat edin, çünkü 3'ten 'A'ya' çıkartma size '>' (kod 62) verecektir ve 'X' değil (kod 88). "If" ifadeleri veya modulo operatörünü ("%") kullanarak bunlarla başa çıkabilirsin. İşte

A-Z, uzayın sınırları içinde tutarken döndürmek için modulous operatörünü kullanabilirsiniz, size içinde dize defa yüklendiğinde

5

yardımcı olmak için bir ASCII characters table olduğunu.

Mektupta ile başlamak için sermaye olup olmadığını takip ediyorum:

bool isCaps = (letter >= 'A') && (letter <= 'Z'); 
if(isCaps) 
    letter -= 'A'-'a'; 

ve sonra sadece bu gibi şifre değişimi yapın:

int shift = -3; 
letter -= 'a'; // to make it a number from 0-25 
letter = (letter + shift + 26) % 26; 
     // add 26 in case the shift is negative 
letter += 'a'; // back to ascii code 

nihayet

ile bitirmek
if(isCaps) 
    letter += 'A'-'a'; 

, tüm bunları bir araya getirelim:

char *mystring; // ciphertext 
int shift = -3; // ciphershift 

for(char *letter = mystring; letter; ++letter) 
{ 
    bool isCaps = (*letter >= 'A') && (*letter <= 'Z'); 
    if(isCaps) 
    *letter -= 'A'-'a'; 

    letter -= 'a'; 
    letter = (letter + shift + 26) % 26; 
    letter += 'a'; 

    if(isCaps) 
    letter += 'A'-'a'; 
}