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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.89
StroitelGizni
Сообщений: n/a
#1

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

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

В матрице удалить строки с элементами на главной диагонали, превышающими заданную величину, а затем в качестве первой вставить строку из максимальных элементов соответствующих столбцов.(Для размещения массивов следует использовать динамическую память).
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2007, 12:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос В матрице удалить строки с элементами на главной диагонали, превышающими заданную величину (C++):

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

Поменять местами наибольший элемент строки с элементом главной диагонали в матрице - C++
Дана целочисленная квадратная матрица, поменять местами наибольший элемент строки с элементом главной диагонали. Собственно мой вариант,...

В матрице переставить строки так, чтобы наименьший элемент находился на главной диагонали - C++
задать двумерный массив размером 4 на 4. массив заполняется целыми числами случайным образом. в массиве переставить строки так, чтобы...

Обменять элементы массива на главной диагонали с элементами на побочной диагонали - C++
Всем привет. Дан двумерный массив размерностью 5х5, заполненный случайными числами из диапазона от 0 до 100. Обменять местами...

Поменять местами минимальный элемент главной диагонали и максимальный элемент побочной диагонали в матрице - C++
Всем привет! Помогите пожалуйста сделать задание по программированию, что бы получить допуск к экзамену :) В матрице А, сформированной...

Заполнение главной диагонали матрицы максимальными элементами - C++
спасибо, что откликнулись. нужно решить такую задачу: Путем перестановки элементов добиться того, чтобы ее максимальный элемент...

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

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

а ещё лучше, если автор наведёт маленький пример
0
Herbert
0 / 0 / 2
Регистрация: 27.08.2007
Сообщений: 26
29.08.2007, 22:27 #5
"а затем в качестве первой вставить строку из максимальных элементов соответствующих столбцов"
в смысле из столбцов, которые пересекаються с удаляемыми строками на элементе из диагонали ?
тоесть когда мы нашли на диагонали элемент больше лимита, то ищем на его столбце максимальный элемент и добавляем его до нового рядка ?
тогда если, например удалены будут 3 рядка, а столбцов у матрицы 5, остальные заменить нулями ?
и ещё - если так, то мы ведь можем удаляя строку удалить элемент, который при следующем поиске на стролбце мог бы быть максимальным элементом, это нормально ? или удалять строки только в конце ?
Думаю, что это все равно... Задача-то чисто учебная вроде.
0
Herbert
0 / 0 / 2
Регистрация: 27.08.2007
Сообщений: 26
29.08.2007, 22:36 #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
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
Herbert
0 / 0 / 2
Регистрация: 27.08.2007
Сообщений: 26
29.08.2007, 22:53 #7
Если компилиться не будет, скажи. Вроде должно работать проверял.
0
bor.is
0 / 0 / 1
Регистрация: 29.08.2007
Сообщений: 9
29.08.2007, 23:45 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
ухх жестока, но зачем так, если "задача то учебная"
вот что у меня обрисовывается
я пишу на 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;
};
вот пример входного файла
Код
5
4 3
1 2 3 10
4 5 6 11
7 8 9 12
вставляй print() там где нужно чтобы посмотреть состояние на том этапе, или переделай print() чтобы он записывал в файл
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2007, 23:45
Привет! Вот еще темы с ответами:

Заменить элементы главной диагонали элементами целого типа - C++
Найдите произведение всех положительных элементов матрицы размером 4x4, состоящей из элементов целого типа и замените им элементы главной...

C++ Двумерные массивы(матрицы),работа с элементами главной диагонали - C++
Уважаемые коллеги, прошу помощи в решении парочки задачек,уж мозг в Си не &quot;варит&quot;,не клеится с его структурой... 1.В каждой строке...

В заданной матрице вывести элементы главной диагонали - C++
В заданной матрице А вывести элементы главной диагонали.Затем вывести элементы побочной диагонали

В матрице В ( 4 на 4) найти произведение элементов главной диагонали. - C++
В матрице В ( 4 на 4) найти произведение элементов главной диагонали.


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

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
29.08.2007, 23:45
Ответ Создать тему
Опции темы

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