5 / 5 / 4
Регистрация: 07.01.2013
Сообщений: 35
1

Обнуление массива перед считыванием его из файла

03.11.2015, 00:27. Показов 1239. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Необходимо сгенерировать три случайных массива в 100 элементов, вывести эти массивы на экран и в текстовый файл, обнулить в памяти массивы, вывести их на экран, считать из текстового файла записанные ранее массивы, произвести их сортировку тремя разными методами сортировки (быстрая, опорный элемент - среднее арифметическое; вставками; Шелла; по убыванию; тип данных float; диапазон (0,1)), вывести их в файл и на экран с указанием использованного метода сортировки.
В основном, почти всё удалось, однако быструю сортировку с опорным элементом - среднее арифметическое элементов массива- не смогла, точнее вроде всё согласно алгоритму, но в памяти наступает коллапс и всё ломается.((
Если опорный элемент - просто среднее арифметической первого и последнего индекса массива, то всё работает нормально. Пожалуйста, помогите! Или хотя бы совет дайте!
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#include <iostream>
#include <ctime>
#include <fstream>
#include <conio.h>
#include <cstdio>
#include <windows.h>
#include <cstring>
#include <iomanip>
const int Kolvo=100;
float *Massiv1A=new float[Kolvo];
float *Massiv2B=new float[Kolvo];
float *Massiv3C=new float[Kolvo];
float *Massiv1ABUF=new float[Kolvo];
std::ofstream FILEZAPIS("file.txt");
std::ofstream FILEZAPISSort("filesort.txt");
std::ifstream FILESCHITAT("file.txt");
float findaverage(float *masexam)
{
    float sumel=0;
    float sredar=0;
    for ( int i=0; i<Kolvo; i++)
    {
        sumel+=masexam[i];
    }
    sredar=sumel/Kolvo;
    return sredar;
}
void GeneraziyaMassiva()
{   
    srand(time(0));
    std::cout<<"Элементы первого массива\n";
    for (int iSch=0; iSch<Kolvo; iSch++)
    {
        Massiv1A[iSch]= 0.01 * (rand() % 101);
        std::cout<<std::setprecision(2)<<Massiv1A[iSch]<<" ";
        FILEZAPIS<<Massiv1A[iSch]<<" ";
    }
    FILEZAPIS<<"\n\n";
    std::cout<<"\n";
    std::cout<<"Элементы второго массива\n";
    for (int iSch2=0; iSch2<Kolvo; iSch2++)
    {
        Massiv2B[iSch2]= 0.01 * (rand() % 101);
        std::cout<<Massiv2B[iSch2]<<" ";
        FILEZAPIS<<Massiv2B[iSch2]<<" ";
    }
    FILEZAPIS<<"\n\n";
    std::cout<<"\n";
    std::cout<<"Элементы третьего массива\n";
    for (int iSch3=0; iSch3<Kolvo; iSch3++)
    {
        Massiv3C[iSch3]= 0.01 * (rand() % 101);
        std::cout<<Massiv3C[iSch3]<<" ";
        FILEZAPIS<<Massiv3C[iSch3]<<" ";
    }
    std::cout<<"\n";
    FILEZAPIS.close();
}
void Obnuleniyemassivov()
{
    std::cout<<"Обнуление первого массива\n";
    memset(Massiv1A,0,sizeof(float)*100);
    for (int obs=0;obs<Kolvo;obs++)
    {
        std::cout<<Massiv1A[obs]<<" ";
    }
    std::cout<<"\nОбнуление второго массива\n";
    memset(Massiv2B,0,sizeof(float)*100);
    for (int obs=0;obs<Kolvo;obs++)
    {
        std::cout<<Massiv2B[obs]<<" ";
    }
    std::cout<<"\nОбнуление третьего массива\n";
    memset(Massiv3C,0,sizeof(float)*100);
    for (int obs=0;obs<Kolvo;obs++)
    {
        std::cout<<Massiv3C[obs]<<" ";
    }
    std::cout<<"\n";
}
void Schitatizfile(float *mascx)
{
    for (int ia=0; ia<Kolvo; ia++)
    {
    FILESCHITAT>>mascx[ia];
    std::cout<<mascx[ia]<<" ";
    }
}
void hoarasort(float* a, int first, int last) 
{   
    float tmp;
    int i = first, j = last; 
    float x = a[(first + last) / 2];  
    do {   
            while (a[i] > x)      i++;    
            while (a[j] < x)      j--;      
            if (i <= j)    
            {      
                if (i < j)      
                {        
                    tmp=a[i];       
                    a[i]=a[j];       
                    a[j]=tmp;      
                }      
                i++;      
                j--;    
            } 
    } while (i <= j);   
    if (i < last)    
        hoarasort(a, i, last); 
    if (first < j)   
        hoarasort(a, first,j); 
}  
void shell_sort(float *masc, int size) 
{
    int i,gap,exchange_occurred;
    float temp;
    gap = size / 2;
    do {
        do {
            exchange_occurred = 0;
            for (i = 0; i < size - gap; i++) 
     if (masc[i] < masc[i + gap]) 
        {
            temp = masc[i];
            masc[i] = masc[i + gap];
            masc[i + gap] = temp;
            exchange_occurred = 1;
        }
            } while (exchange_occurred);
        } while (gap = gap / 2);
}
void InsertionSort(float *mass, int n)
{
    clock_t start;
    int iv, j;
    float temp;
    start=clock();
    for (iv=1; iv<n; iv++)
  {
      j = iv;
      temp = mass[iv];
      while (j > 0 && temp > mass[j-1])
    {
        mass[j] = mass[j-1];
      j--;
    }
    mass[j] = temp;
  }
}
int main()
{
    setlocale(LC_ALL,"RUSSIAN");
    std::cout<<"Первая часть выполнения задания;\n";
    GeneraziyaMassiva();
    Obnuleniyemassivov();
    std::cout<<"Считали первый массив из файла\n";
    Schitatizfile(Massiv1A);
    FILEZAPISSort<<"Отсортированный по убыванию первый массив быстрой сортировкой\n";
    std::cout<<"\nОтсортированный по убыванию первый массив быстрой сортировкой\n";
    hoarasort(Massiv1A,0,Kolvo-1);
    for ( int vyv=0;vyv<Kolvo;vyv++)
    {
        std::cout<<Massiv1A[vyv]<<" ";
        FILEZAPISSort<<Massiv1A[vyv]<<" ";
    }
    FILEZAPISSort<<"\n";
    std::cout<<"\n";
    std::cout<<"Считали второй массив из файла\n";
    Schitatizfile(Massiv2B);
    FILEZAPISSort<<"\nОтсортированный по убыванию второй массив сортировкой Шелла\n";
    std::cout<<"\nОтсортированный по убыванию второй массив сортировкой Шелла\n";
    shell_sort(Massiv2B,Kolvo);
    for ( int vyv1=0;vyv1<Kolvo;vyv1++)
    {
        std::cout<<Massiv2B[vyv1]<<" ";
        FILEZAPISSort<<Massiv2B[vyv1]<<" ";
    }
    FILEZAPISSort<<"\n";
    std::cout<<"\n";
    std::cout<<"Считали третий массив из файла\n";
    Schitatizfile(Massiv3C);
    FILEZAPISSort<<"\nОтсортированный по убыванию третий массив сортировкой вставками\n";
    std::cout<<"\nОтсортированный по убыванию третий массив сортировкой вставками\n";
    InsertionSort(Massiv3C,Kolvo);
    for ( int vyv2=0;vyv2<Kolvo;vyv2++)
    {
        std::cout<<Massiv3C[vyv2]<<" ";
        FILEZAPISSort<<Massiv3C[vyv2]<<" ";
    }
    std::cout<<"\n";
    delete[] Massiv1A;
    delete[] Massiv2B;
    delete[] Massiv3C;
    FILEZAPISSort.close();
    system("pause");
    return 0;
}
Вот отдельно функции расчёта среднего арифметического и быстрая сортировка:
C++
1
2
3
4
5
6
7
8
9
10
11
float findaverage(float *masexam)
{
    float sumel=0;
    float sredar=0;
    for ( int i=0; i<Kolvo; i++)
    {
        sumel+=masexam[i];
    }
    sredar=sumel/Kolvo;
    return sredar;
}
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
void hoarasort(float* a, int first, int last) 
{   
    float tmp;
    int i = first, j = last; 
    float x = a[(first + last) / 2];  
    do {   
            while (a[i] > x)      i++;    
            while (a[j] < x)      j--;      
            if (i <= j)    
            {      
                if (i < j)      
                {        
                    tmp=a[i];       
                    a[i]=a[j];       
                    a[j]=tmp;      
                }      
                i++;      
                j--;    
            } 
    } while (i <= j);   
    if (i < last)    
        hoarasort(a, i, last); 
    if (first < j)   
        hoarasort(a, first,j); 
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.11.2015, 00:27
Ответы с готовыми решениями:

Сформировать одномерный массив считыванием данных из файла, и найти максимальный и минимальный элемент массива
Помогите плиз! Сформировать одномерный массив считыванием данных из файла, и найти максимальный и...

QWebView как удалить предыдущий JavaScript перед считыванием новой страницы?
Здравствуйте. У меня получается что после считывания очередной страницы JS добавляется к уже...

Массив: Найти минимальный элемент массива и его номер, заменить его произведением элементов, стоящих перед ним.
Массив Х вводят с клавиатуры. Найти минимальный элемент массива X и его номер. Заменить его...

Обнуление значения перед выводом в StringGrid
Проблема состоит в том, что есть StringGrid в который заносится интервал времени видео клипа в...

7
7787 / 6555 / 2983
Регистрация: 14.04.2014
Сообщений: 28,633
03.11.2015, 10:22 2
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
float findaverage(float *masexam, int first, int last)
{
    float sumel=0;
    for ( int i = first; i <= last; ++i) sumel += masexam[i];
    return sumel / (last - first + 1);
}
 
void hoarasort(float* a, int first, int last) 
{   
    float tmp;
    int i = first, j = last; 
    float x = findaverage(a, first, last);
    do {   
            while (a[i] > x)      i++;    
            while (a[j] < x)      j--;      
            if (i <= j)    
            {      
                if (i < j)      
                {        
                    tmp=a[i];       
                    a[i]=a[j];       
                    a[j]=tmp;      
                }      
                i++;      
                j--;    
            } 
    } while (i <= j);   
    if (i < last)    
        hoarasort(a, i, last); 
    if (first < j)   
        hoarasort(a, first,j); 
}
1
5 / 5 / 4
Регистрация: 07.01.2013
Сообщений: 35
03.11.2015, 11:45  [ТС] 3
Спасибо огромное, только, к сожалению, стек всё равно переполняется.
0
7787 / 6555 / 2983
Регистрация: 14.04.2014
Сообщений: 28,633
03.11.2015, 17:34 4
У меня всё работает. Ты правильно скопировала?
Какой массив сортируешь?
0
5 / 5 / 4
Регистрация: 07.01.2013
Сообщений: 35
03.11.2015, 18:44  [ТС] 5
Я скопировала всё правильно, один раз отработала хорошо, а при последующем запуске программы стек переполнился.
Массив сортирую
C++
1
2
3
4
5
6
7
8
std::cout<<"\nОтсортированный по убыванию первый массив быстрой сортировкой\n";
    hoarasort(Massiv1A,0,Kolvo-1);
    for ( int vyv=0;vyv<Kolvo;vyv++)
    {
        std::cout<<Massiv1A[vyv]<<" ";
        FILEZAPISSort<<Massiv1A[vyv]<<" ";
    }
    FILEZAPISSort<<"\n";
Это массив размерностью от 0 до 1, тип float, количество элементов - 100.
0
7787 / 6555 / 2983
Регистрация: 14.04.2014
Сообщений: 28,633
03.11.2015, 23:28 6
Лучший ответ Сообщение было отмечено Иридодикциум как решение

Решение

А так?
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
float findaverage(float *masexam, int first, int last)
{
    float sumel=0;
    for ( int i = first; i <= last; ++i) sumel += masexam[i];
    return sumel / (last - first + 1);
}
 
void hoarasort(float* a, int first, int last) 
{   
    int i = first, j = last; 
    float x = findaverage(a, first, last);
    do {   
            while (a[i] > x)      i++;    
            while (a[j] < x)      j--;      
            if (i <= j)    
            {      
                if (a[i] < a[j])      
                {        
                    swap(a[i], a[j]);
                }      
                i++;      
                j--;    
            } 
    } while (i <= j);   
    if (i < last)    
        hoarasort(a, i, last); 
    if (first < j)   
        hoarasort(a, first,j); 
}
1
5 / 5 / 4
Регистрация: 07.01.2013
Сообщений: 35
04.11.2015, 22:46  [ТС] 7
Спасибо огромное!!!)
Работает. Наверное проблема в моём компиляторе (или в моих кривых руках), просто после первого запуска опять было переполнение стека, очистила решение и опять запустила, всё работает нормально.
0
7787 / 6555 / 2983
Регистрация: 14.04.2014
Сообщений: 28,633
04.11.2015, 23:01 8
Вообще-то я поменял условие в 17-й строке. Без этого не сортировало как надо, хотя и ошибок не возникало.
1
04.11.2015, 23:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.11.2015, 23:01
Помогаю со студенческими работами здесь

Как узнать размер файла перед его загрузкай
вот мой код только я не знаю чего он не работает uses System.Net,System.Windows.forms; var...

Проблемы со считыванием из файла
Добрый день, есть код программы &quot;Словарь&quot;, всё работает, но не совсем как нужно. При запуске...

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

Как можно изменить кодировку .txt файла перед его сохранением?
Как можно изменить кодировку .txt файла перед его сохранением? Например, есть a:textfile, я все...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru