((ссылка на оригинальный вопрос в том случае, если вы знаете немецкий язык: https://stepik.org/lesson/193516/step/9?unit=167933)
Задача: printf ("falsche eingabe") всякий раз, когда во входных данных есть что-то ложное, если все верно, просто распечатайте декодированную версию)Также есть 2 режима (одиночный (abc) / мульти (aaa)), и когда есть изменение в режимах, вам также нужно напечатать "'" (режим запуска - одиночный режим.)
Пример ввода 1:
abcdefghijklmnopqrstuvwxyzabcdefghijkl
Пример вывода 1:
falsche eingabe
Пример ввода 2:
abcdefg
* 1017Выход 2:
abcdefg
Пример ввода 3:
'a2b3c2d2'efg
Пример вывода 3:
aabbbccddefg
Привет. Это моя домашняя работа, и мне уже удалось проделать это долгий путь, просто расшифровав ввод и подумав о каждом условии, при котором исходный ввод был неверным. Тогда я хорошо подумал ... Это не должнобыть лучшим способом сделать это. Поэтому я решил расшифроватькод и закодировать его снова, и если сохраненный ввод совпадает с моей закодированной версией, просто распечатайте декодированные данные, в противном случае ошибка.Проблема заключается в том, что всякий раз, когда я пытаюсь использовать входы 1- 'a2 2-ax
, декодирование работает неправильно.Я получаю результаты, как 1-аа * ||aaİ ||аа?||..... (аа + случайная метка) 2- топор + случайный знак
Когда я пробую ввод с той же логикой, но большей длины, программа работает просто отлично.
I 'Буду рад, если кто-то знает и покажет способ исправления декодирования.Я также не хочу решать эту проблему, просто добавив цикл for в конце, если это возможно ..
Спасибо вам уже
#include <stdio.h>
int main()
{
char el[50];
scanf("%s", &el); // 'a2b2c3'dfh
char saved[50]; // 'a2b2c3'dfh
char decoded[50]; //aabbcccdfh
int k, h, y = -1, b = -1; //
int multi = 0; //(while decoding) 1 -> multi , 0 -> not
char encoded[50]; // 'a2b2c3'dfh
int multi2 = 0; //(while encoding)
for (k = 0; el[k] != '\0'; k++) { //saving
saved[k] = el[k]; // 'a2b2c3'dfh
}
for (k = 0; el[k] != '\0'; k++) { //decoding
if (el[k] == 39) {
continue;
}
if (50 <= el[k + 1] && el[k + 1] <= 57) { // 2->9
if (multi == 0)
multi = 1;
}
if (multi == 0) {
y++;
decoded[y] = el[k];
}
else { //multi ==1 //a2
for (h = 0; h < (int)el[k + 1] - 48; h++) {
y++;
decoded[y] = el[k];
multi = 0;
}
k++;
}
} // decoded = aabbcccdfh ( hier ist k = laenge )
if (k > 30) {
printf("falsche eingabe");
return 0;
}
for (k = 0; k < y + 1; k++) {
if (decoded[k] == decoded[k + 1]) {
if (multi2 == 0) {
multi2 = 1;
b++;
encoded[b] = 39;
}
}
if (multi2 == 0) {
b++;
encoded[b] = decoded[k];
}
else {
b++;
encoded[b] = decoded[k];
// 0 -> decoded[k], 1 -> for, 2-> '
for (h = k; decoded[h] == decoded[h + 1]; h++)
;
b++;
encoded[b] = ((h - k + 48) + 1);
k = h;
if (decoded[k + 1] != decoded[k + 2]) {
multi2 = 0;
b++;
encoded[b] = 39;
}
}
}
//wurde die erste eingabe richtig codiert ? ( also gibt es fehler oder nicht ? )
for (k = 0; saved[k] != '\0'; k++) {
if (saved[k] != encoded[k]) {
printf("falsche eingabe\n");
return 0;
}
}
printf("%s", decoded);
}
Я попытался сделать это так же ясно, каквозможно, извините, если бы это было более ясно.