Как считать матрицу из файла си шарп
Матрица это набор объектов, которые хранятся в виде таблицы. У каждой матрицы есть имя, единый тип всех ее объектов.
Обявление матрицы в Си
Также как и переменные матрицу в Си необходимо объявить перед тем как с ней работать, необходимо указать ее тип, ее имя , количество строк -1 и количество столбцов -1. Нумерация столбцов и строк идет с 0.
Тип матрицы Имя [количество строк-1][количество столбцов-1];
int A[8][9] ; / /объявляет целочисленную матрицу с именем A , у которой 9 строк и 10 столбцов
После объявления матрицы, с ее элементами можно работать. Чтобы обратитсья к элементу матрицы нужно указать имя матрицы в первых квадратных скобках указать номер строки, во вторых квадратных скобках указать номер столбца.
A[0][1]=10; // элементу матрицы с номер строки 0 и столбца 1 присваивается значение 10
printf(“%d”, A[0][1]);// выводит на экран элемент матрицы с номер строки 0 и столбца 1
Задание матрицы в Си
Чтобы работать с матрицей в Си, необходимо присвоить начальные значения всех ее элементов.
Для работы со всеми элементами матрицы используется вложенные циклы for
В главном цикле “пробегаем” по всем строкам, а во вложенном “пробегаем” по всем столбцам для каждой строки.
// “пробегаемся” по всем строкам. Нумерация строк с 0.
for (i=0; i < количество строк; i++)
// вложенный цикл, “пробегаемся” по всем столбцам для Нумерация столбцов с 0.
for (j=0; j < количество столбцов; j++)
…Имя матрицы [i][j]…// работаем с элементом матрицы с номером строки i и номером столбца j
Пример программы 22. Программа задаёт целочисленную матрицу размером 10 на 10 и заполняет ее случайными числами в диапазоне, который укажет пользователь и выводит ее на экран.
int a[9][9]; // объявление матрицы 10 на 10
int i,j; // счетчики циклов
int range;// диапазон в котором присваиваются значения элементов матрицы
//ввод диапазона случайных чисел
printf("введите диапазон заполнения\n");
// пробегаем по всем строкам
// пробегаем по всем столбцам для данной строки i
a[i][j]=rand() % range+1; // прсиваиваем элементу матрицы a с номером строки i и номер столбца j случайного значения в диапазоне от 0 до 9
// пробегаем по всем строкам
// пробегаем по всем столбцам для данной строки i
// переход на следующую строку
При выводе матрицы на экран в Си для каждой строки мы совершаем переход на следующую строку с помощью оператора printf(" ");
Ввод матрицы в Си с помощью клавиатуры
Пример программы 23. Задаётся матрица размера 3 на 3 с помощью клавиатуры и ищется ее максимальный элемент. Он выводится на экран. При поиске максимального элемента, мы создаем специальную переменную max и присваиваем ей значение элемента a[0][0]. Пробегаем по всем элементам матрицы с помощью вложенного цикла, сравнивая текущий элемент с максимумом, если текущий элемент больше максимума, то максимуму присваивается значение этого элемента.
int a[2][2]; // объявление матрицы 3 на 3
int i,j; // счетчики циклов
int max; // переменная для хранения максимального элемента матрицы
// пробегаем по всем строкам
// пробегаем по всем столбцам для данной строки i
// ввод текущего элемента матрицы с клавиатуры
printf("Введите элемент матрицы [%d][%d]", i, j);
// переход на следующую строку
// пробегаем по всем строкам
// пробегаем по всем столбцам для данной строки i
// переход на следующую строку
// пробегаем по всем строкам
// пробегаем по всем столбцам для данной строки i
// сравниваем текущий элемент массива с максимумом
// вывод максимального элемента
printf ("Максимальный элемент массива %d", max);
Вернуться к содержанию Перейти к теме Работа с файлами в Си
Полезно почитать по теме массивы и матрицы в си
Массивы в си
Игра на си Крестики Нолики
Чтение матрицы из бинарного файла
Здравствуйте. Необходимо считать матрицу с бинарного файла (расширение .dat ) где первые два.
Чтение матрицы из файла и запись её в массив
Всем доброго времени суток, имеется файл 00011122331100 00000000000000 00012000000000.
Как сделать чтение матрицы из файла и вывести её на экран в двумерном массиве?
Как сделать чтения матрицы из файла и вывести её на экран в двумерном массиве ?
в текстовом файле он представлен в виде:
4 7 3 3
9 2 5 7
2 1 9 2
без поиска максимального элемента он выводится на экран, а как я добавляю другие методы то уже шарп ругаться начинает. я недавно изучаю его, поэтому не могу полностью разобраться. Чтение из файла никак норм освоить не могу Доброго времени суток.
Помогите разобраться с заданием, прогу написал, по отдельности методы работают, ток вот вместе никак. Затупил где то с передачей параметров из метода, в котором реализуется чтение из файла в основной метод. Вот само задание:
Подсчитать среднее арифметическое нечетных элементов, расположенных выше главной диагонали. В вашей функции Main посмотрите что выводит Print(myArray), не в счет операторы вывода на консоль из метода Input, удалите их или закоментируйте и посмотрите на вывод. все равно не пашет, она на return a ругается и все тут этот вопрос решил, но возникла другая проблема в out n, шарп пишет, что до передачи управления из текущего метода параметру, помеченному ключевым словом out 'n' должно быть присвоено значение, но при использовании out это же вроде не столь важно, или я в чем то ошибаюсь? Если у метода есть параметр out, значит обязательно в этом методе этому параметру должно быть присвоено значение, т.к. то место, откуда этот метод будет вызываться, в полном праве может ожидать, что этот метод присвоит этому параметру значение. Сам этот метод может принемать неинициализированную переменную (т.к. он ей задает значение).
Подправьте все это (удалите этот параметр или задайте в методе ему значение), и отпишитесь по поводу вывода из Print(myArray).
Подправил, теперь на выходе получаем
Исходный массив:
0 0 0 0
0 0 0 0
2 1 9 2
0 0 0 0
Среднее арифметическое = 0,00
из чего можно заключить, что в Print(myArray) ошибка, либо косяк в считывании файла
Добавлено через 18 минут
считывается нормально, значит косяк где -то в методе Print
Исходный массив:
0 0 0 0
0 0 0 0
2 1 9 2
0 0 0 0
Среднее арифметическое = 0,00
из чего можно заключить, что в Print(myArray) ошибка, либо косяк в считывании файла
Посмотрите еще раз выше, в самом начале. Про эту ошибку и шла речь. Вы на каждой итерации создаете новый массив. Он инициализируется нулями. Ему задаете к тому же не тот размер. Последняя строка нулей - результат. Возвращается последний созданный массив. Он в цикле заполняется последней прочитанной строкой. Все предыдущие соэданные (new) массивы удаляются
Репутация: 1
Всего: 1
Люди добрые! Помогите несчастной! Очень прошу.
Задачку сделать срочно надо, а я сама ничего не понимаю=)
В текстовом файле хранится вещественная матрица 27х5. Заменить в ней все отрицательные числа нулями. Учесть: высота экрана 25 строк.
Буду очень признательна моему герою))
Репутация: 6
Всего: 207
Для домашних заданий, курсовых, существует "Центр Помощи".
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©
Репутация: 1
Всего: 1
Репутация: 2
Всего: 23
Репутация: 1
Всего: 1
Репутация: 21
Всего: 92
Репутация: 1
Всего: 1
Ясно. Это всё замечательно)))) Только мне нужно всё через стандартные библиотеки сделать: conio , stdlib и т.п. Всё равно ОГРОМНОЕ списибки. Жду мужской помощи.
Репутация: 1
Всего: 1
Если знаете в чём дело черканите.
Репутация: 9
Всего: 59
Вы хелп по этой функции смотрели?
У нее вызов совсем другой.
Я уж не говорю, что точка с запятой пропущена.
fgets считывает строку символов из файла в указанный буфер. У вас буфера нет - просто указатель на строку. Вы это сами писали или откуда-то взяли?
Форма вызова функции такая:
char *fgets(char *s, int n, FILE *stream);
Добавлено через 2 минуты и 24 секунды
char *ch;
Замените на
char ch[100];
Строка в файле должна быть не более 99 символов
Репутация: 21
Всего: 92
const unsigned g_uMWidth = 5;
const unsigned g_uMHeight = 27;
const unsigned g_uDispHeight = 25;
Репутация: 1
Всего: 1
Слишком сложно для меня. Мре бы попроще как-нибудь
Добавлено @ 23:04
ну вот
6 ошибок выдаёт(
Репутация: 21
Всего: 92
Cveto4ka, уверяю, ничего сложного в моем коде нет, а вот вы сейчас чувствую наворотите Я уже боюсь глядеть в ваш код Что именно непонятно в моем коде?
Репутация: 9
Всего: 59
Я же вам без звездочки написал! Зачем вы создаете массив из 100 указателей?
Репутация: 1
Всего: 1
Репутация: 21
Всего: 92
Компилятор надо указывать, они разные бывают знаете ли
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman
[ Время генерации скрипта: 0.1472 ] [ Использовано запросов: 21 ] [ GZIP включён ]
Часто в задачах нужно ввести числа или другие данные в двумерный массив (матрицу) и иметь возможность их обрабатывать.
Содержание
Поиск на других ресурсах:
Условие задачи
Составить программу, которая осуществляет произведение двух матриц размерностью n . Матрицы вводятся из клавиатуры в отдельной форме и заносятся во внутренние структуры данных. Пользователь имеет возможность просмотреть результирующую матрицу.
Также есть возможность сохранения результирующей матрицы в текстовом файле “ Res_Matrix.txt ”.
Выполнение
1. Запуск Microsoft Visual Studio . Создание проекта
Подробный пример запуска Microsoft Visual Studio и создания приложения по шаблону Windows Forms Application описывается в теме:
Сохранить проект под любым именем.
2. Создание главной формы Form1
Создать форму, как показано на рисунке 1.
Разместить на форме элементы управления следующих типов:
- четыре элемента управления типа Button . Автоматически будут созданы четыре объекта (переменные) с именами button1 , button2 , button3 , button4 ;
- три элемента управления типа Label с именами label1 , label2 , label3 ;
- один элемент управления типа TextBox , доступ к которому можно получить по имени textBox1 .
Сформировать свойства элементов управления типа Button и Label:
Для настройки вида и поведения формы нужно выполнить следующие действия:
- установить название формы. Для этого свойство Text = “ Произведение матриц ”;
- свойство StartPosition = “ CenterScreen ” (форма размещается по центру экрана);
- свойство MaximizeBox = “ false ” (убрать кнопку развертывания на весь экран).
3. Создание второстепенной формы Form2
Во второстепенной форме Form2 будут вводиться данные в матрицы и выводиться исходный результат.
Добавить новую форму к приложению, вызвав команду
В открывшемся окне выбрать « Windows Form ». Имя файла оставить без изменений « Form2.cs ».
Разместить на форме в любом месте элемент управления типа Button (рис. 2). В результате будет получен объект с именем button1.
В элементе управления button1 нужно установить следующие свойства:
- свойство Text = “ OK ”;
- свойство DialogResult = “ OK ” (рис. 3). Это означает, что при нажатии (клике «мышкой») на button1, окно закроется с кодом возвращения равным “ OK ”;
- свойство Modifiers = “Public”. Это означает, что кнопка button1 будет видимой из других модулей (из формы Form1).
Настроить свойства формы Form2:
- свойство Text = “ Ввод матрицы ”;
- свойство StartPosition = “CenterScreen” (форма размещается по центру экрана);
- свойство MaximizeBox = “false” (убрать кнопку развертывания на весь экран).
4. Ввод внутренних переменных
Следующий шаг – введение внутренних переменных в текст модуля “ Form1.cs ”.
Для этого сначала нужно активировать модуль “ Form1.cs ”.
В тексте модуля “ Form1.cs ” добавляем следующий код:
Объясним некоторые значения переменных:
- Max – максимально-допустимая размерность матрицы;
- n – размерность матрицы, введенная пользователем из клавиатуры в элементе управления TextBox1;
- MatrText – двумерная матрица элементов управления типа TextBox. В эту матрицу будут вводиться элементы матрицы в виде строк. Ввод данных будет формироваться в форме Form2;
- Matr1, Matr2 – матрицы элементов типа double, в которые будут копироваться данные из матрицы MatrText;
- Matr3 – результирующая матрица, которая равная произведению матриц Matr1 и Matr2;
- f1, f2 – переменные, определяющие были ли введенные данные соответственно в матрицы Matr1 и Matr2;
- dx, dy – габариты одной ячейки типа TextBox в матрице MatrText;
- form2 – объект класса формы Form2, по которыму будет получен доступ к этой форме.
5. Программирование события Load формы Form1
Листинг обработчика события Load формы Form1 следующий:
Объясним некоторые фрагменты кода в методе Form1_Load().
Событие Load генерируется (вызывается) в момент загрузки любой формы. Поскольку форма Form1 есть главной формой приложения, то событие Load формы Form1 будет вызываться сразу после запуска приложения на выполнение. Поэтому, здесь целесообразно ввести начальную инициализацию глобальных элементов управления и внутренних переменных программы. Эти элементы управления могут быть вызваны из других методов класса.
В обработчике события Form1_Load() выделяется память для двумерной матрицы строк MatrText один лишь раз. При завершении приложения эта память будет автоматически освобождена.
Память выделяется в два этапа:
- для самой матрицы MatrText – как двумерного массива;
- для каждого элемента матрицы, который есть сложным объектом типа TextBox.
После выделения памяти для любого объекта осуществляется настройка основных внутренних свойств (позиция, размер, текст, видимость в некоторой форме ).
Также каждая созданная ячейка добавляется (размещается) на форму Form2 с помощью метода Add() из класса Controls. Каждая новая ячейка может быть добавлена в любую другую форму приложения.
6. Разработка дополнительного метода обнуления данных в матрице MatrText
В будущем, чтобы многократно не использовать код обнуления строк матрицы MatrText, нужно создать собственный метод (например, Clear_MatrText()) реализующий этот код.
Листинг метода Clear_MatText() следующий:
7. Программирование события клика на кнопке button1 (« Ввод матрицы 1 … »)
При нажатии (клике) на button1 должно вызываться окно ввода новой матрицы. Размер матрицы зависит от значения n .
Листинг обработчика события клика на кнопке button1 следующий:
В вышеприведенном листинге читается значение n . После этого осуществляется настройка ячеек матрицы строк MatrText.
На основе введенного значения n формируются размеры формы form2 и позиция кнопки button1.
Если в форме Form2 пользователь нажал на кнопке OK (button2), то строки с MatrText переносятся в двумерную матрицу вещественных чисел Matr1. Преобразование из строки в соответствующее вещественное число выполняется методом Parse() из класса Double.
Также формируется переменная f1, которая указывает что данные в матрицу Matr1 внесены.
Листинг обработчика события клика на кнопке button2 подобен листингу обработчика события клика на кнопке button1. Только он отличается шагами 7-8. На этом участке формируются матрица Matr2 и переменная f2.
9. Программирование события Leave потери фокуса ввода элементом управления textBox1
В приложении может возникнуть ситуация, когда пользователь изменяет значение n на новое. В этом случае должны заново формироваться флажки f1 и f2. Также изменяется размер матрицы MatrText, которая выводится в форме Form2.
Изменение значения n можно проконтролировать с помощью события Leave элемента управление textBox1. Событие Leave генерируется в момент потери фокуса ввода элементом управления textBox1 (рис. 4).
Листинг обработчика события Leave следующий:
10. Программирование события клика на кнопке button3 (« Результат »)
Вывод результата будет осуществляться в ту же форму, в которой вводились матрицы Matr1 и Matr2. Сначала произведение этих матриц будет сформировано в матрице Matr3. Потом значение с Matr3 переносится в MatrText и отображается на форме Form2.
Листинг обработчика события клика на кнопке button3.
11. Программирование события клика на кнопке button4 (« Сохранить в файле «Res_Matr.txt” ”)
Для сохранения результирующей матрицы Matr3 можно использовать возможности класса FileStream.
Класс FileStream описан в модуле System.IO . Поэтому в начале приложения нужно добавить следующий код:
Листинг обработчика события клика на кнопке button4 следующий:
12. Запуск приложения на выполнение
После этого можно запускать приложение на выполнение и тестировать его работу.
Спасибо за любую помощь.
4 ответа
Предлагаю взглянуть на классы BinaryReader/BinaryWriter. Они позволяют писать в файл информацию как есть. Пример записи: записываешь кол-во строк, записываешь кол-во столбцов, и дальше идешь построчно, последовательно записывая каждый элемент. При считывании сначала узнаешь габариты матрицы, а потом последовательно считываешь ее данные.
Важно только знать типы данных, в которых хранились элементы матрицы
Что за матрица, какие там данные? Может в каждой ячейке xml, а может картинка, а может текст, а может число, а может видео (а может быть ворона ах-ха-ха-ха-ха-ха-ха, а может быть собака, ах-ха-ха-ха-ха-ха-ха, а может это дворник злой. )
Как понять что матрица та же самая? Она куда-то выводится? Сравнивается с предыдущей? Куда выводится, как сравнивается?
Матрица изменяемая или нет? Типы данных меняются или нет?
Уточняйте вопрос!
Как вариант - построчная запись массива в архив, элементы массива в строке разделять "\t", в конце строки "\n" и так до конца массива.
А при чтении используя Regex.Split и "\n" получать массив строк. Точно так же с "\t" получать массив элементов из строки. Зная кол-во строк и элементов в строке создать и заполнить 2d массив :)
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Text ;
using System.IO ;
using ( StreamWriter stream = new StreamWriter ( "d: \\ matrix.txt" ) )
<
for ( int i = 0 ; i < 8 ; i ++ )
<
for ( int k = 0 ; k < 9 ; k ++ )
stream . Write ( " " , matrix [ i, k ] ) ;
stream . WriteLine ( ) ;
>
>
using ( StreamReader stream = new StreamReader ( "d: \\ matrix.txt" ) )
<
while ( stream . Peek ( ) >= 0 )
<
string line = stream . ReadLine ( ) ;
string [ ] tokens = line . Split ( new Char [ ] < ' ' >) ;
int [ ] values = new int [ 9 ] ;
for ( int i = 0 ; tokens [ i ] != "" ; i ++ )
Int32 . TryParse ( tokens [ i ] , out values [ i ] ) ;
for ( int i = 0 ; i < 9 ; i ++ )
Console . Write ( " " , values [ i ] ) ;
Console . WriteLine ( ) ;
>
>
Читайте также: