Перед первым столбцом матрицы, содержащим только положительные элементы, вставить столбец из единиц - C (СИ)
Формулировка задачи:
Дана матрица размера M × N. Перед первым столбцом, содержащим только положительные элементы, вставить столбец из единиц. Если требуемых столбцов нет, то вывести матрицу без изменений.
Уже 5 часов не могу доделать программу, подскажите пожалуйста. Столбец с положительными элементами нахожу, а вставить столбец из единиц не могу. Пытался сделать через дополнительную матрицу, вот код:
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <locale.h>
- #include <time.h>
- int main()
- {
- setlocale(LC_CTYPE,"Russian");
- printf("Введите размер матрицы N = ");
- int N,M;
- srand(time(NULL));
- scanf("%d",&N);
- if(N<2){
- printf("В матрице должно быть минимум 2 строки!");
- return 0;
- }
- printf("Введите размер матрицы M = ");
- scanf("%d",&M);
- int arr[N][M];
- int i,j;
- ///Initialize
- printf("Ввести матрицу вручную или автоматически?\n1. Вручную\n2. Автоматически\n");
- int sw;
- scanf("%d",&sw);
- if(sw == 2){
- for(i=0;i<=N-1;i++){
- for(j=0;j<=M-1;j++){
- arr[i][j] = rand()/400-20;
- }
- }
- } else {
- printf("\nВведите элементы матрицы:\n");
- for(i=0;i<=N-1;i++){
- for(j=0;j<=M-1;j++){
- scanf("%d",&arr[i][j]);
- }
- }
- }
- printf("\nПервоначальная матрица:\n");
- ///M - строки N - столбцы
- ///Вывод первоначальной матрицы
- for(i=0;i<=N-1;i++){
- printf("\n");
- for(j=0;j<=M-1;j++){
- printf("%3d ",arr[i][j]);
- }
- }
- ///program
- ///-------------------поиск столбца с положительными членами------------------
- int current = 0,z=0,stl = -1;
- for(j=0;j<M;j++){
- for(i=0;i<N;i++){
- if(arr[i][j]>0 && current == j){
- z++;///Если строка одна и элемент больше нуля увеличиваем счётчик
- if(z == N){ ///z == N-1 если счётчик равен количеству элементов столбца
- stl = j; ///Присваиваем номер столбца в котором все члены положительны
- break;
- }
- }
- if(i == N-1){///если последняя итерация то увеличиваем строку на 1
- current++;
- z = 0;
- }
- }
- }
- printf("Положительные члены в %d столбце",stl);
- ///---------------нашли столбец и засунули в stl------------------------
- int siz = M+1;
- int narr[N][siz];
- int temp;
- int k = 1; ///Счётчик для сдвига матрицы
- if(stl != -1){
- printf("\nНовая матрица:\n");
- for(i=0;i<N;i++){
- for(j=0;j<siz;j++){
- narr[i][j] = 1; ///заполняем массив единицами
- }
- }
- j = 0;
- for(i=0;i<N;i++){
- for(j=0;j<siz;j++){
- if(j == stl){
- narr[i][j] = arr[i][stl];
- narr[i][j+1] = arr[i][stl];
- ///j+=2;
- continue;
- ///narr[i][j] = arr[i][j]; ///заполняем массив таким же массивом кроме последнего столбца
- ///printf("\n--------\n%d\n--------\n",narr[i][j+1]);
- }
- }
- }
- for(i=0;i<N;i++){
- for(j=0;j<siz;j++){
- /**if(j == stl && stl == 0){
- temp = narr[i][j];
- narr[i][j] = narr[N-1][siz-1];
- narr[i][j+1] = temp;
- continue;
- }
- if(j == stl){
- temp = narr[i][j];
- narr[i][j] = narr[N-1][siz-1];
- narr[i][j+1] = temp;
- }
- */
- }
- k++;
- }
- for(i=0;i<N;i++){
- printf("\n");
- for(j=0;j<siz;j++){
- printf("%3d ",narr[i][j]);
- }
- }
- } else {
- for(i=0;i<=N-1;i++){
- printf("\n");
- for(j=0;j<=M-1;j++){
- printf("%3d ",arr[i][j]);
- }
- }
- }
- return 0;
- }
Решение задачи: «Перед первым столбцом матрицы, содержащим только положительные элементы, вставить столбец из единиц»
textual
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #define M 10
- #define N 3
- int matrix_insert(int mat[N][M], int m){
- int i, j, a, b;
- for(j = 0; j < m; ++j){
- i = 0;
- while((i < N) && (mat[i][j] > 0))
- ++i;
- if(i == N){
- for(a = 0; a < N; ++a){
- for(b = m; b > j; --b)
- mat[a][b] = mat[a][b - 1];
- mat[a][b] = 1;
- }
- ++m;
- ++j;
- }
- }
- return m;
- }
- int main(void){
- int i, j, m;
- int mat[N][M];
- m = M / 2;
- for(i = 0; i < N; ++i){
- for(j = 0; j < m; ++j)
- mat[i][j] = ((rand() % 10) < 7) ? (2 + rand() % 3) : -(2 + rand() % 3);
- }
- m = matrix_insert(mat, m);
- for(i = 0; i < N; ++i){
- for(j = 0; j < m; ++j)
- printf("% 2d ", mat[i][j]);
- putchar('\n');
- }
- return 0;
- }
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы с массивами и вводом-выводом
- Объявление матрицы с фиксированным размером
- Определение функции, которая будет вставлять дополнительный столбец из единиц перед первым столбцом матрицы
- В функции
main
создается матрица случайных чисел - Вызывается функция
matrix_insert
для вставки дополнительного столбца из единиц перед первым столбцом матрицы - Выводится на экран полученная матрица
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д