Форум программистов, компьютерный форум CyberForum.ru

Максимальный елемент массива - C++

Восстановить пароль Регистрация
 
Vistar
0 / 0 / 0
Регистрация: 26.04.2009
Сообщений: 8
23.05.2009, 03:02     Максимальный елемент массива #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
199
200
201
202
203
204
205
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <fstream.h>
#include <stdio.h>
#include <string.h>
 
#define NMAX 10
 
int** generate(int& n); // функция генерирования елементов матрицы с помощью rand
void print(int **mas, int n); // печать матрицы на экран
void print_to_file(int **mas,int n); // печать матрицы в файл
int** enter(int &n); // ввод елементов матрицы с клавиатуры
int** from_file(int &n); // считывание елементов матрицы с файла
void sum_of_all(int **mas,int n); // находит сумму всех елементов тех строк, в которых елемент стоящий на главной диагонали меньше 0
void large_num(int **mas,int n); // находит найбольший елемент из всех елементов тех строк, в которых елемент стоящий на главной диагонали меньше 0
 
int main()
{
   int **mas, n=NMAX;
   int ch;
  // clrscr();
 
   do
   {
      cout << "Ввести с помощью клавиатуры: (1)\n";
      cout << "Сгенерировать число с помощью процедуры random (2)\n";
      cout << "Записать в файл сгенерированую матрицу (3)\n";
      cout << "Взять матрицу с файла (4)\n";
      cout << "Вывести матрицу на экран (5)\n";
      cout << "Выход (0)\n";
      cout << "\nEnter you choise: ";
      cin >> ch;
      if (ch > 5)
      {
     cout << "Error! You enter wrong key. Please, retry.\n\n";
     continue;
      }
 
      switch(ch)
      {
     case 1: {mas = enter(n); break;}
     case 2: {mas = generate(n); break;}
     case 3: {print_to_file(mas,n); break;}
     case 4: {mas = from_file(n); break;}
     case 5: {print(mas,n); break;}
      }
      large_num(mas,n);
      sum_of_all(mas,n);
   }
   while (ch != 0);
 
for(int i=0; i<n; i++)
 delete[] mas[i];
delete[] mas;
return 0;
}
 
 
int** generate(int &n)
{
   int **mas = new int*[NMAX];
   for(int i=0; i<NMAX; i++)
    mas[i] = new int[NMAX];
   n = NMAX;
   srand(time(NULL));
   for (i = 0; i < n; i++)
     {
      for (int j = 0; j < n; j++)
         {
          mas[i][j] = 20 - rand() % 25;
         }
     }
return mas;
}
 
 
int** enter(int &n)
{
   int **mas;
   n = NMAX;
   for (int i = 0; i < n; i++)
   {
      for (int j = 0; j < n; j++)
     {
     cout << "Enter " << i << " " << j << " element: ";
     cin >> mas[i][j];
     }
      cout << endl << endl;
   }
   return mas;
}
 
 
int** from_file(int &n)
{
   int **mas = new int*[n];
   for(int i=0; i<n; i++)
    mas[i] = new int[n];
   int k;
   FILE *L = fopen("D:\\lab5.dat", "rb");
   n = NMAX;
   for (i = 0; i < n; i++)
   {
      for (int j = 0; j < n; j++)
     {
     fread(&k, sizeof(k), 1, L);
     mas[i][j] = k;
     }
      cout << endl << endl;
   }
   return mas;
}
 
 
void print(int **mas, int n)
{
   for (int i = 0; i < n; i++)
      {
      for (int j = 0; j < n; j++)
     {
     cout << "  " << mas[i][j];
     }
      cout << endl << endl;
      }
   getch();
}
 
 
void print_to_file(int **mas, int n)
{
   FILE *h = fopen("D:\\Lab5.dat", "wb");
   char* txt = "\n\n";
 
   for (int i = 0; i < n; i++)
      {
      for (int j = 0; j < n; j++)
     {
     fwrite(&mas[i][j], sizeof(mas), 1, h);
     }
 fwrite(txt, strlen(txt), 1, h);
      }
}
 
 
void sum_of_all(int **mas,int n)
{
   int sum = 0;
 
   for (int i = 0; i < n; i++)
      {
      for (int j = 1; j < n; j++)
     {
     if ((i == j) && (mas[i][j] < 0))
        {
        for (int b =0; b < 10; b++)
           {
           sum += mas[i][b];
           }
        }
     }
      }
   cout << "Summ is: " << sum << endl;
}
 
 
void large_num(int **mas, int n)
{
   int **mas_new = new int*[n];
   for(int i=0; i<n; i++)
    mas_new[i] = new int[n];
   for (i = 0; i < n; i++)
      {
      for (int j = 0; j < n; j++)
     {
     if ((i == j) && (mas[i][j] < 0))
        {
        for (int b = 0; b < n; b++)
           {
           mas_new[i][j] = mas[i][b];
           }
        }
      }
      }
 
 
   int max = 0;
   for (int m = 0; m < n; m++)
      {
      for (int k = 0; k < n; k++)
     {
     if (mas_new[m][k] > max)
        {
        max = mas_new[m][k];
        }
     }
      }
   cout << "max: " << max;
 
for(i = 0; i<n; i++)
{
 delete[] mas_new[i];
 delete[] mas_new;
}
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2009, 03:02     Максимальный елемент массива
Посмотрите здесь:

C++ Почему не выводит максимальный елемент?
C++ В одномерному массиве найти максимальный по модулю елемент среди отрицательних(срочно)
Сразу три 1.анализ функции, 2.замена элементов массива, 3.максимальный элемент массива C++
нулевой елемент C++
Из данного массива и другого массива того же типа, но другой размерности сформируйте общий массив и найдите его максимальный элемент C++
C++ Заменить максимальный элемент массива средним арифметическим положительных элементов массива
Мах Елемент C++
C++ Однонаправлений список. Операції: “[]” видалити елемент в заданій позиції, наприклад: int i; list L; L[i]; “[]” додати елемент в задану позицію, напр
C++ Визначте мінімальний елемент масиву, що кратний 5. Перший елемент масиву дорівнює 500. Розмір масиву 8
Найти максимальный елемент одномерного массива C++
Доделать код чтобы он искал произведение элементов строки в которой находится максимальный елемент C++
C++ Поменять максимальный и минимальный елемент

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
23.05.2009, 11:56     Максимальный елемент массива #2
C++
1
2
3
4
5
6
7
 if ((i == j) && (mas[i][j] < 0))
            {
            for (int b = 0; b < n; b++)
               {
               mas_new[i][j] = mas[i][b];
               }
            }
что делает эта конструкция?

Функция enter пытается заполнить не существующий массив

188 строка лучше написать max = max_new[0][0]; на случае если массив содержит одни отрицательные элементы.

204 и 205 строки надо поменять местами.

Функция main не правильно построена, если сразу выбрать вариант 0(выход из программы), то прежде чем завершиться, программа попытается вычислить максимальный элемент и сумму элементов(вопрос только в чем?!, динамический массив то не был создан) и освободить не существующую область памяти.

Все что пока нашел.
Vistar
0 / 0 / 0
Регистрация: 26.04.2009
Сообщений: 8
23.05.2009, 13:56  [ТС]     Максимальный елемент массива #3
C++
1
2
3
4
5
6
7
if ((i == j) && (mas[i][j] < 0))
            {
            for (int b = 0; b < n; b++)
               {
               mas_new[i][j] = mas[i][b];
               }
            }
Эта конструкция записывает в отдельный массив строки в которых елементы на главной диагонали меньше 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
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
199
200
201
202
203
204
205
206
207
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <fstream.h>
#include <stdio.h>
#include <string.h>
 
#define NMAX 10
 
int** generate(int& n); // функция генерирования елементов матрицы с помощью rand
void print(int **mas, int n); // печать матрицы на экран
void print_to_file(int **mas,int n); // печать матрицы в файл
int** enter(int &n); // ввод елементов матрицы с клавиатуры
int** from_file(int &n); // считывание елементов матрицы с файла
void sum_of_all(int **mas,int n); // находит сумму всех елементов тех строк, в которых елемент стоящий на главной диагонали меньше 0
void large_num(int **mas,int n); // находит найбольший елемент из всех елементов тех строк, в которых елемент стоящий на главной диагонали меньше 0
 
int main()
{
   int **mas, n=NMAX;
   int ch;
   clrscr();
 
   do
   {
      cout << "Ввести с помощью клавиатуры: (1)\n";
      cout << "Сгенерировать число с помощью процедуры random (2)\n";
      cout << "Записать в файл сгенерированую матрицу (3)\n";
      cout << "Взять матрицу с файла (4)\n";
      cout << "Вывести матрицу на экран (5)\n";
      cout << "Показать максимальное число (6)\n";
      cout << "Показать сумму елементов (7)\n";
      cout << "Выход (0)\n";
      cout << "\nEnter you choise: ";
      cin >> ch;
      if (ch > 7)
      {
     cout << "Error! You enter wrong key. Please, retry.\n\n";
     continue;
      }
 
      switch(ch)
      {
     case 0: {exit; break;}
     case 1: {mas = enter(n); break;}
     case 2: {mas = generate(n); break;}
     case 3: {print_to_file(mas,n); break;}
     case 4: {mas = from_file(n); break;}
     case 5: {print(mas,n); break;}
     case 6: {large_num(mas,n); break;}
     case 7: {sum_of_all(mas,n); break;}
      }
   }
   while (ch != 0);
 
for(int i=0; i<n; i++)
   delete[] mas[i];
   delete[] mas;
return 0;
}
 
 
int** generate(int &n)
{
   int **mas = new int*[NMAX];
   for(int i=0; i<NMAX; i++)
   mas[i] = new int[NMAX];
   n = NMAX;
   srand(time(NULL));
   for (i = 0; i < n; i++)
   {
      for (int j = 0; j < n; j++)
      {
     mas[i][j] = 20 - rand() % 25;
      }
   }
return mas;
}
 
 
int** enter(int &n)
{
   int **mas = new int*[NMAX];
   for(int i=0; i<NMAX; i++)
   mas[i] = new int[NMAX];
   n = NMAX;
   for (i = 0; i < n; i++)
   {
      for (int j = 0; j < n; j++)
      {
     cout << "Enter " << i << " " << j << " element: ";
     cin >> mas[i][j];
      }
      cout << endl << endl;
   }
   return mas;
}
 
 
int** from_file(int &n)
{
   int **mas = new int*[n];
   for(int i=0; i<n; i++)
   mas[i] = new int[n];
   int k;
   FILE *L = fopen("D:\\lab5.dat", "rb");
   n = NMAX;
   for (i = 0; i < n; i++)
   {
      for (int j = 0; j < n; j++)
      {
     fread(&k, sizeof(k), 1, L);
     mas[i][j] = k;
      }
      cout << endl << endl;
   }
   return mas;
}
 
 
void print(int **mas, int n)
{
   for (int i = 0; i < n; i++)
      {
      for (int j = 0; j < n; j++)
     {
     cout << "  " << mas[i][j];
     }
      cout << endl << endl;
      }
}
 
 
void print_to_file(int **mas, int n)
{
   FILE *h = fopen("D:\\Lab5.dat", "wb");
   char* txt = "\n\n";
 
   for (int i = 0; i < n; i++)
      {
      for (int j = 0; j < n; j++)
     {
     fwrite(&mas[i][j], sizeof(mas), 1, h);
     }
 fwrite(txt, strlen(txt), 1, h);
      }
}
 
 
void sum_of_all(int **mas,int n)
{
   int sum = 0;
 
   for (int i = 0; i < n; i++)
      {
      for (int j = 1; j < n; j++)
     {
     if ((i == j) && (mas[i][j] < 0))
        {
        for (int b =0; b < 10; b++)
           {
           sum += mas[i][b];
           }
        }
     }
      }
   cout << "Summ is: " << sum << endl;
}
 
 
void large_num(int **mas, int n)
{
   int **mas_new = new int*[n];
   for(int i=0; i<n; i++)
   mas_new[i] = new int[n];
   for (i = 0; i < n; i++)
   {
      for (int j = 0; j < n; j++)
      {
     if ((i == j) && (mas[i][j] < 0))
     {
        for (int b = 0; b < n; b++)
        {
           mas_new[i][j] = mas[i][b];
        }
     }
      }
   }
 
 
   int max = mas_new[0][0];
   for (int m = 0; m < n; m++)
   {
      for (int k = 0; k < n; k++)
      {
     if (mas_new[m][k] > max)
     {
        max = mas_new[m][k];
     }
      }
   }
   cout << "max: " << max << endl;
 
for(i = 0; i<n; i++)
 delete[] mas_new[i];
 delete[] mas_new;
}
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
23.05.2009, 15:16     Максимальный елемент массива #4
Если копировать строка в строку, тогда уж mas_new[i][b] = mas[i][b]. И перед копированием надо mas_new инициализировать, например нулями.
Yandex
Объявления
23.05.2009, 15:16     Максимальный елемент массива
Ответ Создать тему
Опции темы

Текущее время: 08:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru