Как создать матрицу в c
Язык C позволяет создавать многомерные массивы. Например, двумерную матрицу размером 100 строк на 200 столбцов можно описать следующим образом:
Обращаться к элементу матрицы с индексами ( i,j) можно используя два индекса, каждый в отдельных квадратных скобках:
Удобно считать, что индекс в первых квадратных скобках — номер строки, а во вторых — номер столбца. Таким образом, matr[i][ j ] – элемент матрицы на пересечении i- й строки и j- го столбца.
Программа печати содержимого матрицы 100×200 : печатаем 1 00 строк по 2 00 элементов в каждой
double matr[100][200];
… /* инициализация матрицы */
printf(“%lf “, matr[i][j]);
Программа перемножения двух матриц 100×200 и 200×150, результат — матрица 100×150 :
double m1[100][200], m2[200][150], m3[100][150];
… /* инициализация m1 и m2 */
Динамически создаваемые матрицы
Часто размер матрицы неизвестен в момент написания программы. В этом случае удобно выделять память под матрицу в тот момент, когда ее размер становится известным. Это делается при помощи известной нам функции malloc().
Память, выделяемая динамически, линейна, то есть представляет собой одномерный массив. Программист, используя ее для хранения многомерных массивов, сам отвечает за размещение элементов матрицы в этом одномерном массиве, то есть устанавливает соответствие между двумя индексами элемента в матрице и одним индексом элемента в одномеерном массиве. Матрицу удобно хранить в одномерном массиве в виде последовательности строк.
Программа, считывающая размер матрицы и ее элементы с клавиатуры и выводящая матрицу на экран:
double *matr;
int n, k, i, j;
printf(“Wrong size\n”);
matr = (double*)malloc(n*k*sizeof(double));
printf(“%lf ”, matr[i + j*n]);
Отлад ка программы
Для отладки программы можно использовать не только дополнительную печать состояния программы, называемую отладочной, но и специальные средства.
В ОС Линукс имеется отладчик GDB, позволяющий выполнять программу по шагам или непрерывно до определенной точки, называемой breakpoint , отслеживать текущее состояние переменных и стека вызова функций.
Для полноценной работы отладчика с программой ее загрузочный код должен содержать отладочную информмацию. Это достигается добавлением опции “ -g” в команде компиляции, например:
gcc tmp.c -g
Результат такой компиляции загрузочный файл a.out содержит отладочную информацию.
Для выполнения загрузочного файла в режиме отладки надо при его загрузке добавить перед его именем имя отладчика:
gdb ./a.out
Отладчик gdb работает в командном режиме, то есть команды пользователя набираются в командной строке.
Самые главные команды в отладчике — run и quit . Первая выполняет программу, вторая позволяет закончить отладку.
Если программа в процессе выполнения «упала», то помогут команды bt и frame. Первая покажет стек вызовов функций в момент «падения» с именами и номерами функций, вторая поможет выбрать интересующую функцию в этом стеке по ее номеру:
frame 1
Чтобы разобраться, почему программа «упала», полезно применить команду print, которая выводит на экран значения переменных в момент падения:
print matr[0][0]
print i
print j
Если указанные команды не помогли, то можно воспользоваться возможностью выполнения программы до определенной точки, например:
break main
А затем выполнять программу по шагам при помощи команд next ( выполняет очередную инструкцию) и step («проваливается» в вызов функции).
Как создать матрицу с добавлением элементов в C?
я имею введу то, что нужно создать матрицу с вводом елементов. Например матрица А 3х4 и нужно вручную вводить эти самые елементы. Делать это нужно через цикл или как? Я понимаю как создать матрицу с помощью массивов, но как вручну задавать елементы не очень(.
13 фев 2011 в 17:43
С чем именно проблема? С чтением ввода пользователя?
13 фев 2011 в 17:51
Да! Как правильно это реализовать на с?
13 фев 2011 в 17:52
@Nychos я дополнил свой ответ
13 фев 2011 в 18:13
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Для решения задачи Вам необходимо сделать ровно то, что Вы нам сообщили.
P.S. Правду говорят — в вопросе обычно содержится если не весь, то половина ответа =).
Вот набросал элементарнейший пример чтения массива:
int N; printf("Enter number of items: "); scanf("%d", &N); int *arr = (int*)malloc(sizeof(int) * N); for (int i = 0; i < N; ++i) < printf("Enter item #%d: ", i); scanf("%d", &(arr[i])); >// … free(arr);
Обратите внимание, на то, что вариант далёк от идеала, поскольку нет никакой проверки корректности ввода. Но Вам, как я понимаю, надо для учебного задания, так что сойдёт.
Матрицы в Си
Матрица это набор объектов, которые хранятся в виде таблицы. У каждой матрицы есть имя, единый тип всех ее объектов.
Обявление матрицы в Си
Также как и переменные матрицу в Си необходимо объявить перед тем как с ней работать, необходимо указать ее тип, ее имя , количество строк -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.
// вложенный цикл, “пробегаемся” по всем столбцам для Нумерация столбцов с 0.
…Имя матрицы [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);
Вернуться к содержанию Перейти к теме Работа с файлами в Си
Полезно почитать по теме массивы и матрицы в си
Массивы в си
Игра на си Крестики Нолики
Комментарии ( 0 )
Нет комментариев. Ваш будет первым!
Двумерные массивы в СИ
Объявление двумерного массива в СИ имеет следующий синтаксис:
тип имя[размер №1][размер №2];
Размеры двумерного массива в СИ указываются в отдельных парных квадратных скобках после имени и могут быть любыми положительными целочисленными значениями. На практике принято значение первой размерности называть строками, а второй – столбцами. Как и в случае одномерного массива, в стандарте С89 регламентируется, что размеры двумерного массива должны быть целочисленными константами.
Стандарт С99 допускает объявление динамических двумерных массивов путём использования выражений при указании размеров матрицы, если в это выражение входят значения определенных ранее переменных (выражение должно иметь положительный целочисленный результат). Например:
int n,m;
printf(«Введите размеры матрицы: ”);
scanf(«%d %d”,&n,&m);
double a[n][m];
При объявлении двумерного массива в СИ допускается производить инициализацию значений элементов матрицы:
тип имя[размер №1][размер №2] = <
,
.
>;
Примеры объявлений с инициализацией:
int a[2][4] = < //Объявлен двумерный массив
, // 1 2 3 4
>; // 5 6 0 0
Пропускать значения инициализации строк нельзя. Например, следующий фрагмент кода программы неправильный:
int a[3][5] = ,,>;
Допускается не указывать количество строк в двумерном массиве (указываются пустые квадратные скобки). В таком случае размер массива будет определен по числу инициализирующих значений строк. Количество столбцов матрицы всегда необходимо указывать. Например:
double b[][4] = ,>;
Объявление константных матриц (значения их элементов изменить нельзя) начинается с ключевого слова const, за которым следует объявление матрицы с инициализацией. Пример:
const int matrix[][5] = <
,
>;
Обращение к элементу матрицы осуществляется путем указания имени матрицы, а после имени в отдельных парных квадратных скобках индексы элемента (строка и столбец):
имя[строка][столбец]
Индексация в языке СИ начинается с нуля, поэтому для матрицы размером, например, пять строк и десять столбцов правильными будут индексы строк от нуля до четырех, а столбцов – от нуля до девяти включительно.
Каждый отдельный элемент матрицы может рассматриваться как простая переменная и, соответственно, выступать в выражениях в качестве RValue или LValue значений.
Ввод и вывод матриц в языке СИ осуществляется поэлементно. Так как матрица имеет двойную размерность, то ввод и вывод осуществляется во вложенных циклах. Например:
double a[5][10];
for(int i=0;i<5;i++)
for(int j=0;j<10;j++)
scanf(«%lf”,&a[i][j]);
.
for(int i=0;i<5;i++) <
for(int j=0;j<10;j++)
printf(«%8.2lf\t”,a[i][j]);
printf(«\n”);
>
Присвоение матрицы матрице также осуществляется поэлементно. Например, необходимо присвоить целочисленную матрицу x целочисленной матрице y. Фрагмент программы:
int x[5][10], y[5][10];
.
for(int i=0;i<5;i++)
for(int j=0;j<10;j++)
y[i][j] = x[i][j];
.
В языке СИ допускается создание массивов размерностью три и более(т.е трехмерных, четырехмерных и т.д.). Например, объявление трёхмерного целочисленного массива с инициализацией будет иметь вид:
int a[2][2][2]= < //это трехмерный массив
,>,
,>
>;
Ввод, вывод и прочая обработка такого массива осуществляется аналогично обработке двумерного массива, только уже в трех вложенных циклах.
