Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/29: Рейтинг темы: голосов - 29, средняя оценка - 4.52
3 / 3 / 0
Регистрация: 16.11.2011
Сообщений: 51

Текст записывается в квадратную матрицу, а затем прочитывается по спирали, начиная с центра

12.04.2012, 20:47. Показов 6700. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!
Кому не сложно, взгляните, пожалуйста.
Дан текстовый файл, содержащий текст, который должен быть зашифрован по следующему принципу: текст записывается в квадратную матрицу (матрица заполняется по строкам), а затем прочитывается по спирали, начиная с центра )против часовой стрелки).
Написать программу, считывающую текст из файла, заполняющую матрицу для шифрования текст, зашифровывающую текст и сохраняющую его в символьном файле.
Текст содержит не более 10000 знаков. Размер матрицы определить исходя из количества символов в файле.

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

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <math.h>
int main()
{
    FILE *f;
    FILE *b;
    char txt[10][10];
    int i=0, t=0; 
    int j=0, k=0;
    double v, z;
    f=fopen("text.txt", "rt");
   
    do 
    { 
        fgets (txt[i],50,f);
        txt[i][strlen(txt[i]) - 1]='\0';
         k=k+strlen(txt[i]);               //считаем количество символов в файле
        i++;
      
    }
    while (! feof(f));
    i--;
 
    v=sqrt(k);
    z=ceil(v);
    printf ("%f", z);            //размерность исходного массива
   
   for (j=0;j<i;j++) 
    printf ("%s\n", txt[j]); 
    printf ("%d\n", k); 
        t=z;
     char **a= new char* [t];
     for (i=0; i<t; i++)
     a[i]=new char [t];               
    
    fseek(f,0,SEEK_SET);             
     
     int n=0, m=0;
     do
    {
   if( m == t ) { n=n+1; m = 0; } // заполняем матрицу
   a[n][m] = fgetc( f );
   m ++;
    }
    while ( n != t  );
    
    b=fopen("itog.txt", "wt");
    
     int  i1=15, j1=15, temp=0;        //прочитываем ее по спирали в одномерный массив
     char mas1[t*t]; 
          j=0;
                while(j<j1)
                {
                    i=t-i1;
                    j=t-j1;
                for(j++; j<j1; j++)
                {
                    mas1[temp]=a[i][j];
                    temp++;
                }
                j--;
                for(i++; i<i1; i++)
                {
                    mas1[temp]=a[i][j];
                    temp++;
                }
                i--;
                for(j--; j>=t-j1; j--)
                {
                    mas1[temp]=a[i][j];
                    temp++;
                }
                j++;
                for(i--; i>t-j1; i--)
                {
                    mas1[temp]=a[i][j];
                    temp++;
                }
                i++;
                i1--;
                j1--;
                }
                for(i=t*t-1; i>=0; i--)
                    fputc(mas1[i],f);
 
                              
      getch(); 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.04.2012, 20:47
Ответы с готовыми решениями:

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

Заполнить простыми числами квадратную матрицу (по спирали, от центра)
Здравствуйте. Написать программу, заполняющую простыми числами квадратную матрицу произвольного размера в пределах от 1 до 10. Заполнение...

Начиная с элемента a11 обойти по спирали квадратную матрицу NхN
Начиная с элемента a11 обойти по спирали квадратную матрицу NхN, распечатав элементы в порядке обхода.

22
157 / 157 / 27
Регистрация: 29.03.2012
Сообщений: 418
12.04.2012, 21:00
Сделайте проверку удачно ли открылся файл.
В конце освободите выделенную память.
0
3 / 3 / 0
Регистрация: 16.11.2011
Сообщений: 51
12.04.2012, 21:10  [ТС]
antoha398, извиняюсь, за глупый вопрос, но как ее сделать?
0
157 / 157 / 27
Регистрация: 29.03.2012
Сообщений: 418
12.04.2012, 21:17
Цитата Сообщение от ПаЗитиФкА Посмотреть сообщение
antoha398, извиняюсь, за глупый вопрос, но как ее сделать?
Проверка открылся ли файл:
C
1
2
3
4
5
6
7
8
if (f == NULL) {
   printf("Ошибка открытия файла");
   exit(1);  //или какие-либо другие действия
}
else {
// основной код
 
}
1
3 / 3 / 0
Регистрация: 16.11.2011
Сообщений: 51
12.04.2012, 21:49  [ТС]
antoha398, не помогло, так же вылетает.
0
157 / 157 / 27
Регистрация: 29.03.2012
Сообщений: 418
12.04.2012, 23:01
Просмотрите код на наличие ошибок..
В Строке 28 вы присваивате z округленное значение не инициализированной переменной v
0
3 / 3 / 0
Регистрация: 16.11.2011
Сообщений: 51
12.04.2012, 23:11  [ТС]
Цитата Сообщение от ПаЗитиФкА Посмотреть сообщение
double v, z;
а в чем конфликт? обе переменные одного типа
0
157 / 157 / 27
Регистрация: 29.03.2012
Сообщений: 418
12.04.2012, 23:23
Цитата Сообщение от ПаЗитиФкА Посмотреть сообщение
а в чем конфликт? обе переменные одного типа
Что-то я уже ничего не замечаю
1
3 / 3 / 0
Регистрация: 16.11.2011
Сообщений: 51
12.04.2012, 23:34  [ТС]
Цитата Сообщение от antoha398 Посмотреть сообщение
int i1=15, j1=15,
здесь нашла ошибку.
C++
1
2
int i1, j1;
i1=t, j1=t;
но все равно ничего не изменилось
0
157 / 157 / 27
Регистрация: 29.03.2012
Сообщений: 418
13.04.2012, 02:08
Попробовал собрать у себя, программа заворачивается на первом цикле do while

Добавлено через 1 час 56 минут
Вот, пошаманил немного)

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
int main()
{
    FILE *f;
    FILE *b;
    int i=0, t=0;
    int j=0, k=0;
 
    double v;
    int z;
    f=fopen("shif.txt", "rt");
    if (f == NULL) {
        printf("File not found");
        exit(1);
    }
 
    do{
        if (fgetc(f)) ++k;
    }while (! feof(f));
    --k;
    printf("k=%d", k);
 
    v=sqrt(k);
    printf("v=%f", v);
    z=ceil(v);
    printf ("z=%f\n", z);            //размерность исходного массива
    t=z;
 
    char **a;
    int ii;
 
    a=(char**)malloc(t * sizeof(char*));
    for(ii=0;ii<t;ii++)
        a[ii]=(char*)malloc(t*sizeof(char));
 
    fseek(f,0,SEEK_SET);
 
    int n=0, m=0;
    for (n =0; n < t; ++n)
        for (m=0; m < t;++m)
            a[n][m] = fgetc( f );
 
    b=fopen("itog.txt", "wt");
    if (b == NULL){
        printf("File not created");
        exit(1);
    }
 
    int  i1=t, j1=t, temp=0;        //прочитываем ее по спирали в одномерный массив
    char mas1[t*t];
    j=0;
    while(j<j1)
    {
        i=t-i1;
        j=t-j1;
        for(j++; j<j1; j++)
        {
            mas1[temp]=a[i][j];
            temp++;
        }
        j--;
        for(i++; i<i1; i++)
        {
            mas1[temp]=a[i][j];
            temp++;
        }
        i--;
        for(j--; j>=t-j1; j--)
        {
            mas1[temp]=a[i][j];
            temp++;
        }
        j++;
        for(i--; i>t-j1; i--)
        {
            mas1[temp]=a[i][j];
            temp++;
        }
        i++;
        i1--;
        j1--;
    }
 
    fputs(mas1, b);
    fclose(f); fclose(b);
    for (i =0; i < t; ++i)
        free(a[i]);
    free(a);
 
    return 0;
}
Не знаю как по условию, но ваш алгоритм будет некорректно работать если количество символов не будет хватать для полной квадратной матрицы.
1
3 / 3 / 0
Регистрация: 16.11.2011
Сообщений: 51
13.04.2012, 13:16  [ТС]
Цитата Сообщение от antoha398 Посмотреть сообщение
но ваш алгоритм будет некорректно работать если количество символов не будет хватать для полной квадратной матрицы.
а Ваш будет?

