Форум программистов, компьютерный форум, киберфорум
Наши страницы
Basic
Войти
Регистрация
Восстановить пароль
 
Shurup22
54 / 5 / 0
Регистрация: 24.02.2012
Сообщений: 25
1

Комплексное решение задачи по "Коррекции кода"

26.02.2012, 20:09. Просмотров 913. Ответов 0
Метки нет (Все метки)

Начну с того что я уже не мало тем запостил ну как запостил, размножил по различным разделам языков в поиске помощи по решению задачи хоть и основным языком был VBA я получил ещё коды программы в C++ и Delphi и массу впечатлений и опыта
ПОЕХАЛИ

Задача "Коррекция кода":
По некоторому каналу связи передаётся сообщение, имеющее вид последовательности нулей и единиц. Из-за помех возможен ошибочный приём некоторых сигналов: нуль может быть воспринят как единица и наоборот. Для повышения вероятности правильного приёма сигналов было решено передавать каждый исгнал трижды. Теперь передатчик вместо 1 всегда передаёт 111, а вместо 0 всегда 000.
Нам предлагается написать программу, которая будет восстанавливать исходное сообщение. При передаче могли произойти ошибки, поэтому вместо каждой тройки цифр программа должна вывести ту цифру, которая встречаетсяя в этой тройке по крайне мере два раза.
Ввод: Одна строка, в которой могут быть только символы "0" и "1". Длина строки-число, кратное трём, больше двух и меньше 760.
Вывод: Мы должны вывести в одну строку раскодированное сообщение
Пример входных данных: 110111010001
Пример выходных данных: 1100

Приступим непосредственно к решению


gaw - этот человек который непосредственно решил проблему на 110 %

вот файл с незначительной моей доработкой называется Декодер отличный.xls

а вот и код этого "Декодера" в VBA



PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
Private Sub Label1_Click()
 
End Sub
 
'процедура нажатия клавиши в текстовом поле
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
'объявляем переменные для работы
Dim stroka As String ' входная строка
Dim dlina As Integer 'длина входной строки
Dim result As String 'строка-результат
Dim i As Integer     'счетчик цикла
 
'KeyCode- код нажатой клавиши  ,KeyCode = 13 соответствует Enter
If KeyCode = 13 Then              'т.о. если нажата клавиша Enter, - начинаем проверки
 
stroka = TextBox1.Text 'запомним содержимое строки
dlina = Len(TextBox1.Text) 'и определим ее длину
 
For i = 1 To dlina 'в цикле по всей длине строки
'Mid(stroka, i, 1)--- часть строки, начиная с i и длиной 1
'если текущий (i) символ строки не равен 0 и не равен 1, - то
If Mid(stroka, i, 1) <> 0 And Mid(stroka, i, 1) <> 1 Then
MsgBox "строка должна содержать только 0 и 1" 'сообщаем об этом
Exit Sub                                     'и выходим из процедуры
End If
Next i
 
If dlina < 3 Or dlina > 759 Then  'если длина не входит в оговоренный диапазон, то
MsgBox " длина строки должна быть больше 2 и меньше 760" 'сообщаем об этом
Exit Sub                           'и выходим из процедуры
End If
 
If dlina Mod 3 <> 0 Then         'если длина не кратная 3, т.е. остаток от деления на 3 не =0
MsgBox "длина строки должна быть кратна 3"  'сообщаем об этом
Exit Sub                 'и выходим из процедуры
End If
 
 
                      'если все проверки прошли, - начинаем декодировать
Label1.Caption = ""   'чистим поле для вывода
result = ""           'очищаем переменную для результата
For i = 1 To dlina Step 3 'в цикле по всей длине с шагом 3 (по три символа
kod = Val(Mid(stroka, i, 3)) 'выделяем часть строки от i длиной 3, т.е. рассматриваем все тройки
'если числовое (Val) значение тройки =0 или 1 или 10 или 100
If kod = 1 Or kod = 10 Or kod = 100 Or kod = 0 Then 'то это значит, что больше 0
result = result & 0 'тогда прибавляем к результату 0
Else               'иначе, т.е.значение тройки не равно ни 0 ни 1 ни 10 ни 100
                   'а это значит, что больше 1
result = result & 1 'тогда добавляем к результату 1
End If
Next i 'завершаем цикл
Label1.Caption = result 'и выводим результат
End If
End Sub
 
 
Private Sub UserForm_Click()
 
End Sub
так же спасибо пользователю Alex77755
данный товарищ предоставил только код и вот он ниже указан

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub Кнопка1_Щелкнуть()
Dim s As String
Dim K As Byte
Dim R As String
Do
    s = InputBox("Введите код", "Ввод данных!", "110111010001")
    If s = "" Then Exit Sub ' нажали отмена
    Debug.Print s, Len(s), Len(s) Mod 3
        If Len(s) >= 2 And Len(s) Mod 3 = 0 Then 'если символов больше 1 и их количество кратно 3
        Exit Do
    End If
 MsgBox "Некорректный ввод!", vbCritical, ""
Loop
For j = 1 To Len(s) Step 3
    K = Val(Mid(s, j, 1)) + Val(Mid(s, j + 1, 1)) + Val(Mid(s, j + 2, 1))
    R = R & IIf(K < 2, 0, 1): K = 0
Next j
MsgBox R, 64, ""
End Sub
а дальше я над ним потрудился и вот вышел файл Декодер1.xls
Но это ещё не всё

Так же спасибо огромное niXman
он сделал эту программу на языке C++, ниже код на неё

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
#include <string.h>
 
int check_string(const char* string) {
   for ( ; *string; ++string ) {
      if ( !(*string == '0' || *string == '1') )
         return 1;
   }
 
   return 0;
}
 
int is_zero(const char* string) {
   int idx = 0;
   int cnt = 0;
   for ( ; idx < 3; ++idx ) {
      if ( string[idx] == '0' )
         cnt++;
   }
 
   return cnt >= 2;
}
 
int main() {
   const int max_string_len = 760;
   char string_buf[max_string_len+1];
 
   int string_len = 0;
   int string_index = 0;
 
   // раскомментировать при сдаче
   //printf("%s\n", "Введите исходную строку длиной от 3 до 760 символов:");
   //fscanf(stdin, "%s", string_buf);
   
   // удалить при сдаче
   strcpy(string_buf, "111");
 
   string_len = strlen(string_buf);
   if ( string_len <= 760 && (string_len % 3) == 0 && check_string(string_buf) == 0 ) {
      for ( ; string_index < string_len; string_index += 3 ) {
         printf("%c", (is_zero(string_buf+string_index) ? '0' : '1'));
      }
      printf("\n");
   } else {
      printf("%s\n", "Ошибка в исходной строке. Завершаемся.");
      return 1;
   }
 
   return 0;
}
Еще нам написали программу на языке Delphi. К сожалению автор был удалён вместе со статьёй. Обязательно бы добавил, но не помню кто. Всё же этот человек молодец и ему ОГРОМНОЕ СПАСИБО!

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var s,s1:string;
    i,k:integer;
begin
//ввод строки
s1:='';
while length(s)>0 do
 begin
  k:=0;
  for i:=1 to 3 do
  if s[i]='0' then k:=k+1;
  if k>1 then s1:=s1+'0'
  else s1:=s1+'1';
  delete(s,1,3);
 end;
//вывод результата
end.
В общем. Дорогие форумчане, спасибо вам большое за поддержку, помощь, терпение . Без вас не было бы таких вот статей . Прошу понимания модераторов и администраторов: Я на данном форуме очень малое время. И хоть успел накосячить, занимаясь размножением тем, но ошибку понял.

Ещё раз ВСЕМ ОГРОМНОЕ СПАСИБО
1
Вложения
Тип файла: xls Декодер1.xls (34.0 Кб, 11 просмотров)
Тип файла: xls Декодер отличный.xls (47.5 Кб, 11 просмотров)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2012, 20:09
Ответы с готовыми решениями:

Какие св-ва одинаковые для управляющих элементов "Кнопка", "Переключатель", "Флажок", "Текстовое поле"
Какие св-ва одинаковые для управляющих элементов &quot;Кнопка&quot;, &quot;Переключатель&quot;, &quot;Флажок&quot;, &quot;Текстовое...

Методом Монте-Карло доказать решение задачи Архимеда: площадь двух "арбелесов"
Методом монте-карло доказать решение задачи архимеда: площадь двух &quot;арбелесов&quot;(на рисунке они...

Замена символа на его двухзначный порядковый номер в алфавите (например "а" меняется на "01", "к" на "12")
Нужна помощь

Создать раздел меню "Правка" и продумать логику команд "копировать", "вставить"
Здравствуйте! Все никак не могу написать код для раздела меню Правка! Есть главная форма! На этой...

Создать тип "Book" и в нём сделать пункты "автор" и "количество страниц"
нужна задача на наследование, т. е. создать родителя и наследника. создать тип Book (родитель) и в...

0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2012, 20:09

Указать для каждого вопроса проценты ответов "да", "нет", "не знаю"
Здравствуйте господа программисты и сисадмины.Помогите пожалуйста начинающему с решением следующей...

Указать для каждого вопроса проценты ответов "да", "нет", "не знаю"
В двухмерном массиве размером nхm хранятся результаты опроса n человек на m вопросов.Ответами на...

"имитатор сигнала","имитатор помехи", "фильтр" и программу "построитель графика"
требуется составить программу &quot;имитатор сигнала&quot;,&quot;имитатор помехи&quot;, &quot;фильтр&quot; и программу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.