Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 29.03.2018
Сообщений: 160
1

Почему-то неправильно считается кол-во элементов массива

21.08.2019, 18:36. Показов 1579. Ответов 25
Метки нет (Все метки)

В последнем цикле считывается текст из файла и вместе с этим подсчитывается кол-во символов. Текст "HRYSKFQPXC" почему-то содержит 15 символов вместо десяти, оставшиеся, разумеется, заполняются случайной хренью.
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
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdlib>
 
using namespace std;
 
int main()
{
    int i,j,cnt=0,z,x,y,lE=0;
    int c1[100],c2s[100],c2[100];
    char key[10][3],msg[100];
 
    ifstream fin;
    ofstream fout;
 
    fin.open("key.txt");
 
    for(i=0;i<10;i++)
        for(j=0;j<3;j++)
            fin>>key[i][j];
 
    fin.close();
 
    for(i=0;i<10;i++)
        {
            for(j=0;j<3;j++)
            {
                if(cnt==10)
                    {cout<<endl; cnt=0;}
 
                cout<<key[i][j];
 
                cnt++;
            }
        }
 
    cnt=0,
 
    cout<<endl<<endl;
 
    fin.open("sI.txt");
 
    for(i=0;;i++)
    {
        fin>>msg[i];
 
        lE++;
 
        if(msg[i]=='\0')
        {
            lE--;
 
            break;
        }
    }
 
    fin.close();
 
    for(z=0;z<lE;z++)
        cout<<msg[z];
 
    cout<<endl<<endl<<lE;
 
    return 0;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.08.2019, 18:36
Ответы с готовыми решениями:

Почему не считается кол-во отриц. элементов
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls,...

Неправильно считается сумма, произведение нечётных положительных элементов массива
Найти сумму,произвидение нечётных положительных элементов массива Проблема в том,что например...

Неправильно считается произведение элементов массива, принадлежащих заданному диапазона
В одномерном массиве, который состоит из n целых элементов, вычислить произведение элементов...

Считается неправильно, почему?
Подскажите пожалуйста! я перемножаю числа которые находятся в текст боксах, для этого написал...

25
Продавец времени
5780 / 3189 / 732
Регистрация: 12.03.2015
Сообщений: 15,121
21.08.2019, 19:47 2
Ну чо так извращаться-то? Зачем читать файл побайтно, а не построчно, хотя бы.
Естественно, мусор в строке, т.к. этот буфер выделен на стеке. Обнули его.
Например, так:
C++
1
2
memset(msg, 0, sizeof(msg));
fin.open("sI.txt");
0
0 / 0 / 0
Регистрация: 29.03.2018
Сообщений: 160
21.08.2019, 19:58  [ТС] 3
Мне бы просто исправить подсчитывание символов, а там уже и выводиться ничего лишнего не будет.
0
Продавец времени
5780 / 3189 / 732
Регистрация: 12.03.2015
Сообщений: 15,121
21.08.2019, 20:09 4
Лучший ответ Сообщение было отмечено ChioraYaz как решение

Решение

Цитата Сообщение от ChioraYaz Посмотреть сообщение
Мне бы просто исправить подсчитывание символов,
C++
1
strlen();
Тебе обязательно читать файл посимвольно? Мож лучше поюзать какой-нить fgets()?
-------
У тебя цикл до первого нуля. Ты уверен, что в твоём файле он есть?
1
567 / 406 / 132
Регистрация: 22.11.2017
Сообщений: 1,053
21.08.2019, 20:12 5
ChioraYaz, привет!
Цитата Сообщение от ChioraYaz Посмотреть сообщение
считывается текст из файла
Кликните здесь для просмотра всего текста

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
#include <iostream>
#include <string>
#include <fstream>
 
int main()
{
    const std::string path("sI.txt");
 
    std::ifstream fin;
    fin.open(path);
    if (!fin.is_open())
        return 1;
    std::string dump;
    for (; fin.good();)
    {
        std::string line;
        std::getline(fin, line);
        dump += line + "\n";
    }
    fin.close();
    std::cout << dump << "\n";
    //std::cout << "count symbols " << dump.length() << "\n";
 
    return 0;
}
0
Миниатюры
Почему-то неправильно считается кол-во элементов массива  
0 / 0 / 0
Регистрация: 29.03.2018
Сообщений: 160
21.08.2019, 20:37  [ТС] 6
Мне именно посимвольно и необходимо.
Я ещё пытался до перехода на следующую строку считывать, но так тоже не работало, да и выглядело бы кривовато.
0
Продавец времени
5780 / 3189 / 732
Регистрация: 12.03.2015
Сообщений: 15,121
21.08.2019, 20:38 7
Цитата Сообщение от ChioraYaz Посмотреть сообщение
Мне именно посимвольно и необходимо.
Зачем?
Покаж условие задачи..
0
0 / 0 / 0
Регистрация: 29.03.2018
Сообщений: 160
21.08.2019, 20:50  [ТС] 8
Мне нужно сделать программу, которая будет шифровать и декодировать текст, используя шифр Чейза.

Добавлено через 1 минуту
Там, вроде, всё понятно. Было, до этого момента.
0
Продавец времени
5780 / 3189 / 732
Регистрация: 12.03.2015
Сообщений: 15,121
21.08.2019, 21:00 9
Цитата Сообщение от ChioraYaz Посмотреть сообщение
Мне нужно сделать программу, которая будет шифровать и декодировать текст, используя шифр Чейза.
Ну и зачем читать файл посимвольно-то? Загрузи его в память целиком и шифруй на здоровье.
Покаж файл.
0
0 / 0 / 0
Регистрация: 29.03.2018
Сообщений: 160
21.08.2019, 21:10  [ТС] 10
Просто .txt файл, что вводишь, то и должно будет кодировать.
Кстати, я сейчас воткнул lE=strlen(msg), вроде, всё в норме теперь.
0
Продавец времени
5780 / 3189 / 732
Регистрация: 12.03.2015
Сообщений: 15,121
21.08.2019, 21:43 11
Цитата Сообщение от ChioraYaz Посмотреть сообщение
я сейчас воткнул lE=strlen(msg), вроде, всё в норме теперь.
Ну и хрен с тобой. Когда будешь работать с файлами в несколько Мбайт, всё равно придётся делать это по-нормальному, а не через жопу посимвольно.
1
0 / 0 / 0
Регистрация: 29.03.2018
Сообщений: 160
21.08.2019, 21:59  [ТС] 12
Для шифрования нужно знать координаты букв в таблице. Я добавил цикл, который сравнивает элементы слова с элементами таблицы и записывает их координаты, но программа просто сразу крашится на этом моменте.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    for(z=0;z<lE;z++)
        for(i=0;i<10;i++)
            for(j=0;j<3;j++)
            {
                if(msg[z]==key[i][j])
                {
                    c1[x]=i;
 
                    c2s[x]=j;
 
                    x++;
 
                    cout<<x<<endl;
                }
            }
 
    x--;
0
Продавец времени
5780 / 3189 / 732
Регистрация: 12.03.2015
Сообщений: 15,121
21.08.2019, 22:32 13
Цитата Сообщение от ChioraYaz Посмотреть сообщение
Я добавил цикл, который сравнивает элементы слова с элементами таблицы и записывает их координаты, но программа просто сразу крашится на этом моменте. А что такое "х" и чем он инициализирован - догадайтесь сами, телепаты грёбанные!
Да?
0
0 / 0 / 0
Регистрация: 29.03.2018
Сообщений: 160
21.08.2019, 23:15  [ТС] 14
Я же сверху прикладывал весь код, там всё объявлено.

Добавлено через 3 минуты
Таблица выглядит вот так, я её тоже из файла буду считывать, чтобы не писать каждый раз.
Q W E R T Y U I O P
A S D F G H J K L Z
X C V B N M < > \ /
0
Продавец времени
5780 / 3189 / 732
Регистрация: 12.03.2015
Сообщений: 15,121
21.08.2019, 23:16 15
Цитата Сообщение от ChioraYaz Посмотреть сообщение
Я же сверху прикладывал весь код, там всё объявлено.
да йопть...

Почему-то неправильно считается кол-во элементов массива
0
0 / 0 / 0
Регистрация: 29.03.2018
Сообщений: 160
21.08.2019, 23:21  [ТС] 16
Вот чёрт, а я и забыл, что обнуления нет. Теперь всё правильно ищет, все координаты 10 букв есть.
0
Продавец времени
5780 / 3189 / 732
Регистрация: 12.03.2015
Сообщений: 15,121
21.08.2019, 23:24 17
Цитата Сообщение от ChioraYaz Посмотреть сообщение
Теперь всё правильно ищет, все координаты 10 букв есть.
Вот теперь ты молодец.
1
0 / 0 / 0
Регистрация: 29.03.2018
Сообщений: 160
22.08.2019, 12:58  [ТС] 18
Я тут заметил, что число 10 ломает шифр, исправил, теперь вместо 10, как и положено, будет 0, но я заметил одну проблему: координаты неправильные, причём они ищутся неправильно и в старом коде. Я не знаю, может, я опять забыл о чём-то, но цикл делает что-то не то.

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdlib>
 
using namespace std;
 
int main()
{
    int i,j,cnt=0,z=0,x=0,y=1,lE=0,mt=1,xC=0;
    int c1[100],c2s[100],c2[100];
    char key[10][3],msg[100];
 
    ifstream fin;
    ofstream fout;
 
    fin.open("key.txt");
 
    for(i=0;i<10;i++)
        for(j=0;j<3;j++)
            fin>>key[i][j];
 
    fin.close();
 
    for(i=0;i<10;i++)
        {
            for(j=0;j<3;j++)
            {
                if(cnt==10)
                    {cout<<endl; cnt=0;}
 
                cout<<key[i][j];
 
                cnt++;
            }
        }
 
    cnt=0,
 
    cout<<endl<<endl;
 
    memset(msg, 0, sizeof(msg));
 
    fin.open("sI.txt");
 
    for(i=0;;i++)
    {
        fin>>msg[i];
 
        if(msg[i]=='\0')
        {
            break;
        }
    }
 
    fin.close();
 
    lE=strlen(msg);
 
    for(z=0;z<lE;z++)
        cout<<msg[z];
 
    cout<<endl<<endl<<lE<<endl<<endl;
 
    for(z=0;z<lE;z++)
        for(i=0;i<10;i++)
            for(j=0;j<3;j++)
            {
                if(msg[z]==key[i][j])
                {
                    if(i==9 || j==9)
                    {
                        if(i==9)
                        {
                            c1[x]=0;
 
                            c2s[x]=j+1;
                        }
                        else
                        {
                            c1[x]=i+1;
 
                            c2s[x]=0;
                        }
                    }
                    else
                    {
                        c1[x]=i+1;
 
                        c2s[x]=j+1;
                    }
 
                    x++;
                }
            }
 
    x--;
 
    for(z=0;z<lE;z++)
        cout<<c1[z];
 
    cout<<endl;
 
    for(z=0;z<lE;z++)
        cout<<c2s[z];
 
    return 0;
}
0
Продавец времени
5780 / 3189 / 732
Регистрация: 12.03.2015
Сообщений: 15,121
22.08.2019, 14:11 19
Цитата Сообщение от ChioraYaz Посмотреть сообщение
Я не знаю, может, я опять забыл о чём-то, но цикл делает что-то не то.
Пока не научишься разделять код на функции, а не сувать всё подряд в main() - так и будет.
0
0 / 0 / 0
Регистрация: 29.03.2018
Сообщений: 160
22.08.2019, 14:17  [ТС] 20
Как-то не понравилось мне с по функциям всё раскидывать, в мэине удобнее по порядку всё делать.
А сравнение элементов точно верно записано? Не нужно вместо этого вставить сравнение кода символа?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.08.2019, 14:17

Почему неправильно считается результат?
Помогите,пожалуйста:создал два вычисляемых поля Ставка и Сумма в таблице &quot;Платежи&quot;,однако Access их...

Почему неправильно считается формула?
Вопрос в заголовке.Программа написана вроде правильно, ошибок не вижу. P.S. Так как переменные...

Почему неправильно считается простое математическое выражение?
Всем привет. Вопрос будет очень банальным: я правильно записал выражение? double R = (2 *...

Стационарное распределение марковской цепи считается неправильно, почему-то
Моделирую марковский процесс. Конкретно Матрицу переходных вероятностей. Но вот неудача, при...


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

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

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