и почему-то в файл itog.txt все равно ничего не сохраняется.
0
157 / 157 / 27
Регистрация: 29.03.2012
Сообщений: 418
13.04.2012, 17:08
Цитата Сообщение от ПаЗитиФкА Посмотреть сообщение
а Ваш будет?

и почему-то в файл itog.txt все равно ничего не сохраняется.
Я алгоритм не менял, его надо продумать хорошенько.

У меня все записывается в файл
1
 Аватар для zitxbit
96 / 748 / 279
Регистрация: 11.04.2012
Сообщений: 971
13.04.2012, 19:30
А как вы вообще представляете получение элементов матрицы "по спирали"?
0
3 / 3 / 0
Регистрация: 16.11.2011
Сообщений: 51
13.04.2012, 19:58  [ТС]
zitxbit, обходим матрицу по спирали из центра и каждый ее элемент сохраняем в одномерный массив.

antoha398, хорошо, спасибо!
0
157 / 157 / 27
Регистрация: 29.03.2012
Сообщений: 418
14.04.2012, 02:04
ПаЗитиФкА, получилось в итоге до делать?
0
3 / 3 / 0
Регистрация: 16.11.2011
Сообщений: 51
14.04.2012, 21:14  [ТС]
antoha398, еще не смотрела, времени совсем нет.
как сделаю, код сюда кину.
0
 Аватар для zitxbit
96 / 748 / 279
Регистрация: 11.04.2012
Сообщений: 971
15.04.2012, 09:01
Записать текст в матрицу X(n,n) не получится, потому что в этом случае количество
строк текста, записываемого в матрицу должено быть равно колличеству символов
в каждой строке.

Пожалуйста уточните постановку задачи.

Код на С++ получения исходной последовательности OUT(n * n) из элементов матрицы X(n,n)
считываемых в виде спирали я сделал, и кину его в одном из след. постов.

Добавлено через 16 минут
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
    
#include <stdio.h>
#include <conio.h>
 
#define N 5
 
int main(void)
{
    int X[N][N] = { { 1, 2, 4, 7, 3 },
                    { 3, 9, 2, 9, 5 },
                    { 5, 6, 4, 6, 1 },
                    { 8, 9, 7, 4, 6 },
                    { 5, 1, 3, 2, 4 } };
 
    int* out = new int[N * N - 1];
    memset((void*)out, 0x00, sizeof(int) * (N * N - 1));
 
    int n = 0;
    for (int r = 1; r <= N / 2; r++)
    {
        for (int z1 = (N / 2 - r) + 1; z1 <= N / 2 + r; z1++)
            out[n++] = X[N / 2 - r][z1];
 
        for (int z2 = (N / 2 - r) + 1; z2 <= (N / 2 + r) - 1; z2++)
            out[n++] = X[z2][N / 2 + r];
 
        for (int z3 = N / 2 + r; z3 >= (N / 2 - r) + 1; z3--)
            out[n++] = X[N / 2 + r][z3];
 
        for (int z4 = N / 2 + r; z4 >= N / 2 - r; z4--)
            out[n++] = X[z4][N / 2 - r];
    }
 
    for (int i = 0; i < N * N - 1; i++)
        printf("%d ",out[i]);
    printf("\n");
}
0
3 / 3 / 0
Регистрация: 16.11.2011
Сообщений: 51
15.04.2012, 12:48  [ТС]
zitxbit, спасибо!
насчет задачи. спросила у преподавателя: "Текст должен быть записан в квадратную матрицу. Размер матрицы получить путем округления в большую сторону квадратного корня из количества символов в тексте".
Что делать, если символов не хватает, она не уточнила. Что-то в роде "разбирайся сама".
0
 Аватар для zitxbit
96 / 748 / 279
Регистрация: 11.04.2012
Сообщений: 971
15.04.2012, 14:57
Понял. Как только сделаю сразу размещу. А вы проверяли размещенный мною код на
матрицах разного размера?
0
3 / 3 / 0
Регистрация: 16.11.2011
Сообщений: 51
15.04.2012, 18:21  [ТС]
zitxbit, да. единственное, что у меня не получилось, сменить целочисленный массив на символьный.
хотя тип я сменила на char
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.04.2012, 18:21
Помогаю со студенческими работами здесь

Заполнить квадратную матрицу, начиная от левого верхнего угла по спирали (возникает исключение)
Задача : Заполнить квадратную матрицу начинаю от левого верхнего угла по спирали : вправо - вниз - влево - вверх. #include...

Начиная с центра обойти по спирали все элементы матрицы
начиная с центра обойти по спирали все элементы матрицы размером 9х9

Начиная от центра, обойти по спирали все элементы квадратной матрицы
Доброго времени, помогите создать программу на Си/С++ Задание: Начиная от центра, обойти по спирали все элементы квадратной матрицы...

Заполнить массив 3х3 числами по возрастанию, по спирали начиная с центра
Заполнить массив 3х3 числами по возрастанию, по спирали начиная с центра. Ошибка в строчке int n=3, x=n-1, y=n, d=-1, r=9, a; ...

Осуществить перемещения символа по левой спирали начиная с центра экрана
Помогите плиз написать программу:Ввести произвольный символ с клавиатуры. Осуществить перемещения этого символа по левой спирали начиная с...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru