2015-06-15 4 views
-4

Мне нужна помощь в программировании, у меня есть все, кроме одной части! Вот задание:Массивы в C и простые числа

Проблема 1: Операции с строками и защита данных: для повышения безопасности данных при передаче данных и информации осуществляется практическое кодирование с использованием динамического кодирования. Модификацией исходных символов может быть использование первых 8 простых членов [1, 2, 3, 5, 7, 11, 13, 17]: первый символ увеличен на 1; второй символ на 2, третий на 3, 8. восьмой символ на 17. Следующие 8 символов используют простые числа в обратном порядке 17..1 и уменьшают значения. Используйте общее сообщение не менее 64 символов [в количестве 8 символов] и повторите процесс изменения 1-17 для первых 8; изменение на 17 -1 для следующих 8 и т. д. Сделайте свое собственное сообщение. После того, как сообщение закодировано, необходимо также декодировать, чтобы восстановить исходное сообщение. Возможно, вы захотите изменить и нижний регистр, и верхний регистр.

Example: Original Message   A  B  C D. ….. 
        Normal ASCII  65 66 67 68 …. 
        Prime Numbers  1  2  3 5 ….   
        Enhanced ASCII 66 68 70 73 …. 
        Coded Message  B  D  F I …… 


У меня возникают проблемы распечатки простых чисел, не портя код после таких, как кодируется и декодируется ASCII коды и кодируются и декодируются коды. Это мой код: Если бы вы могли мне помочь, это было бы здорово! Я бы очень признателен, спасибо.

size_t x; 
int i, c; 

i = 1; 
c = 0; 

char text[65]; 
int s[8] = {1, 2, 3, 5, 7, 11, 13, 17}; 

printf("Enter a line of text: "); // prompts user to enter text 
fgets(text, 65, stdin); // reads input from user 
printf("\nOriginal Message: "); 
for(x = 0; x < strlen(text); ++x) // for loop to print original message 
{ 
    printf("%c", text[x]); 
} // end for 

// ASCII Code 
printf("\nASCII Code: "); 
for(x = 0; x < strlen(text) - 1; ++x) 
{ 
    printf("%d ", text[x]); 
} 

// prime numbers 
// my issue is here 
printf("\n\nPrime Numbers: "); 
for(x = 0; x <= 8 ; ++x) 
{ 
    if(c == 0) 
    { 
     if(i == 1) 
     { 
      printf("1 "); 
      ++i; 
     } 
     else if(i == 2) 
     { 
      printf("2 "); 
      ++i; 
     } 
     else if(i == 3) 
     { 
      printf("3 "); 
      ++i; 
     } 
     else if(i == 4) 
     { 
      printf("5 "); 
      ++i; 
     } 
     else if(i == 5) 
     { 
      printf("7 "); 
      ++i; 
     } 
     else if(i == 6) 
     { 
      printf("11 "); 
      ++i; 
     } 
     else if(i == 7) 
     { 
      printf("13 "); 
      ++i; 
     } 
     else if(i == 8) 
     { 
      printf("17 "); 
      ++c; 
      ++x; 
     } 
    } 
    if(c == 1) 
    { 
     if(i == 8) 
     { 
      printf("17 "); 
      --i; 
     } 
     else if(i == 7) 
     { 
      printf("13 "); 
      --i; 
     } 
     else if(i == 6) 
     { 
      printf("11 "); 
      --i; 
     } 
     else if(i == 5) 
     { 
      printf("7 "); 
      --i; 
     } 
     else if(i == 4) 
     { 
      printf("5 "); 
      --i; 
     } 
     else if(i == 3) 
     { 
      printf("3 "); 
      --i; 
     } 
     else if(i == 2) 
     { 
      printf("2 "); 
      --i; 
     } 
     else if(i == 1) 
     { 
      printf("1 "); 
      --c; 
     } 
    } // end outer if 
} // issue ends here 


for(x = 0; x < strlen(text) - 1; ++x) 
{ 
    if(c == 0) // outer if statement increasing 
    { 
     if(i == 1) // inner if statement 
     { 
      text[x] = text[x] + 1; 
      ++i; 
     } 
     else if (i == 2) 
     { 
      text[x] = text[x] + 2; 
      ++i; 
     } 
     else if (i == 3) 
     { 
      text[x] = text[x] + 3; 
      ++i; 
     } 
     else if(i == 4) 
     { 
      text[x] = text[x] + 5; 
      ++i; 
     } 
     else if(i == 5) 
     { 
      text[x] = text[x] + 7; 
      ++i; 
     } 
     else if(i == 6) 
     { 
      text[x] = text[x] + 11; 
      ++i; 
     } 
     else if(i == 7) 
     { 
      text[x] = text[x] + 13; 
      ++i; 
     } 
     else if(i == 8) 
     { 
      text[x] = text[x] + 17; 
      ++c; 
      ++x; 
     } // end if statement 
    } // end outer if statement 
    if(c == 1) // outer if statement decreasing 
    { 
     if(i == 8) 
     { 
      text[x] = text[x] + 17; 
      --i; 
     } 
     else if(i == 7) 
     { 
      text[x] = text[x] + 13; 
      --i; 
     } 
     else if(i == 6) 
     { 
      text[x] = text[x] + 11; 
      --i; 
     } 
     else if(i == 5) 
     { 
      text[x] = text[x] + 7; 
      --i; 
     } 
     else if(i == 4) 
     { 
      text[x] = text[x] + 5; 
      --i; 
     } 
     else if(i == 3) 
     { 
      text[x] = text[x] + 3; 
      --i; 
     } 
     else if(i == 2) 
     { 
      text[x] = text[x] + 2; 
      --i; 
     } 
     else if(i == 1) 
     { 
      text[x] = text[x] + 1; 
      --c; 
     } 
    } // end outer if 
} // end for 
printf("\n\nEncrypted Message: "); 
for(x = 0; x <= strlen(text) - 1; ++x) 
{ 
    printf("%c", text[x]); 
} 

