Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2009, 13:07   #1
Olya90
Форумчанин
 
Аватар для Olya90
 
Регистрация: 16.03.2009
Сообщений: 125
Вопрос Динамические масивы на с++

Помогите пожалуйста доделать прогу.
1). Вводим размеры матрицы(m,n), создается матрица из рандомных чисел, потом нужно чтобы программа добавляла строку после каждой четной строки. Но также, ко всему этому нужно сделать меню, типа:

do
{
cout<<”1. Формировка масива\n”;
cout<<”2. Вывод масива\n”;
cout<<”3. Удаление в масиве\n”; //если используется
cout<<”4. Добавление к масиву\n”;
cout<<”5. Выход\n”;
cin>>k;
switch (k)
{
case 1: mas=form_mas(SIZE);input_mas(mas,SI ZE); break;//выделение памяти и заполнение
case 2: print_mas(mas,SIZE); break;//вывод
case 3: del_mas(mas,SIZE);break;//удаление
case 4: add_mas(mas,SIZE);break;//добавление
}
while (k!=5);//выход


У меня есть набросок но и есть вопросы:
Код:
#include <iostream>
#include <conio.h>
#include <time.h>
using namespace std;

form_matr(int m,int n)
{
matr = new int*[m];
for(i=0;i<m;i++)
 {
  matr[i] = new int[n];
  for(j=0;j<n;j++) matr[i][j] = rand()%100;
  cout<<endl;
 }
cout<<endl;

}

print_matr(int m,int n,int matr)
{
for(i=0;i<m;i++)
 {
  for(j=0;j<n;j++)
   {
    cout.width(4);
    cout<<matr[i][j]; //у меня здесь выскакивает ошибка(( как научить
                            //прогу чтобы она знала что это масив и могла
                            //сделать его вывод
   }
  cout<<endl;
 }
cout<<endl;
}

add_matr() //какой алгоритм можно использовать чтобы после каждой 
           //четной строки программа добавляла(вставила) одну рандмоную строку 


int main()
{
	int n;
    cout<<"Vvedite kolichestvo strok: ";
    cin>>m;
    cout<<"Vvedite kolichestvo stolpcov: ";
    cin>>n;
	person*matr=form_matr(m,n);
	init_matr(matr,m,n);
	print_matr(matr,m,n);
	return 1;
}

2). И вот еще одна задачка с одномерным динам. массивом:
Нужно ввести размер массива и потом чтобы прога уничтожила елемент с заданым номером... Я сделала эту задачку... но с простым массивом. Вопрос как переделать ее в динамический)), и какие отличия имеет динамический массив от "обычного" ??
Вот мое:
Код:
#include <cstdlib>
#include <iostream>
#include <ctime>

using namespace std;

int main(int argc, char *argv[])
{
    const int MAX_SIZE=100;
    int mas[MAX_SIZE];
    int n,p;
    cout<<"\nEnter size array<"<<MAX_SIZE<<":";
    cin >> n;

srand(time(NULL));

cout<<"Array\n ";
for(int i=0;i<n;i++)
  {
   mas[i]=rand()%100-50;
   cout<<mas[i]<<" ";
  }
cout << endl;  

    cout << "Enter number of element:";
    cin >> p;

p--;
for(;p<n;p++) mas[p]=mas[p+1];

cout << "Result:";
for(int i=0;i<n-1;i++)
  {
   cout<<mas[i]<<" ";
  }

system("PAUSE");
return EXIT_SUCCESS;
}
Если помогла нажмите на весы
Olya90 вне форума Ответить с цитированием
Старый 20.04.2009, 14:14   #2
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Первая часть программы:
Код:
#include <iostream>
#include <conio.h>
#include <time.h>
using namespace std;

void form_matr(int m,int n){
   int **matr = new int *[m];
   for(int i = 0; i < m; i++){
     matr[i] = new int[n];
     for(int j = 0; j < n; j++) 
        matr[i][j] = rand()%100;
     cout<<endl;
    }
   cout<<endl;
}

void print_matr(int m,int n,int matr){
   for(int i = 0; i < m; i++){
      for(int j = 0; j < n; j++){
    cout.width(4);
    cout<<matr[i][j]; //ничего изменять не нужно, надо было просто объявить matr соответствующим образом
   }
  cout<<endl;
 }
cout<<endl;
}
Код совершенно нечитабелен, куча синтаксических ошибок.

Уточни, что значит "нужно чтобы программа добавляла строку после каждой четной строки"
megachuhancer вне форума Ответить с цитированием
Старый 20.04.2009, 14:33   #3
Olya90
Форумчанин
 
Аватар для Olya90
 
Регистрация: 16.03.2009
Сообщений: 125
По умолчанию

