Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192

Неверный вывод

15.06.2018, 05:34. Показов 831. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Решал следующую задачу:
Кликните здесь для просмотра всего текста

Разработать ПО работы с битами. На основе разработанного ПО, решить задачу перекодировки текстовой строки в строку, содержащую вместо каждого символа его новый числовой код, а также выполняющее декодировку. Правило перекодировки задается функцией int КОД.
Разработать функцию КОД, реализующую следующее правила перекодировки:
КОД(char s, int a,) - биты s циклически сдвинуть в право на a.
На основе разработанного ПО, реализовать пакетную перекодировку группы текстовых файлов . Имена файлов преобразования выбирать из «файла задания»:
code файл_источник файл_результат
decode файл_источник файл_результат
Имя входного файла «задания» выбрать из параметров командной строки.

Не могу понять почему, но вывод в файл происходит далеко не тот, что я хочу. Вместо читаемых символов, выводится какой-то мусор. Кто поможет понять причину?

Код:
main.cpp
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
51
52
53
54
#include <fstream>
#include <windows.h>
#include <string>
 
#include "logs.h"
#include "get_data.h"
#include "open_file.h"
 
using namespace std;
 
char path[]= "D:\\zadanie.txt";
 
int main()
{
    SetConsoleCP(1251);     //корректное отображение кириллицы
    SetConsoleOutputCP(1251);
 
    char buff[512]; // буфер промежуточного хранения считываемого из файла текста
    char oper[10]; //для хранения названия нужной нам операции
    char name_input[255]; //для хранения расположения входного текста
    char name_output[255]; //для хранения выходного текста
 
    logs(path,"начало работы",0); //сообщаем об начале работы
 
    ifstream fin(path); // открыли файл для чтения
    if (!fin.is_open()){ // если файл не открыт
        printf("%s","Файл с заданием небыл открыт, проверьте путь!"); //сделали запись об ошибке
        }else
            logs(path,"файл с заданием был успешно открыт",0); //если был открыт то сделали запись
 
    while(fin){
        fin.getline(buff, 512); // считали строку из файла
//        if ( buff[0] == '#') {
//            // todo ignore str output......
//            continue;
//        };
 
        if(! get_data(path, buff, oper, name_input, name_output)  ){ //пытаемся получить переменные
            continue; //если не получается начинаем читать новую строку
        }
 
        char par[512];
        sprintf(par, "%s %s %s",  oper, name_input, name_output);
        logs(path,par,0); //записываем в логи операцию и пути которые получилось считать
 
        if (! open_file(path, oper, name_input, name_output) ){ //если не получилось открыть файлы для де/кодировки то начинаем считывать новую строку
            continue;
        }
 
    }
    fin.close(); // закрываем файл
    (logs(path,"конец работы программы",0)); //успешное завершение работы
    return 0;
}
logs.cpp
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
#include <iostream>
#include <fstream>
#include <windows.h>
#include <string>
#include <ctime>
 
 
using namespace std;
 
int err=0; //объявленние переменной для подсчета ошибок
void logs(char *path, char *info, int status){
    int len = strlen(path); //определяем размер пути
    char e_path[len+9];     //путь для файла с логами (путь задания+.logs.txt)
 
    sprintf(e_path, "%s.logs.txt", path);//name path logs
    ofstream fout(e_path,ios_base::app); // создаём объект класса ofstream для записи всех действий;
 
    //настраиваем отображение времени
    char buffer[80];
    time_t seconds = time(NULL);
    tm* timeinfo = localtime(&seconds);
    char* format = "%H:%M:%S";
    strftime(buffer, 80, format, timeinfo);
 
    if(status==0) //если ошибки нет, то...
    fout<<"      "<<buffer<< ": "<< info<< endl;
        else{ //если ошибка есть, то...
            fout<< "error "<<buffer << ": " << info<< endl;
            err+=1;
        }
 
     if ( strcmp(info, "конец работы программы") == 0 ) {
            if(err>0){
            cout<< "\nПри работе возникло " << err << " ошибок"<< endl;
            cout<< "Проверьте журнал работы программы ";
            printf(e_path);
        }
     }
}
get_data.cpp
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
#include "logs.h"
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <windows.h>
#include <string>
#include <stdlib.h>
 
int i=0;
bool get_data(char *path, char * buff, char * oper, char * name_input, char * name_output){
    char *p;
    char razdel[]=" "; //используемые разделители
 
    //печатаем в логи номер обрабатываемой строки
    i++;
    char str[20];
    sprintf(str, "%s %d",  "строка №", i);
    logs(path,str,0);
 
    p = strtok (buff,razdel);
    if ( p != NULL ) { strcpy(oper,p); logs(path,"имя операции полученно",0);}
    else { logs(path,"имя операции не полученно",1); ; return false; };
 
    p = strtok (NULL,razdel);
    if ( p != NULL ) { strcpy(name_input,p); logs(path,"имя исходного файла полученно",0);}
    else { logs(path,"имя исходного файла не полученно",1) ; return false; };
 
    p = strtok (NULL, razdel);
    if ( p != NULL ) { strcpy(name_output,p); logs(path,"имя результирующего файла полученно",0);}
    else { logs(path,"имя результирующего файла не полученно",1) ; return false; };
    return true;
}
open_file.cpp
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
51
52
53
54
55
#include <fstream>
#include <windows.h>
#include <string>
 
#include "logs.h"
#include "code.h"
#include "decode.h"
 
using namespace std;
 
bool open_file(char *path, char *oper, char *name_input, char *name_output){
    ifstream in(name_input);
    if (!in.is_open()){ // если файл не открыт
        logs(path,"входной файл не был открыт",1); //сделали запись об ошибке
        return false; //выходим из метода
    }
 
    ofstream out(name_output);
    if (!out.is_open()){ // если файл не открыт
        logs(path,"результирующий файл не был открыт",1); //сделали запись об ошибке
        return false;
    }
    logs(path,"файлы открыты для работы ",0);
 
 
    if ( strcmp(oper, "code") == 0 ) {
        while(in.peek()!=EOF)
        {
            if(in.peek()=='\n')
                out.put(in.get());
            else
                out<<code(in.get())<<" ";//выводим в out итоговые коды через пробел
        }
        logs(path,"кодировка выполнена",0);
    }else{
        if( strcmp(oper, "decode") == 0 ) {
            while(in.peek()!=EOF)
            {
                if(in.peek()=='\n')
                    out.put(in.get());
                else
                    out<<decode(in.get())<<" ";//выводим в out итоговые коды через пробел
            }
 
            logs(path,"декодировка выполнена",0);
        }else{
            logs(path,"указанной операции не существует",1);
        }
    }
 
 
    in.close();
    out.close();
 
}
code.cpp
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
//#include <stdio.h>
//#include <iostream>
#include <bitset>
 
#include "logs.h"
 
using namespace std;
 
char code(int s) {
    //printf("%d \n",s);
 
    const unsigned int BYTE = 7; // количество разрядов
    const unsigned int STEP = 2;  // на сколько шагов нужно будет сдвинуть
 
 
    bitset<BYTE> bit(s), part1, part2, result;
 
    //cout << "bit\t" << bit << endl; // исходное число
 
    // результат будет составлен из двух частей
    part1 = bit >> STEP; // первая часть, два сдвига вправо
    //cout << "part1\t" << part1 << endl;
 
    part2 = bit << BYTE - STEP; // вторая часть, восемь сдвигов влево (десять разрядов числа минус два шага)
    //cout << "part2\t" << part2 << endl;
 
    result = part1 | part2; // объеденияем части
 
    //cout << "result\t"  << result << endl; // результат объединения частей
 
    char a = char (result.to_ulong());
    return a;
}
decode.cpp
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
//#include <stdio.h>
//#include <iostream>
#include <bitset>
 
#include "logs.h"
 
using namespace std;
 
