Tam olarak anlayamadım char bu tip durumlarda yetmiyor mu daha geniş bir tanımlayıcı ile mi tanımlamam lazım.
not:dev-c++ kullanıyorum
int main()
{
**char aa[26]="abcdefghijklmnopqrstuvwxyz";**
char pt[10];
int m,d,q=0,i,j,k[2][2],p[4],pp[4],t[5];
int k1[2][2],k2[2][2],det;
printf("enter the plaintext:" );
scanf("%s",pt);
m=strlen(pt);
printf("enter the numbers:");
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
scanf("%d",&k[i][j]);
}
}
for(i=0;i<m;i++)
{
for(j=i;j<26;j++)
{
if(pt[i]==aa[j])
{
t[q]=j%26;
++q;
}
}
}
p[0]=(k[0][0]*t[0])+(k[0][1]*t[1]);
p[1]=(k[1][0]*t[0])+(k[1][1]*t[1]);
p[2]=(k[0][0]*t[2])+(k[0][1]*t[3]);
p[3]=(k[1][0]*t[2])+(k[1][1]*t[3]);
k1[0][0]=k[1][1];
k1[0][1]=-(k[0][1]);
k1[1][0]=-(k[1][0]);
k1[1][1]=k[0][0];
det=(k1[0][0]*k1[1][1])-(k1[0][1]*k1[1][0]);
for(i=0;i<26;i++)
{
if((det*i)%26==1)
{
d=i;
}
}
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
k2[i][j]=(d*k1[i][j])%26;
}
}
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
if(k2[i][j]<0)
k2[i][j]+=26;
}
}
pp[0]=((k2[0][0]*p[0])+(k2[0][1]*p[1]))%26;
pp[1]=((k2[1][0]*p[0])+(k2[1][1]*p[1]))%26;
pp[2]=((k2[0][0]*p[2])+(k2[0][1]*p[3]))%26;
pp[3]=((k2[1][0]*p[2])+(k2[1][1]*p[3]))%26;
for(i=0;i<m;i++)
{
printf("\nThe decrypted plain text :%c",aa[pp[i]]);
}
getch();
}
char aa[26]="abcdefghijklmnopqrstuvwxyz";
boyle bir tanimlama olmaz. ya aa char dizisinin uzunlugunu initiliaze dizisi ile belirleyin. ya da boyutu vermek istiyorsaniz acik acik yazin:
char aa[26]= { 'a','b', ... '\0' }
sorununuz sondaki null karakterini bulamamasindan kaynaklaniyor. initiliaze degeri atandiginda bu otomatik konulur. ancak 26 katakter dolup 27. null yapmaya calistiginda yukaridaki hata olusur.
char aa[26]= {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
ya da böyle
string aa = "abcdefghijklmnopqrstuvwxyz";
hmm öncelikle teşekkür ederim bir başka şey sorayım konu açılmışken şimdi en basitinden şunu nasıl yaparız bir kelime girildi ve bu ali ben bunu 3 boyutlu bir diziye D[1]=1 D[2]=12 D[3]=9 şeklinde nasıl yerleştiririm
for(int j=0;j<strlen(alfabe);j++) /şeklinde harf harf alırız kelimeyi/
bundan sonra bir türlü yapamadım
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
string aa = "abcdefghijklmnopqrstuvwxyz";
string input;
cin >> input;
for(int i = 0; i < input.size(); i++){
cout << aa.find(input[i], 0)+1 << endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
int main (){
int c,i,j,k,*D;
char kelime[20];
char alfabe[]="abcdefghijklmnoprstuvyz"; /alfabeyi karakter dizisi olarak tanımlıyoruz/
printf("Sifrelencek kelimeyi kucuk harf olarak giriniz:");
scanf("%s",&kelime);
c=strlen(kelime); /sterlen komutu alınan kelimenin kaç karakter olduğunu belirliyor/
printf("%d",c);
for(int i=0;i<c;i++) {
for(int j=0;i<c;j++) {
D = (int *) malloc( sizeof(int)*c ); /kelimenin harflerini sayıya dönüştürürken kullanacağımız sayı dizisi boyutu için dinamik bellek kullanıyoruz/
if(kelime[i]==alfabe[j]){ D[i]=j;} /eğer alfabenin ilk harfi ile kelimenin ilk harfi aynı ise sayı dizisine kaçıncı harf olduğunu atıyoruz değil ise alfabeden sıradaki harfi seçip aynı olana kadar karşılaştırma yapıyoruz/
}}
for(int k=0;k<c;k++) { /şifrelenmiş hali çıktı veren aşama/
printf("%d",D[i]);}}
peki ben bu yazdığımda neden hata alıyorum
1- son satırda
printf("%d",D[i]);
şeklinde yazmışsın ama for döngüsünde artık "i" değil k değeri kullanılıyor.
_________________________________________________
2- comment'leri buraya kopyalarken yazdığını düşünüyorum, ama yine de söyleyeyim,
/* bu şekilde */
veya
// bu şekilde
comment yazmalısın.
_________________________________________________
3- c++ demişsin ama printf filan kullandığına göre sanırım c olarak derliyorsun kodu,
c'de for loop içerisinde initialize işlemi yapamıyorsun.
yani,
for(int i = 0; i < 26; i++) // sadece c++ için çalışır
int i;
for(i = 0; i < 26; i++) // hem c++ hem de c için çalışır
_________________________________________________
4- bir de iç içe for döngüsündeki ikinci for döngüsünde yani alfabeyi iterate ettiğin bölümde şu şekilde yazmışsın,
for(int j=0;i<c;j++)
dikkat edersen döngü içerisinde j kullanıyorsun ama kontol için i < c demişsin. o yüzden tüm alfabeyi döndürmek yerine sadece girdiğin kelimenin uzunluğu kadar çalışır. bir de üstüne yukarıdaki for döngüsü için de i kullanıldığında iyice garip bir durum ortaya çıkar. doğrusu şöyle olacak,
for(int j=0;j<c;j++)
_________________________________________________
5- son olarak hata değil ama kodun daha hızlı çalışması için bir öneri.
eğer harf alfabede bulunduysa artık kalan diğer harfleri de taramana gerek yok, o yüzden "break" komutuyla for döngüsünü o anda sonlandırabilirsin.
yani şöyle,
for(i=0;i<c;i++) {
for(j=0;j<26;j++) {
if(kelime[i]==alfabe[j]) {
D[i]=j;
break;
}
}
}
_________________________________________________
düzenlenmiş, çalışan koda da buradan bakabilirsin.
dl.dropbox.com
ya o kadar yardımcı oldun ki nasıl teşekkür ediceğimi bilemedim çok çok çok sağol