Спасибки за помощь )) ...
>> Уточни, что значит "нужно чтобы программа добавляла строку после каждой четной строки"

Например:
Мы ввели размерность матрицы она вывелась...
12 34 56 34
23 43 34 54 //четная строка
12 23 45 56
43 56 43 32 //четная строка
21 34 56 43

Программа должна вставлять строку после каждой четной строки результат будет таким:
12 34 56 34
23 43 34 54
12 36 55 89 // новая вставленая строка
12 23 45 56
43 56 43 32
15 36 95 87 // новая вставленная строка
21 34 56 43
Походу так....
Если помогла нажмите на весы
Olya90 вне форума Ответить с цитированием
Старый 20.04.2009, 14:48   #4
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

По первой задаче: int **matr в написанном мной коде надо вынести за пределы всех функций. А на прежнем месте оставить matr = new int *[m];
Это нужно, чтобы matr было доступно во всех функциях.

По второй: Массив - константный указатель. Указатель можно индексировать как массив. Динамический массив - область памяти выделенная динамически, адрес которой присвоен(или не присвоен) указателю.
Например:
Код:
int a[20]; //статический массив
int *b = new int[20]; //динамический массив
И тот, и другой можно индексировать как обычно: a[i], b[j] и т.д. и т.п.

Разница здесь в том, что адрес на который указывает a нельзя изменить в программе средствами языка, а b можно, например
Код:
int *c;
...
b = c;
...
Память, занятую динамическим массивом, можно освободить:
Код:
delete [] b;
Память же, занятая a,так и будет занята, пока работает программа.

Последний раз редактировалось megachuhancer; 20.04.2009 в 14:55.
megachuhancer вне форума Ответить с цитированием
Старый 20.04.2009, 15:17   #5
Olya90
Форумчанин
 
Аватар для Olya90
 
Регистрация: 16.03.2009
Сообщений: 125
По умолчанию

Цитата:
По первой задаче: int **matr в написанном мной коде надо вынести за пределы всех функций. А на прежнем месте оставить matr = new int *[m];
Это нужно, чтобы matr было доступно во всех функциях.
Это нужно вынести int **matr в int main() ?? Напишите а то у меня не получается (
Если помогла нажмите на весы
Olya90 вне форума Ответить с цитированием
Старый 21.04.2009, 11:37   #6
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Код:
#include <iostream>
#include <conio.h>
using namespace std;

int **matr;
int n , m;

void form_matr(int m,int n){
   for(int i = 0; i < m; i++){
     matr[i] = new int[n];
     for(int j = 0; j < n; j++) 
        matr[i][j] = rand()%100;
    }
}

void print_matr(int m,int n){
   for(int i = 0; i < m; i++){
      for(int j = 0; j < n; j++){
         cout.width(4);
         cout << matr[i][j]; //ничего изменять не нужно, надо было просто объявить matr соответствующим образом
      }
      cout<<endl;
   }
   cout<<endl;
}

//какой алгоритм можно использовать чтобы после каждой 
//четной строки программа добавляла(вставила) одну рандмоную строку 

//Вообще-то, я полагаю, что никакой. Вставку между элементами не поддерживают ни статические, ни динамические массивы
//Для этого существуют такие структуры данных как, например, связные списки


int main()
{
   cout<<"Vvedite kolichestvo strok: ";
   cin>>m;
   cout<<"Vvedite kolichestvo stolpcov: ";
   cin>>n;
   matr = new int *[m];
   form_matr(m,n);
   print_matr(m,n);
   getch();
   return 0;
}
matr, n и m были вынесены за пределы всех функций, выделение памяти под левую размерность было перенесено в main().
Если нужно написать программу с локальными переменными и параметрами - то, что уже написано легко переделать. Если не получится - пиши сюда.

Я довёл программу до работоспособного состояния, но решительно не понимаю, что значит "вставить строку". Вот есть указатель на указатель. Он указывает на кусок кучи, где размещены m указателей... Может надо сделать так, чтобы сначала формировалась матрица, потом выделялась память под новые строки, потом добавлялись строки, а старые сдвигались? Просто учебные примеры бывают настолько искусственны, что трудно понять, что вообще надо сделать.

За "код совершенно нечитабелен" приношу свои извинения, просто в первый раз он у меня некорректно отобразился.

Последний раз редактировалось megachuhancer; 21.04.2009 в 11:44.
megachuhancer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Paskal, цыклы, масивы. Maks:// Помощь студентам 8 10.02.2009 19:03
Одномерные масивы на i8080 Ase Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 04.11.2008 08:25
Pascal масивы Devikss Помощь студентам 2 19.06.2008 17:20
динамические масивы mrandrey Общие вопросы Delphi 14 11.04.2007 15:14