Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2010, 11:01   #1
tyurroma
 
Регистрация: 27.10.2009
Сообщений: 8
По умолчанию C#, массивы

Составить программу, которая получает матрицу Х размерностью m*n и вектор A размером к. Программа формирует новую матрицу, в которую включены только те строки, которые содержат хотя бы одно число из вектора А.

помогите найти ошибку:

Код:
static void Main(string[] args)
        {
            Console.WriteLine("Введите количество строк матрицы");
            int m = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Введите количество столбцов матрицы");
            int n = Convert.ToInt32(Console.ReadLine());
            double[,] matr = new double[m, n];
            //Ввод матрицы
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    int h = i, g = j;
                    Console.WriteLine("Введите элемент " + (++h) + (++g));
                    matr[i, j] = Convert.ToDouble(Console.ReadLine());
                }
            }//Конец ввода матрицы
            //Ввод вектора
            Console.WriteLine("Введите размерность вектора");
            int k = Convert.ToInt32(Console.ReadLine());
            double[] vect = new double[k];
            for (int t = 0; t < k; t++)
            {
                int r = t;
                Console.WriteLine("Введите " + (++r) + "-й элемент вектора");
                vect[t] = Convert.ToDouble(Console.ReadLine());
            }//Конец ввода вектора




            double[,] newMatr = new double[m, n];

            //Сравнение матрицы и вектора
            int Ii = 0;
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    foreach (double el in vect)
                    {
                        if (el == matr[i, j])
                        {
                            for (int kk = 0; kk < n; kk++)
                            {
                                newMatr[Ii, kk] = matr[i, kk];
                                Ii++;
                                break;
                            }
                        }
                   }

                }//Конец сравнения


                //Вывод матрицы и вектора
                Console.Write("\n" + "==Исходная матрица==" + "\n");
                for ( i = 0; i < m; i++)
                {
                    for (int j = 0; j < n; j++)
                    {
                        Console.Write(matr[i, j] + "\t");
                    }
                    Console.WriteLine();
                }
                Console.Write("\n" + "==Исходный вектор==" + "\n");
                foreach (double el in vect) Console.Write(el + "\t");
                Console.Write("\n" + "\n" + "==Результат==" + "\n");
                for (i = 0; i < m; i++)
                {
                    for (int j = 0; j < n; j++)
                    {
                        Console.Write(newMatr[i, j] + "\t");
                    }
                    Console.WriteLine();
                }
неправильно заполняет новую матрицу, вместо нужных строк - нули
tyurroma вне форума Ответить с цитированием
Старый 24.09.2010, 15:20   #2
KobolD
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 239
По умолчанию

Код:
 
for (int kk = 0; kk < n; kk++)
{
     newMatr[Ii, kk] = matr[i, kk];
     Ii++;
     break;
}
Помоему тут скобки фигурные не нужны (т.е. в цикле надо только newMatr[Ii, kk] = matr[i, kk]; гонять), а то получается что ты как то по диагнали матрицу заполняешь, да к томуже еще и выходишь из цикла после первого вычисления.
Чтобы слова не расходились с делом, нужно молчать и ничего не делать.
KobolD вне форума Ответить с цитированием
Старый 24.09.2010, 15:24   #3
savva
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 225
По умолчанию

эээ break зачем? break же выход из цикла.то есть у тебя проходит 1 итерация и всё.
Код:
for (int kk = 0; kk < n; kk++)
{
     newMatr[Ii, kk] = matr[i, kk];
     Ii++;
     
}
За помощь: Нажмите на весы слева от сообщения!
savva вне форума Ответить с цитированием
Старый 24.09.2010, 21:30   #4
tyurroma
 
Регистрация: 27.10.2009
Сообщений: 8
По умолчанию

убрал break... матрица все равно каким-то образом заполняется нулями, но нужные строки уже присутствуют

Исправленная версия:

