Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Прямые ??????????????? / 9 сообщений из 9, страница 1 из 1
13.05.2007, 20:30
    #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
13.05.2007, 20:39
    #34521936
StepLg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямые ???????????????
программа сама по себе написана очень криво. сейчас быстренько чиркну нормальный вариант с комментариями.
...
Рейтинг: 0 / 0
13.05.2007, 21:16
    #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
13.05.2007, 21:19
    #34521955
StepLg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямые ???????????????
п.с. если после моих комментариев что-то не понято - то почитайте лучше какую-нибудь книгу по С++. Потому что основы (типа что такое цикл for и как объявлять переменную) я думаю вряд ли вам кто-то здесь станет объяснять.
...
Рейтинг: 0 / 0
13.05.2007, 23:24
    #34522039
Homoerro number 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прямые ???????????????
огромное спасибо за предоставленную помощь!
программирование вас не забудет!

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

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

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

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

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



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

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

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

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

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


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