powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Прямые ???????????????
9 сообщений из 9, страница 1 из 1
Прямые ???????????????
    #34521928
Homoerro number 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программеры, помогите разобраться!!!

У меня лаба про двухмерные массивы:

Задача №1:
Последний отрицательный элемент каждого столбца двумерного массива заменить нулём.
Задача №2:
Вставить второй столбец после первого столбца, в котором все элементы положительны. Если такого столбца нет, то сообщить об этом.


Вот решение:

#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
int **ar,i,j,k1,k2,s,est,*st,**mar,ip,jp,found;
int n,m;

int** first(int **ar)
{
int num;


for (j=0;j<n;j++)
{
num=-1;
for (i=0;i<m;i++) if (ar [j]<0) num=i;
if (num!=-1) ar[num][j]=0;}

return ar;}

int** second(int **ar)
{
found=0;
for (j=0;j<n;j++)
{
est=0;
for (i=0;i<m;i++) if (ar[j]<0) est=1;
if (est==0)
{
found=1;
est=j;
break;
}
}

if (found==1)
{
for (i=0;i<m;i++) st=ar[1];

for (j=n;j>est;j--)
for (i=0;i<m;i++) ar[j]=ar[j-1];
for (i=0;i<m;i++) ar[est]=st;

}
return ar;}


int choice;

int main()
{
clrscr();
while (choice!=3)
{
randomize;
cout<<"Выполнить первое задание"<<endl;
cout<<"Выполнить второе задание"<<endl;
cout<<"Выполнить третье задание"<<endl;
cin>>choice;

if (choice!=3)
{
cout<<"Введите n\n";
cin>>n;
cout<<"Введите m\n";
cin>>m;
ar=(int **)calloc(m,sizeof(int *));
for (i=0;i<m;i++) ar=(int *)calloc(n+1,sizeof(int));
st=(int *)calloc(m,sizeof(int));
for (i=0;i<m;i++)
for (j=0;j<n;j++) ar[j]=random(12)-2;
cout<<"Исходный массив:\n"<<endl;
for (i=0;i<m;i++)
{for (j=0;j<n;j++) cout<<ar[j]<<" ";
cout<<endl;}
cout<<endl;
}

if (choice==1)
{
mar=first(ar);
for (ip=0;ip<m;ip++)
{for (jp=0;jp<n;jp++) cout<<mar[ip][jp]<<" "; cout<<endl;}
}


if (choice==2)
{
mar=second(ar);
if (found==1)
{
for (ip=0;ip<m;ip++)
{for (jp=0;jp<=n;jp++) cout<<mar[ip][jp]<<" "; cout<<endl;}
}
else cout<<"Нет такого столбца \n";
}
for (i=0;i<m;i++) free(ar); free(ar);free(st);
}

return 0;}



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


Вот решение с комментами:


#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
int **ar,i,j,k1,k2,s,est,*st,**mar,ip,jp,found;
int n,m;

int** first(int **ar)
{
int num; {номер последнего отриц.элемента} {}


for (j=0;j<n;j++) {Идем по столбцам}
{
num=-1; {Считаем, что нет такого элемента}
for (i=0;i<m;i++) if (ar[j]<0) num=i; {Если есть такой элемент заменяем нулем}
if (num!=-1) ar[num][j]=0;}

return ar;}

int** second(int **ar)
{
found=0; {Считаем, что нет такого столбца}
for (j=0;j<n;j++)
{
est=0; {Беря столбец считаем, что все его элементы положительными}
for (i=0;i<m;i++) if (ar[j]<0) est=1; {Если находим находим отриц. Est присваиваем 1}
if (est==0) {Но если Est по-прежнему равна 0}
{
found=1; {Считаем, что нашли такой столбец}
est=j; {Записываем его номер}
break; {И выходим из цикла}
}
}

if (found==1) {Если такой столбец найден}
{
for (i=0;i<m;i++) st=ar[1];

for (j=n;j>est;j--)
for (i=0;i<m;i++) ar[j]=ar[j-1]; {Сдвигаем эти элементы постолбцово}
for (i=0;i<m;i++) ar[est]=st; {А на их место ставим второй}

}
return ar;}


int choice;

int main()
{
clrscr();
while (choice!=3)
{
randomize;
cout<<"Выполнить первое задание"<<endl;
cout<<"Выполнить второе задание"<<endl;
cout<<"Выполнить третье задание"<<endl;
cin>>choice;

if (choice!=3)
{
cout<<"Введите n\n";
cin>>n;
cout<<"Введите m\n";
cin>>m;
ar=(int **)calloc(m,sizeof(int *));
for (i=0;i<m;i++) ar=(int *)calloc(n+1,sizeof(int));
st=(int *)calloc(m,sizeof(int));
for (i=0;i<m;i++)
for (j=0;j<n;j++) ar[j]=random(12)-2;
cout<<"Исходный массив:\n"<<endl;
for (i=0;i<m;i++)
{for (j=0;j<n;j++) cout<<ar[j]<<" ";
cout<<endl;}
cout<<endl;
}

if (choice==1)
{
mar=first(ar);
for (ip=0;ip<m;ip++)
{for (jp=0;jp<n;jp++) cout<<mar[ip][jp]<<" "; cout<<endl;}
}


if (choice==2)
{
mar=second(ar);
if (found==1)
{
for (ip=0;ip<m;ip++)
{for (jp=0;jp<=n;jp++) cout<<mar[ip][jp]<<" "; cout<<endl;}
}
else cout<<"Нет такого столбца \n";
}
for (i=0;i<m;i++) free(ar); free(ar);free(st);
}

return 0;}



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



Теперь вопрос:


Мне не очень-то понятно, что делается дальше...т.е. вот этот кусок:


int choice; Понимаю

int main() Понимаю
{
clrscr(); Понимаю
while (choice!=3) Понимаю
{
randomize; (((((((А зачем здесь рэндомайз?)))))))))))))))))
cout<<"Выполнить первое задание"<<endl; Понимаю
cout<<"Выполнить второе задание"<<endl; Понимаю
cout<<"Выполнить третье задание"<<endl; Понимаю
cin>>choice; Понимаю

if (choice!=3) Понимаю
{
cout<<"Введите n\n"; Понимаю
cin>>n; Понимаю
cout<<"Введите m\n"; Понимаю
cin>>m; Понимаю
ar=(int **)calloc(m,sizeof(int *)); ((((((((((Для чего здесь выделяеться память? Для чего именно? что такое ar?))))))))))))))))))))))))))))
for (i=0;i<m;i++) ar=(int *)calloc(n+1,sizeof(int)); что делает цикл фо?
st=(int *)calloc(m,sizeof(int)); ???????????????????
for (i=0;i<m;i++) ????????????????
for (j=0;j<n;j++) ar[j]=random(12)-2; ??????????????????
cout<<"Исходный массив:\n"<<endl; понимаю
for (i=0;i<m;i++) для чего цикл?
{for (j=0;j<n;j++) cout<<ar[j]<<" "; ??????????????
cout<<endl;} понимаю
cout<<endl; понимаю
}

if (choice==1) понимаю
{
mar=first(ar); для чего такое присвоение?
for (ip=0;ip<m;ip++) цикл???????
{for (jp=0;jp<n;jp++) cout<<mar[ip][jp]<<" "; cout<<endl;} цикл???????
}

if (choice==2)
{
mar=second(ar);
if (found==1)
{
for (ip=0;ip<m;ip++) Здесь цикл идет по циклу?
{for (jp=0;jp<=n;jp++) cout<<mar[ip][jp]<<" "; cout<<endl;} Распечатывается измененный массив???
}
else cout<<"Нет такого столбца \n";
}
for (i=0;i<m;i++) free(ar); free(ar);free(st); Цикл, очистка памяти, а зачем?????
}

return 0;}



Пожалуйста, профессионалы своего дела, помогите юному программисту разобраться во всем этом. Заранее огромный респект и человеческое спасибо!!!
...
Рейтинг: 0 / 0
Прямые ???????????????
    #34521936
StepLg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
программа сама по себе написана очень криво. сейчас быстренько чиркну нормальный вариант с комментариями.
...
Рейтинг: 0 / 0
Прямые ???????????????
    #34521954
StepLg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
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.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
#include <iostream>
#include <stdlib.h>
using namespace std;

// функция выполнения первого задания
void first(int** mas, const int n, const int m)
{
  for (int j=m- 1 ; j>= 0 ; --j)
  {
    // проходим циклом по каждому столбцу
    for (int i=n- 1 ; i>= 0 ; --i)
    {
      // в каждом столбце начиная с конца ищем первый отрицательный элемент и заменяем его на ноль. потом выходим из цикла обработки столбца
      if (mas[i][j]< 0 )
      {
        mas[i][j] =  0 ;
        break;
      }
    }
  }
}
// функция выполнения второго задания
void seckond(int** mas, const int n, const int m)
{
  int jpositive = - 1 ; // номер искомого стобца (со всеми положительными)
  for (int j= 0 ; j<m; ++j)
  {
    bool flag = true;
    for (int i= 0 ; i<n; ++i)
      if (mas[i][j]<= 0 )
      {
        // в столбце есть неположительный элемент, значит этот столбец нам не подходит
        flag = false;
        break;
      }
    if (flag)
    {
      // в столбце все положительные - запоминаем его номер и выходим из цикла поиска подходящего столбца
      jpositive = j;
      break;
    }
  }
  if (jpositive==- 1 )
  {
    // если столбец найден не был, выдаем сообщение
    cout << "Такого столбца нет" << endl;
    return;
  }
  if (jpositive== 1 ) { return; } // если это и так 2 столбец - ничего менять не надо. оставляем все как есть.
  int tmp;
  // меняем элементы в найденом стобце и во 2 столбце
  for (int i= 0 ; i<n; ++i)
  {
    tmp = mas[i][ 1 ];
    mas[i][ 1 ] = mas[i][jpositive];
    mas[i][jpositive] = tmp;
  }
}

int main()
{
  int **mas; // наш массив
  int n, m; // количество строк и столбцов
  cout << "Введите количество строк массива :"; cin >> n;
  cout << "Введите количество столбцов массива :"; cin >> m;
  mas = new int* [n]; // выделяем память сначала для строк
  for (int i= 0 ; i<n; ++i)
    mas[i] = new int [m]; // а теперь выделяем память для столбцов.

  // (выделение памяти нужно, т.к. нам заранее не известно количество строк и столбцов. 
  // После любого выделения памяти эту память нужно удалить, что мы и делаем в конце программы
    
  char c;
  do
  {
    cout << "Вводить массив вручную? y/n "; cin >> c;
  } while ((c!='y') && (c!='n'));
  if (c=='y')
  {
    for (int i= 0 ; i<n; ++i)
    {
      cout << "Введите " << i << "-тую строку" << endl;
      for (int j= 0 ; j<m; ++j)
        cin >> mas[i][j];
    }
  }
  else
  {
    for (int i= 0 ; i<n; ++i)
    {
      for (int j= 0 ; j<m; ++j)
      {
        mas[i][j] = rand()% 20 - 10 ; // генерируем случайоное число и заносим его в массив
        cout << mas[i][j] << " ";
      }
      cout << endl;
    }
  }
  
  cout << endl;
  do
  {
    cout << "Введите номер задания: "; cin >> c;
  } while (c!='1' && c!='2');
  
  if (c=='1')
    first(mas, n, m);
  else // c==2
    seckond(mas, n, m);

  cout << "Результат" << endl;
  // печатаем результирующий массив и освобождаем память.
  for (int i= 0 ; i<n; ++i)
  {
    for (int j= 0 ; j<m; ++j)
      cout << mas[i][j] << " ";
    cout << endl;
    delete[] mas[i];
  }
  delete[] mas;
  return  0 ;
}

...
Рейтинг: 0 / 0
Прямые ???????????????
    #34521955
StepLg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
п.с. если после моих комментариев что-то не понято - то почитайте лучше какую-нибудь книгу по С++. Потому что основы (типа что такое цикл for и как объявлять переменную) я думаю вряд ли вам кто-то здесь станет объяснять.
...
Рейтинг: 0 / 0
Прямые ???????????????
    #34522039
Homoerro number 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
огромное спасибо за предоставленную помощь!
программирование вас не забудет!

только один вопрос: что такое using namespace std;?
...
Рейтинг: 0 / 0
Прямые ???????????????
    #34522376
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Homoerro number 2огромное спасибо за предоставленную помощь!
программирование вас не забудет!

только один вопрос: что такое using namespace std;?

использование (поиск литер в) пространства имен std
...
Рейтинг: 0 / 0
Прямые ???????????????
    #34524614
Homoerro number 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh Homoerro number 2огромное спасибо за предоставленную помощь!
программирование вас не забудет!

только один вопрос: что такое using namespace std;?

использование (поиск литер в) пространства имен std



ну, а для чего здесь это используется?
...
Рейтинг: 0 / 0
Прямые ???????????????
    #34524631
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А потому что cout и endl определены в пространстве имен std/ И чтобы можно было писать cout вместо std::cout и написали using
...
Рейтинг: 0 / 0
Прямые ???????????????
    #34524636
StepLg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
любые стандартные функции находятся в некотором пространстве имет. т.е. для того, чтобы вызвать функцию нужны две вещи - указать пространство имен, в котором она определена и указать собственно имя функции. Это можно сделать двумя способами

1) напрямую при вызове функции так:
пространство_имен::имя_функции(список параметров)

2) сразу для всех функций:
using namespace пространство_имен;

имя_функции(список параметров);

Подробнее - читать учебники про пространства имен.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Прямые ???????????????
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]