char decode(int s) {
    //printf("%d \n",s);
 
    const unsigned int BYTE = 7; // количество разрядов
    const unsigned int STEP = 2;  // на сколько шагов нужно будет сдвинуть
 
 
    bitset<BYTE> bit(s), part1, part2, result;
 
   // cout << "bit\t" << bit << endl; // исходное число
 
    // результат будет составлен из двух частей
    part1 = bit << STEP; // первая часть, два сдвига вправо
    //cout << "part1\t" << part1 << endl;
 
    part2 = bit >> BYTE - STEP; // вторая часть, восемь сдвигов влево (десять разрядов числа минус два шага)
    //cout << "part2\t" << part2 << endl;
 
    result = part1 | part2; // объеденияем части
 
    //cout << "result\t"  << result << endl; // результат объединения частей
 
    //cout << result.to_ulong() << endl;
 
    char a = char (result.to_ulong());
    return a;
}
Добавлено через 4 часа 0 минут
Ошибочка вышла, сравнил с кодовой таблицей ascii, оказалось всё верно выводит)
Но всё же, какие есть замечания по коду? что исправить стоит?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.06.2018, 05:34
Ответы с готовыми решениями:

Неверный вывод
Только начал разбираться со списками, подскажите в чем дело, я так пониманию что у меня с сохранением значений в список что-то не то, т.к....

Неверный вывод в консоль
Здравствуйте. Начал изучать switch. Задача: Есть оценки &quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;D&quot;, &quot;F&quot;. Собственно, пользователь должен ввести произвольно...

Неверный вывод в консоль
доброго времени суток не могу понять что не правильно..до этого писал на шарпе .там проблем с многомерными массивами не было.... теперь в...

3
19 / 17 / 7
Регистрация: 18.09.2017
Сообщений: 96
15.06.2018, 05:42
Цитата Сообщение от Sergey Chepets Посмотреть сообщение
Но всё же, какие есть замечания по коду?
Сначала было бы неплохо на русском языке описать, что делает твоя программа.
0
4 / 4 / 6
Регистрация: 10.12.2016
Сообщений: 192
15.06.2018, 08:10  [ТС]
trifecta, Решить задачу перекодировки текстовой строки в строку,содержащую вместо каждого символа его новый числовой код, а также выполняющее декодировку.
Правило перекодировки задается функцией int КОД.
Разработать функцию КОД, реализующую следующее правила перекодировки:
КОД(char s) - биты s циклически сдвинуть в право на a(const).
На основе разработанного ПО, реализовать пакетную перекодировку группы текстовых файлов .
Имена файлов преобразования выбирать из «файла задания»:
(пример файла "задание")
code файл_источник файл_результат
decode файл_источник файл_результат
Имя входного файла «задания» выбрать из параметров командной строки.

Ну если и так не понятно, то не ясно что делать... другой русский я не знаю
0
19 / 17 / 7
Регистрация: 18.09.2017
Сообщений: 96
15.06.2018, 08:28
Копипаста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.06.2018, 08:28
Помогаю со студенческими работами здесь

Работа с файлами. Неверный вывод.
Всем доброго времени суток! Ребят, нужна ваша помощь! В общем, создаю файл. Потом через функцию addClient добавления нового клиента...

Неверный вывод в перегрузке оператора <<
При перегрузке функции выводит, как я поняла, адрес первого элемента из списка Помогите починить (кодблок, если что) Сама функция...

Неверный вывод количества тактов
template&lt;typename iterator&gt; std::pair&lt;int, std::pair&lt;iterator, iterator&gt;&gt; maxCrosssSubArray(iterator begin, iterator middle, iterator...

Неверный вывод массива из файла
int main(); { setlocale (0, &quot;Russian&quot;); int *A=new int; ifstream fin; fin.open(&quot;C:\\Kosmos\Documents\Visual Studio...

Неверный вывод структур знак зодиака
Доброго времени суток! Нуждаюсь в помощи. Необходимо сделать программу, что-то вроде базы данных. Есть структура, в ней хранятся имя...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru