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

В матрице удалить строки с элементами на главной диагонали, превышающими заданную величину

25.08.2007, 12:17. Показов 3079. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В матрице удалить строки с элементами на главной диагонали, превышающими заданную величину, а затем в качестве первой вставить строку из максимальных элементов соответствующих столбцов.(Для размещения массивов следует использовать динамическую память).
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.08.2007, 12:17
Ответы с готовыми решениями:

В матрице удалить строки с нулевыми элементами выше главной диагонали
Помогите разобраться: В матрице удалить строки с нулевыми элементами выше главной диагонали. Код работает правильно через раз,не могу...

Удалить из матрицы строки с нулевыми элементами выше главной диагонали
Уменьшить размер матрицы A, удалив из неё строки с нулевыми элементами выше главной диагонали. Я написал такой код: begin ...

Вывести вектор, образуемый элементами главной диагонали матрицы, и результат умножения указанного вектора на заданную матрицу
Первую часть решила кое как, как записать числа из главной диагонали в отдельный массив и перемножить матрицу на матрицу? #include...

7
0 / 0 / 3
Регистрация: 27.08.2007
Сообщений: 26
28.08.2007, 20:03
Могу попробовать... для тренировки мозгов (на чистом С).
Задача еще актуальна? Когда крайний срок?
0
StroitelGizni
29.08.2007, 13:44
Цитата Сообщение от Herbert Посмотреть сообщение
Могу попробовать... для тренировки мозгов (на чистом С).
Задача еще актуальна? Когда крайний срок?
Задача актуальна, но вот сроки уже поджимают. Хотелось бы к завтрашнему вечеру(30.09.07).
0 / 0 / 3
Регистрация: 29.08.2007
Сообщений: 9
29.08.2007, 19:26
"а затем в качестве первой вставить строку из максимальных элементов соответствующих столбцов"
в смысле из столбцов, которые пересекаються с удаляемыми строками на элементе из диагонали ?
тоесть когда мы нашли на диагонали элемент больше лимита, то ищем на его столбце максимальный элемент и добавляем его до нового рядка ?
тогда если, например удалены будут 3 рядка, а столбцов у матрицы 5, остальные заменить нулями ?
и ещё - если так, то мы ведь можем удаляя строку удалить элемент, который при следующем поиске на стролбце мог бы быть максимальным элементом, это нормально ? или удалять строки только в конце ?

могу решить задачу на C++ с использованием вектора в векторе как базу данных если будут осветлены выше перечисленные вопросы

а ещё лучше, если автор наведёт маленький пример
0
0 / 0 / 3
Регистрация: 27.08.2007
Сообщений: 26
29.08.2007, 22:27
"а затем в качестве первой вставить строку из максимальных элементов соответствующих столбцов"
в смысле из столбцов, которые пересекаються с удаляемыми строками на элементе из диагонали ?
тоесть когда мы нашли на диагонали элемент больше лимита, то ищем на его столбце максимальный элемент и добавляем его до нового рядка ?
тогда если, например удалены будут 3 рядка, а столбцов у матрицы 5, остальные заменить нулями ?
и ещё - если так, то мы ведь можем удаляя строку удалить элемент, который при следующем поиске на стролбце мог бы быть максимальным элементом, это нормально ? или удалять строки только в конце ?
Думаю, что это все равно... Задача-то чисто учебная вроде.
0
0 / 0 / 3
Регистрация: 27.08.2007
Сообщений: 26
29.08.2007, 22:36
Короче, учитывая, что решение нужно уже через сутки, решил вывалить что есть...
Этот код решает задачу наполовину (удаляет строки из матрицы, динамически выделяет память под массивы, но не заменяет первую строку).
Вдруг чем поможет...

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
208
209
210
# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>
 
unsigned long vnitf_function(char file_name[]);
int           noeitlof_function (char file_name[], unsigned int line_number);
double        *fdaftf_function(char file_name[], unsigned int size);
 
main()
 
{
 
char *file_name="in_file.txt";  // Здесь задается имя файла где у тебя исходная матрица сидит
double some_var=10;            // Здесь указывается значение той самой "заданнной величины"
 
 
double *matrix;
int array_size;
int line, column;
long int count;
long int line_length;
 
int i, j;
 
int *array;
 
count=vnitf_function(file_name);
 
line_length=noeitlof_function (file_name, 2);
 
matrix=fdaftf_function(file_name, count);
 
 
array=malloc(sizeof(int));
array[0]=1;
array_size=array[0];
 
for (i=1; i<=count; i++)
{
line=1+(((int)((i-1)/line_length)));
column=i-(line_length*((int)((i-1)/(line_length))));
 
  if ((line==column)&&(matrix[i]>some_var)) 
  {
    array_size++;
    array=realloc(array,(array_size*(sizeof(int))) ); 
    array[0]=array_size;
    array[array_size-1]=line;
  }
 
 
}
 
 
  for (i=(array_size-1); i>=1; i--)
  
  {          
 
       for (j=1; j<=(((int)matrix[0])-1); j++)
       {
               if (j>=(array[i]*line_length-line_length+1))
               matrix[j]=matrix[j+line_length];
 
       }
         matrix[0]-=line_length;
 
  }
  
 
free(array);
matrix=realloc(matrix,(int)(matrix[0])*sizeof(double));
 
 
 
printf("The rezult is:");
printf("\n\n");
 
j=1;
 for (i=1; (i<=(matrix[0]-1)); i++)
 {
 
   printf(" %g ", matrix[i]);
   j++;
   if (j>line_length) { printf("\n"); j=1;}
 }
 printf("\n");
 
free(matrix);
 
}
 
 
 unsigned long vnitf_function(char file_name[])
 
         {
 
           FILE *f;
           int i;
           int value_number=0;  
           int value_flag=0;
            
           f=fopen(file_name,"r");
               
            if (f==NULL)
            {
            printf("\nError in function dvnitf_funtion.\nFile is not found\n");
            return(0);
            }
 
               i=fgetc(f);
 
                        while (i!=EOF)  
                        {
                         if ((i!=10)&&(i!=32)&&(value_flag==0)) {++value_number; value_flag=1;}
                         if (((i==10)||(i==32))&&(value_flag==1)) value_flag=0;
                         i=fgetc(f);
                        }
 
                        fclose(f);
 
        
              return (value_number);
 
         }
 
 
int noeitlof_function (char file_name[], unsigned int line_number)
 
         {
            FILE *f;
            int i1=0,i2=0;                                   
            int number_of_elements=0;                           
            unsigned int n=1;
            int sign_flag=0;
 
 
            f=fopen(file_name,"r");                 
            if (f==NULL)                            
            {
            printf("\nError in function noeitfl_function.\nFile is not found\n");
            return(0);
            }
 
            i1=fgetc(f);
            if (i1!=EOF) i2=fgetc(f);
 
              while ((n<=(line_number-1))&&(i2!=EOF))      
              {
                  i1=i2;
                  i2=fgetc(f);
                  if ((i1!=32)&&(i1!=10)) sign_flag=1;
                  if ((sign_flag==1)&&(i2==10)) {n++; sign_flag=0;}
              }
 
            
 
            i1=fgetc(f);
 
            while (((i1==10)||(i1==32))&&(i1!=EOF))    
              
              {
                  i2=getc(f);
                  i1=i2;
              }
    
            
            if (i1!=EOF) i2=fgetc(f);
            if ((i1!=32)&&(i1!=EOF)&&(i1!=10)) {number_of_elements=1; i1=i2; i2=fgetc(f);}
 
 
              while ((i2!=10)&&(i2!=EOF))                           
              {
              
                  if ((i2!=32)&&((i1==32)||(i1==10))) number_of_elements++;
 
              i1=i2;
              i2=fgetc(f);
 
              }  
              
            
               return (number_of_elements);
          }
 
 
 
double *fdaftf_function(char file_name[], unsigned int size)
    {
         FILE *f;
         unsigned int i;
         double *array;
 
         array=malloc((size+1)*sizeof(double));
 
         f=fopen(file_name,"r");
         if (f!=NULL)
 
         {
             *array=(size+1);
 
             for (i=1; i<(size+1); i++)
                {
                fscanf(f,"%lf",(array+i));
                }
 
         }
         else printf("Error in fda_function. Not enough memory ");
 
        return(array);
    }



Исходная матрица берется из файла. Результирующая печатается на экран. "Заданная величина" задается в double some_var.
0
0 / 0 / 3
Регистрация: 27.08.2007
Сообщений: 26
29.08.2007, 22:53
Если компилиться не будет, скажи. Вроде должно работать проверял.
0
0 / 0 / 3
Регистрация: 29.08.2007
Сообщений: 9
29.08.2007, 23:45
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

ухх жестока, но зачем так, если "задача то учебная"
вот что у меня обрисовывается
я пишу на C++ с использованием STL
база данных - вектор в векторе, вместит всё если не закончиться память
если нужно зделать своё, то предлагаю создать класс на подобии вектора, скрыть все добавления и махинации в нём а остальной код оставить
если же нужно на чистом C то я даже не знаю ...
код берёт матрицу из файла, на строке с freopen замени "sol.in" на свой файл
формат данных: ограничение, количество столбцов (x), количество рядков (y) ну и сама матрица

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
#include <cstdio>
#include <vector>
using std::vector;
 
vector< vector<int> > major; // data array
int x, y; // size of arraiy
int limit; // if value in diagonal is more than this remove it's row
 
void print () {
   int ix, iy (0);
   do {
      ix = 0;
      do {
         printf ("%d ", major[iy][ix]);
      } while (++ix != x);
      putchar ('\n');
   } while (++iy != y);
};
 
void reading () {
   scanf ("%d%d%d", &limit, &x, &y);
   major.resize (y);
   int ix, iy (0); // help variables
   do {
      major[iy].resize (x);
      ix = 0;
      do {
         scanf ("%d", &major[iy][ix]);
      } while (++ix != x);
   } while (++iy != y);
};
 
vector<int> moving () {
   int itd (0); // iterator diagonal
   int ith; // iterator horizontal
   int max (0); // maiximum value in horizontal
   vector<int> result; // array with maximum elements from columns
   do {
      if (major[itd][itd] > limit) { // search for value greater than limit
         ith = 0;
         max = 0;
         do {
            if (major[ith][itd] > max) { max = major[ith][itd]; };
         } while (++ith != y);
         result.push_back (max);
         major.erase (major.begin() + itd);
         --y;
      } else {
         ++itd; // if we remove some row, next one received it's index
      };
   } while ( (itd < x) && (itd < y) );
   return result;
};
 
 
int main() {
   // 1 machen
   
   freopen ("sol.in", "r", stdin); // use your input file within "sol.in"
   reading ();
   vector<int> first (moving());
   if (first.size() < x) { first.insert (first.end(), x - first.size(), 0); }; // adding zeros in end if need
   major.insert (major.begin(), first);
   ++y;
   print ();
   
   // 0 machen */
    return 0;
};
вот пример входного файла
Code
1
2
3
4
5
5
4 3
1 2 3 10
4 5 6 11
7 8 9 12
вставляй print() там где нужно чтобы посмотреть состояние на том этапе, или переделай print() чтобы он записывал в файл
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.08.2007, 23:45
Помогаю со студенческими работами здесь

В матрице максимальный элемент в столбце поменять местами с элементами главной диагонали
С квадратной матрицы 3х7 построить новую матрицу B, в которой максимальный элемент по столбцам поменяны местами с элементами главной...

Составить программу обмена в квадратной матрице элементов, находящихся на главной диагонали, с соответствующими элементами первой строк
Ребят выручайте Добавлено через 1 минуту *с соответствующими элементами первой строки

Поменять местами элементы, лежащие выше главной диагонали с элементами, лежащими ниже главной диагонали
Дана матрица чисел mxm. Составить программу меняющая местами элементы лежашие выше главной диагонали с элементами лежащие ниже главной...

Исключить строки матрицы с положительными элементами на главной диагонали
DEFINT A-Z CLS ' Предопределённая размерность m = 6 n = 7 ' Откомментировать для руч. ввода размерности 'INPUT...

Массив: в матрице элементы, стоящие на главной диагонали, замените минимальным элементом, лежащим ниже главной диагонали.
помогите пожалуйста. в матрице a(5x5) элементы стоящие на главной диагонали,замените минимальным элементом,лежащим ниже главной...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru