Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
lRem
1

Массивы, матрицы и операции с ними

04.05.2013, 03:49. Показов 1633. Ответов 2
Метки нет (Все метки)

Доброго времени суток уважаемые программисты.
Не большое отступление:
В универе (заочное отделение) наверное считают что человек способен за пару лекций выучить
язык программирования и написать курсовую.
Сколько я не пытался разобраться сам, ничего не получается, наверное потому что я работаю не много
в другой сфере (ЛВС и ГВС) и работа руководящая.
Когда то в далеком прошлом 4 года учили в техникуме борланд делфи.
Логика и синтаксис отличается и видимо поэтому я не могу не как понять Cи.
Но сроки поджимают и я вынужден обратиться к Вам за помощью.
Надеюсь на Вашу помощь.
И так, задание:
В матрице произвольного размера подсчитать количество отрицательных элементов в каждой строке,
из полученных величин составить вектор.
Преподаватель так же добавил:
Матрица должна заполняться из файла и в конце записывать в файл объект (я так понимаю в бинарном коде).

Нашел код, подобного задания. Код довольно сложный, он выводит абсолютно всю матрицу с файла, это определенно хорошо.
Но нам такого не объясняли и врятли я смогу объяснить преподователя.
Сначало нужно указать матрицу (5:4 например) и файл должен заполнен матрицей именно этого размера. Но думаю попробую разобраться в коде и все таки объяснить
преподователю. Все же не удобно все время подгонять матрицу в файле и потом задавать ее размер в консоле, намного проще если программа будет сама выводить всю матрицу с текстовика.
С файла матрицу считает, это уже хорошо.
Программа в консоле c#.
Возможно и в форме, но у нас даже лекций по работе с формами не было.
Вот код программы, которой я нашел на форуме:

Код
using System;
using System.IO;

namespace ConsoleApplication
{
    class Class
    {
        static int[,] Input(out int n)
        {
            StreamReader file = new StreamReader("c:/t.txt");
            string s = file.ReadToEnd();
            file.Close();
            string[] строка = s.Split('\n');
            string[] столбец = строка[0].Split(' ');
            int[,] a = new int[строка.Length, столбец.Length];
            int t = 0;
            n = 0;
            for (int i = 0; i < строка.Length; i++)
            {
                столбец = строка[i].Split(' ');
                for (int j = 0; j < столбец.Length; j++)
                {
                    t = Convert.ToInt32(столбец[j]);
                    a[i, j] = t;
                    //Console.Write(" {0}", a[i, j]);
                }
                //Console.WriteLine();
            }

            return a;
        }

        static void Print(int[,] a)
        {
            for (int i = 0; i < a.GetLength(0); ++i, Console.WriteLine())
                for (int j = 0; j < a.GetLength(1); ++j)
                    Console.Write("{0} ", a[i, j]);
        }

        static double Rezalt(int[,] a)
        {
            int k = 0;
            double s = 0;
            for (int i = 0; i < a.GetLength(0); ++i)
                for (int j = i + 1; j < a.GetLength(1); ++j)
                    if (a[i, j] % 2 != 0) { ++k; s += a[i, j]; }
            if (k != 0) return s / k;
            else return 0;
        }

        static void Main()
        {
            try
            {
                int n;
                int[,] myArray = Input(out n);
                Console.WriteLine("Исходный массив:");
                Print(myArray);
                double rez = Rezalt(myArray);
                Console.WriteLine("Среднее арифметическое ={0:f2}", rez);
            }
            catch (FileNotFoundException)
            {
                Console.WriteLine(" Файл не найден");
            }
            catch (FormatException)
            {
                Console.WriteLine(" Неверное значение данных");
            }
            catch (IndexOutOfRangeException)
            {
                Console.WriteLine(" Выход за границы массива");
            }

        }
    }
}
Если можно с комментариями.
Заранее всех благодарю за помощь.

Добавлено через 9 часов 12 минут
Ап теме

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.05.2013, 03:49
Ответы с готовыми решениями:

Двумерные массивы и операции с ними
Ввести двумерный массив размером 5*5 с клавиатуры. Вывести массив на экран в виде таблицы. Для...

Двумерные массивы, операции над ними
Всем, здравствуйте! Набрала текст программы на паскале, но ответ выводит неправильно. Не могу...

Матрицы и операции над ними
Подскажите, как сформировать вектор из диагональных элементов матрицы.

Матрицы, массивы и работа с ними
Доброго времени суток. Помогите сделать следующие задания 1)Сформировать и вывести на печать...

2
212 / 214 / 44
Регистрация: 20.12.2011
Сообщений: 635
04.05.2013, 04:56 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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Text.RegularExpressions;
 
namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Введите имя файда: ");
            string fileName = Console.ReadLine();
            if (File.Exists(fileName))              //проверка существования файла
            {
                StreamReader sr = new StreamReader(fileName);   //создание нового потока для чтения
                Regex r = new Regex("\n\r");                    //регулярное выражение для разбиения файла на строки
                string[] Lines = r.Split(sr.ReadToEnd());       //чтение всего файла и разбиение на строки с помощью регулярки
                sr.Close();                                     //закрытие потока
                int[,] arr = new int[Lines.Length, Lines[0].Split(' ').Length];
                int[] result = new int[Lines.Length];
                for (int i = 0; i != Lines.Length; i++)         //обход матрицы
                {
                    result[i] = 0;                              //количество отрицательных элементов i-ой строки
                    string[] tmp = Lines[i].Split(' ');         //разбиение строки на элементы
                    for (int j = 0; j != tmp.Length; j++)
                    {
                        arr[i, j] = int.Parse(tmp[j]);          //преобразование к числу
                        if (arr[i, j] < 0)                      //если отрицательный, то увеличиваем количество
                        {
                            result[i]++;
                        }
                    }
                }
                //запись результата в файл
                Console.Write("Введите имя файла для записи результата: ");
                fileName = Console.ReadLine();
                StreamWriter sw = new StreamWriter(fileName);
                for (int i = 0; i != result.Length; i++)
                {
                    sw.Write(result[i] + " ");
                }
                sw.Close();
            }
            else
            {
                Console.WriteLine("Входной файл не найден!");
            }
            Console.WriteLine("Нажмите любую клавишу...");
            Console.ReadKey(true);
        }
    }
}
Данный код, просит ввести имя файла для чтения матрицы, затем читает весь файл и дробит его на строки. Количество строк в файле - количество строк матрицы, количество чисел в первой строке - количество столбцов. Другие варианты не обработаются.

Цитата Сообщение от lRem Посмотреть сообщение
Матрица должна заполняться из файла и в конце записывать в файл объект (я так понимаю в бинарном коде).
объясните, с чего Вы взяли, что именно в бинарном виде...
если из-за слова объект, то любой массив является объектом => я думаю, что Вам нужно вывести в файл массив(вектор) результатов

Не по теме:


ну а тут не по делу:

Цитата Сообщение от lRem Посмотреть сообщение
Когда то в далеком прошлом 4 года учили в техникуме борланд делфи.
Логика и синтаксис отличается и видимо поэтому я не могу не как понять Cи.
как говорил один хороший человек: "время изучения нового языка = время, требуемое, чтобы дотянуться до клавиши F1 или открытия документации"


Цитата Сообщение от lRem Посмотреть сообщение
Сколько я не пытался разобраться сам, ничего не получается, наверное потому что я работаю не много
в другой сфере (ЛВС и ГВС) и работа руководящая.
может и не мое дело, но не проще было бы заплатить кому-нибудь за эту работу?



Добавлено через 18 минут
P.S. если будет непонятен код, или вообще возникнут вопросы по изучению(только конкретные), то пишите или в личку или по контактам из подписи - помогу.
P.S.S. просьбы сделать какое-либо задание буду игнорить
0
lRem
16.05.2013, 02:37 3
Народ хелп.

Программу почти доделали.
Но я не правильно понял задание,
нужно что бы, по каждой строке искались отрицательные элементы и количество отрицательных элементов выводилось на экран и записывалось в xml файл с помощью сериализации.
Тобишь дана матрица (считалась с файла *.txt):

1 2 -3 4 5
1 2 -3 -4 5
1 2 -3 4 -5
1 2 3 4 5 6

________________
1 2 2 0

Причем сколько строк в матрице изначально не понятно, можно ввести с клавиатуры, но можно и что бы он сам сначала считал сколько строк в матрице.

Вот код:
Код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


using System.IO;
using System.Text.RegularExpressions;

namespace Turkin
{
    [Serializable]
    public class A
    {

        public string Title;
        double[][] MatrixPole;//Поле матрица

        public double[][] MatrixProperty
        {
            get { return MatrixPole; }
            set { MatrixPole = value; }
        }
        int[] vector;// Поле вектор

        public int[] VectorProperty
        {
            get { return vector; }
            set { vector = value; }
        }
        //конструктор
        public A()
        {
            LoadFromFile();
            vector = MatrixVector(MatrixPole);
        }