printf("\nEncrypted ASCII: "); 
for(x = 0; x < strlen(text) - 1; x++) 
{ 
    printf("%d ", text[x]); 
} 

c = 0; 
i = 1; 

for(x = 0; x < strlen(text) - 1; ++x) 
{ 
    if(c == 0) 
    { 
     if(i == 1) 
     { 
      text[x] = text[x] - 1; 
      ++i; 
     } 
     else if(i == 2) 
     { 
      text[x] = text[x] - 2; 
      ++i; 
     } 
     else if(i == 3) 
     { 
      text[x] = text[x] - 3; 
      ++i; 
     } 
     else if(i == 4) 
     { 
      text[x] = text[x] - 5; 
      ++i; 
     } 
     else if(i == 5) 
     { 
      text[x] = text[x] - 7; 
      ++i; 
     } 
     else if(i == 6) 
     { 
      text[x] = text[x] - 11; 
      ++i; 
     } 
     else if(i == 7) 
     { 
      text[x] = text[x] - 13; 
      ++i; 
     } 
     else if(i == 8) 
     { 
      text[x] = text[x] - 17; 
      ++c; 
      ++x; 
     } // end if statement 
    } // end outer if statement 
    if(c == 1) 
    { 
     if(i == 8) 
     { 
      text[x] = text[x] - 17; 
      --i; 
     } 
     else if(i == 7) 
     { 
      text[x] = text[x] - 13; 
      --i; 
     } 
     else if(i == 6) 
     { 
      text[x] = text[x] - 11; 
      --i; 
     } 
     else if(i == 5) 
     { 
      text[x] = text[x] - 7; 
      --i; 
     } 
     else if(i == 4) 
     { 
      text[x] = text[x] - 5; 
      --i; 
     } 
     else if(i == 3) 
     { 
      text[x] = text[x] - 3; 
      --i; 
     } 
     else if(i == 2) 
     { 
      text[x] = text[x] - 2; 
      --i; 
     } 
     else if(i == 1) 
     { 
      text[x] = text[x] - 1; 
      --c; 
     } // end inner if statements 
    } // end outer if statements 
} // end for 

printf("\n\nDecrypted Message: "); 
for(x = 0; x < strlen(text); ++x) 
{ 
    printf("%c", text[x]); 
} 

printf("\nDecrypted ASCII: "); 
for(x = 0; x < strlen(text) - 1; ++x) 
{ 
    printf("%d ", text[x]); 
} 

puts (""); } // end main

+0

Можете ли вы описать, с выходными примерами, где ваша программа пойдет не так? Просто демпинг большой кучи кода здесь и просить, чтобы найти ошибку, немного грубо. –

+0

Я отредактировал мое сообщение и указал, где проблема с использованием комментариев, в основном я пытаюсь распечатать простые числа, но я не могу, потому что это испортило остальную часть моего кода, и я хотел знать, есть ли альтернативный способ печати из простых чисел, чтобы он не испортил это? Например, если пользователь вводит «инжиниринг», он должен выходить как «1, 2, 3, 5, 7, 11, 13, 17, 17, 15, 13». Он увеличивается до 17 на каждые 8 ​​символов, а затем уменьшается на следующий 8. Но я пытался обойти это, и он продолжает испортить мои коды дешифрования и шифрования, которые потом. – xiomy528

+0

О!И я бы опубликовал фотографию вывода, но это не позволяет мне:/ – xiomy528

ответ

0

Персонажи представлены числами. Например, для ASCII z представлено числом 122. Если вы добавите что-то к этому значению, вы получите новое значение (например, 122 + 17 = 139). Это новое значение может быть недействительным ASCII (например, 128 или более) и может быть управляющим кодом (например, 127 является символом управления «delete»).

Поскольку значения больше не могут служить действительными символами, вы не можете печатать их как символы. Вам нужно напечатать их как значения (например, for(x = 0; text[x] != 0; x++) { printf("%d ", text[x]); }).

Хуже того, для «подписанного полукокса», добавление может вызвать переполнение, что неопределенное поведение в C. Вы должны были бы использовать другой тип данных (например, unsigned char или uint8_t), чтобы гарантировать, что код определил/ожидаемое поведение ,

Также обратите внимание, что ваша длинная цепочка «if .. else if ... else if» должна быть «switch()» с случаями; подробнее вот так:

switch(i) { 
     case 1: 
      text[x] = text[x] + 1; 
      ++i; 
      break; 
     case 2: 
      text[x] = text[x] + 2; 
      ++i; 
      break; 
     ... 
    } 

Однако; с помощью int s[16] = {1, 2, 3, 5, 7, 11, 13, 17, 17, 13, 11, 7, 5, 3, 2, 1}; вы были бы в состоянии заменить множество строк кода, подобного с чем-то вроде этого:

for(x = 0; text[x] != 0; x++) { 
     text[x] += s[x % 16]); 
    } 
Смежные вопросы