Код:
static void Main(string[] args)
        {
            Console.WriteLine("Введите количество строк матрицы");
            int m = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Введите количество столбцов матрицы");
            int n = Convert.ToInt32(Console.ReadLine());
            double[,] matr = new double[m, n];
            //Ввод матрицы
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    int h = i, g = j;
                    Console.WriteLine("Введите элемент " + (++h) + (++g));
                    matr[i, j] = Convert.ToDouble(Console.ReadLine());
                }
            }//Конец ввода матрицы
            //Ввод вектора
            Console.WriteLine("Введите размерность вектора");
            int k = Convert.ToInt32(Console.ReadLine());
            double[] vect = new double[k];
            for (int t = 0; t < k; t++)
            {
                int r = t;
                Console.WriteLine("Введите " + (++r) + "-й элемент вектора");
                vect[t] = Convert.ToDouble(Console.ReadLine());
            }//Конец ввода вектора




            double[,] newMatr = new double[m, n];

            //Сравнение матрицы и вектора
           
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    foreach (double el in vect)
                    {
                        if (el == matr[i, j])
                        {

                            for (int kk = 0; kk < n; kk++)
                            
                                newMatr[i, kk] = matr[i, kk];
                                i++;

                            
                        }
                    }

                }//Конец сравнения


                //Вывод матрицы и вектора
                Console.Write("\n" + "==Исходная матрица==" + "\n");
                for (i = 0; i < m; i++)
                {
                    for (int j = 0; j < n; j++)
                    {
                        Console.Write(matr[i, j] + "\t");
                    }
                    Console.WriteLine();
                }
                Console.Write("\n" + "==Исходный вектор==" + "\n");
                foreach (double el in vect) Console.Write(el + "\t");
                Console.Write("\n" + "\n" + "==Результат==" + "\n");
                for (i = 0; i < m; i++)
                {
                    for (int j = 0; j < n; j++)
                    {
                        Console.Write(newMatr[i, j] + "\t");
                    }
                    Console.WriteLine();
                }

Работает, верно отображает нужные строки, но опять же строки, в которых нет чисел из вектора, прога заполняет нулями

Последний раз редактировалось Stilet; 28.09.2010 в 12:55.
tyurroma вне форума Ответить с цитированием
Старый 28.09.2010, 12:11   #5
KobolD
Форумчанин
 
Регистрация: 10.06.2010
Сообщений: 239
По умолчанию

А зачем ты изменил счетчик второй матрицы? У тебя же в первом варианте правильно было.
Код:
 int Ii = 0;
double[,] newMatr = new double[m, n];
            //Сравнение матрицы и вектора
            for (int i = 0; i < m; i++)
                for (int j = 0; j < n; j++)
                    foreach (double el in vect)
                        if (el == matr[i, j])
                        {
                            for (int kk = 0; kk < n; kk++)
                                newMatr[Ii, kk] = matr[i, kk];
                            Ii++;
                             break;// этот брек должен пропускать все сравнения foreach после первого вхождения числа из вектора.
                        }
Только у тебя всеравно будет получатся матрица, где сначала идут нужные тебе строки, а потом нули. Если хочешь чтобы такого небыло надо делать примерно так:
Код:
int Ii = 0;
int [] index= new int[m];
            //Сравнение матрицы и вектора
            for (int i = 0; i < m; i++)
                for (int j = 0; j < n; j++)
                    foreach (double el in vect)
                        if (el == matr[i, j])
                        {
                             index[Ii] =i;
                             Ii++;
                             break;
                        }
double[,] newMatr = new double[Ii, n];
for (int i = 0; i < Ii; i++)
        for (int j = 0; j < n; j++)
                newMatr[i, j] = matr[index[i], j];
Чтобы слова не расходились с делом, нужно молчать и ничего не делать.

Последний раз редактировалось KobolD; 28.09.2010 в 14:48.
KobolD вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамические массивы и массивы варианты N@stya Помощь студентам 0 11.06.2010 21:09
С++, Массивы, динамические массивы. -Sunshine- Помощь студентам 1 19.04.2010 02:17
массивы в си aurora_87 Общие вопросы C/C++ 1 02.04.2010 15:29
Даны одномерные массивы А и В. Сформировать массивы, состоящие из элемент LyaLya Помощь студентам 15 20.12.2009 14:12