        public double ПолучитьЭлементМатрицы(int StrokaNumber, int StolbecNumber)
        {
            return MatrixPole[StrokaNumber][StolbecNumber];
        }
        // Вывод многомерного массива на экран
        static public void MatrixShow(double[][] MassParam)
        {
            foreach (double[] X in MassParam)
            {
                foreach (double Value in X)
                {
                    Console.Write(Value + "\t");
                }
                Console.WriteLine();
            }
        }
        //Метод - Вывод одномерного массива на экран
        static public void MatrixShow(int[] MassParam)
        {
            foreach (int Value in MassParam)
            {
                Console.Write(Value + "\t");
            }
        }
        //Выбираем все отрицательные
        //возвращаем вектор
        int[] MatrixVector(double[][] MassParam)
        {
            int i = 0;
            string S = "";
            string[] Mass;

            /*Выбираем все отрицательные из многомерного массива
            и записываем в строку S
            i - кол-во найденных элементов, подходящим условию 
             */
            foreach (double[] X in MassParam)
            {
                foreach (double Value in X)
                {
                    if (Value < 0)
                    {
                        S += Value + " ";
                        i++;
                    }
                }
            }
            vector = new int[i];
            S = S.Trim();
            Mass = S.Split(' ');
            for (i = 0; i > Mass.Length; i++)
            {
                vector[i] = (int)Convert.ToDouble(Mass[i]);
            }
            return vector;
        }

        //Метод считываем матрицу из файла
        public void LoadFromFile()
        {
            try
            {
                StreamReader fs = new StreamReader("primer.txt");

                //Массив строк из файла, разделимых новой строкой
                string[] StringOfFile = fs.ReadToEnd().Split('\n');
                int i = 0;
                string[] NumForString; /*массив чисел полученных из строки, после
                обработки */

               FormatingMatrixStringArray(ref StringOfFile);//Удаляем пустые строки
                // лишние символы В Массиве строк матрицы

                MatrixPole = new double[StringOfFile.Length][];

                foreach (string X in StringOfFile)
                {
                    NumForString = X.Split(' ');
                    MatrixPole[i] = new double[NumForString.Length];
                    for (int j = 0; j < NumForString.Length; j++)
                    {
                        MatrixPole[i][j] = Convert.ToDouble(NumForString[j]);
                    }
                    i++;
                }
                fs.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine("Erorr!!! " + e.ToString());
            }
        }

         protected void FormatingMatrixStringArray(ref string[] StringOfFile)
         {
             int CountRealStrings = 0;// количество непустых строк, содержащих цифровое
             // значение
             int i = 0;
             foreach (string X in StringOfFile)
             {
                 

                 if (StringOfFile[i] != "")
                 {
                     StringOfFile[CountRealStrings] = StringOfFile[i];
                     CountRealStrings++;
                 }
                 i++;
             }
             Array.Resize(ref StringOfFile, CountRealStrings);
         }
    }
      
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Чтение матрицы из файла:\n");
            A ob = new A();
            A.MatrixShow(ob.MatrixProperty);
            Console.WriteLine();

            Console.WriteLine("------------------------------------------|");
            Console.WriteLine("Отрицательные элементы в матрице:");
            A.MatrixShow(ob.VectorProperty);
            Console.WriteLine("\n");
            Console.WriteLine("------------------------------------------|");

            Console.WriteLine("Сохранение результата в XML:\n");
            A.MatrixShow(ob.MatrixProperty);
            ob.Title = "Матрица";
            System.Xml.Serialization.XmlSerializer writer = new System.Xml.Serialization.XmlSerializer(typeof(A));
            System.IO.StreamWriter file = new System.IO.StreamWriter(@"matriza.xml");

            writer.Serialize(file, ob);
            file.Close();

            System.Xml.Serialization.XmlSerializer reader = new System.Xml.Serialization.XmlSerializer(typeof(A));
            System.IO.StreamReader file2 = new System.IO.StreamReader(@"matriza.xml");
            A outt = new A();
            outt = (A)reader.Deserialize(file2);
            file2.Close();

            Console.WriteLine();

            Console.ReadKey();

        }
    }
}
Он читает с файла txt выводит на экран матрицу, и выводит вектор (считает отрицательные числа всей матрицы и выводит на экран нули), т.е. в матрице три отрицательных числа, выведет программа три 0 и запишет в файл xml

Великие гуру c#, пересдача через несколько часов, хелп.
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2013, 02:37

Объясните, что такое разреженные матрицы, как их генерировать и математические операции над ними
Скажите, пожалуйста, правильно ли я думаю. На сколько я понял разряженная матрица - это матрица...

Деревья и операции с ними
нужно создать и отобразить на форме структуру типа &quot;дерево&quot; с возможностью выполнять операции над...

Системы счисления и операции с ними
Здравствуйте! Заинтересовал вопрос - насколько сложно сделать калькулятор для подсчетов в разных...

Высказывания и операции над ними
Пол ночи голову ломал, ничего не понял... 1. Высказывание (X&amp;Y) v (X-&gt;Z) ложно. Найдите все...


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

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

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