Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
sasha2x
0 / 0 / 0
Регистрация: 14.03.2011
Сообщений: 7
#1

Не хочет работать Rand - C++

14.03.2011, 21:43. Просмотров 578. Ответов 7
Метки нет (Все метки)

Здравствуйте, при выполнении лабораторной работы столкнулся с некоторыми трудностями:
При запуске программы она доходит до функции ran и останавливается

C++
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
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
 
using namespace std;
void date(long **mas,int x, int y){ //a)
  mas = new long*[x];
 
  for (int i = 0; i < x; i++) {
    mas[i] = new long [y];
  }
 
}
void ran(long **mas,const int x,const int y){ //b)
  for(int i=0; i<x; i++)
     for(int j=0; j<y;j++)
       mas[i][j]=rand()%100;
  }
long **sum(long **mas1,long **mas2,int x1,int y1,int x2,int y2){ //
    long **mas=NULL;
    mas=new long *[x1];
    for (int r=0; r<x1; r++){
    mas[r]=new long [y1];
    }
  for(int i=0;i<x1;i++)
   for(int j=0;j<y1;j++)
   mas[i][j] = mas1[i][j] + mas2[i][j];
  return mas;
}
long **p(long **mas1,long **mas2,int x1,int y1,int x2,int y2){
    long **mas=NULL;
    mas=new long *[x1];
    for (int r=0; r<x1; r++){
    mas[r]=new long [y2];
    }
    for(int i=0;i<x1;i++)
     for(int j=0;j<y2;j++) {
       mas[i][j]=0;
      for (int k=0;k<y1;k++) mas[i][j]+=mas1[i][k]*mas2[k][j];
    }
   return mas;
}
void print(long **mas,int x,int y){
       for(int i=0; i<x; i++){
         for(int j=0; j<y; j++)
       cout<<mas[i][j]<<" ";
     cout<<endl;
}
}
 
 
void delet(long **mas,int x,int y){//d)
  mas = new long *[x];
    for (int i = 0; i < x; i++) {
      delete []mas[i];
  }
 delete []mas;
}
 
 
 
 
 
int main(){
    int n,m;
    long **A=NULL,**B =NULL,**C =NULL,**D =NULL;
    cin >>n;
    cin >>m;
    date(A,n,m);
    date(B,n,m);
    date(C,m,n);
    date(D,n,n);
 
    ran(A,n,m);
    ran(B,n,m);
    ran(C,m,n);
    ran(D,n,n);
    cout<<endl<<endl<<"Input MATRIX"<<endl<<endl;
    print(A,n,m);
    cout<< endl;
    print(B,n,m);
    cout<<endl;
    print(C,m,n);
    cout<<endl;
    print(D,n,n);
    cout<<endl;
 
 
 
 
    cout<<endl<<endl<<"Output MATRIX"<<endl<<endl;
    print(p(sum(p(A,B,n,m,m,n),p(C,C,n,n,n,n), n, n,n,n), sum(A,D, n, m,n,m),n,n,n,m),n,m);
    cout<<endl;
 
    cout<< endl;
 
    delet(A,n,m);
    delet(B,n,m);
    delet(C,m,n);
    delet(D,n,n);
    getch();
    return 0;
}
Вот само условие :
Задание. Написать функции для работы с двумерными матрицами целых чисел типа long.
а) динамическое выделение памяти под матрицу;
б) заполнение матрицы с помощью датчика псевдослучайных чисел;
в) сложение двух матриц;
г) умножение двух матриц;
д) освобождение динамически выделенной памяти;
е) печать матрицы в виде строк на экране.
В качестве параметров внутрь функций надо передавать двойные указатели на параметры – матрицы, а также размеры этих матриц.
В основной функции main должны быть объявлены двойные указатели (для хранения матриц), а затем при помощи вызовов приготовленных функций найти требуемый результат. Должны быть напечатаны исходные матрицы и результирующая матрица. Размеры матриц должны вводиться в качестве переменных в начале работы программы.

Вариант 1. ; A(n*m), B(m*n), C(n*n), D(n*m)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
uggway
219 / 133 / 9
Регистрация: 12.04.2010
Сообщений: 248
14.03.2011, 22:28     Не хочет работать Rand #2
Можно несклько изменить фукцию date
C
1
2
3
4
5
6
7
8
long ** date(int x, int y){ //a)
    long **mas;
    mas = new long*[x];
    for (int i = 0; i < x; i++) {
        mas[i] = new long [y];
    }
    return mas;
}
И в main использвать так:
C
1
2
3
4
    A = date(n,m);
    B = date(n,m);
    C = date(m,n);
    D = date(n,n);
А передать таким обазом указатель на двумерный массив(которого еще не существует кстати) нельзя.
sasha2x
0 / 0 / 0
Регистрация: 14.03.2011
Сообщений: 7
14.03.2011, 22:48  [ТС]     Не хочет работать Rand #3
Спасибо , теперь только она через некоторое время вылетает.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
15.03.2011, 02:06     Не хочет работать Rand #4
C++
1
2
3
4
5
6
7
8
void date(long ***p, int x, int y)
{
    long **mas = new long *[x];
 
    for (int i = 0; i < x; i++)
        mas[i] = new long [y];
    *p = mas; 
}
C++
1
date(&A, n, m);
в C++ можно ещё через ссылки
sasha2x
0 / 0 / 0
Регистрация: 14.03.2011
Сообщений: 7
15.03.2011, 07:32  [ТС]     Не хочет работать Rand #5
Спасибо,столкнулся еще с одной проблемой , не правильное освобождение динамически выделенной памяти в этих строках:
C++
1
print(p(sum(p(A,B,n,m,m,n),p(C,C,n,n,n,n), n, n,n,n), sum(A,D, n, m,n,m),n,n,n,m),n,m);
Пробовал сделать еще один массив и вычислять через него, т.е. добавил эти строки:
C++
1
2
3
4
5
6
7
8
9
10
long **K=NULL;
       date(K,n,m);
         K=sum(p(A,B,n,m,m,n);//присвою значение К, значение суммы А и В
         //так как В нигде больше не встречается присвою значение суммы двух С
         B=p(C,C,n,n,n,n);
         C=p(K,B,n,n,n,n);// больше С нигде не встречается присвоим ей значение K и В
         // ну и так далее 
         K=sum(A,D, n, m,n,m);
         B=p(C,K,n,n,n,m);
       delet(K,n,m);//освобождение памяти в К
print(B, n,m);// выведем значение
Программа работает в таком случае через раз , запинаясь на
C++
1
B=p(C,K,n,n,n,m);
easybudda
Эксперт С++
 Аватар для easybudda
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
15.03.2011, 10:06     Не хочет работать Rand #6
C++
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
#include <iostream>
#include <cstdlib>
#include <ctime>
    
int ** new_matrix(int rows, int columns){
    int ** m = new int * [ rows ];
    for ( int i = 0; i < rows; ++i )
        m[i] = new int [ columns ];
    return m;
}
 
int ** fill_matrix(int ** m, int rows, int columns){
    for ( int i = 0; i < rows; ++i )
        for ( int j = 0; j < columns; ++j )
            m[i][j] = rand () % 10;
    return m;
}
 
int ** dump_matrix(int ** m, int rows, int columns){
    for ( int i = 0; i < rows; ++i )
        for ( int j = 0; j < columns; ++j )
            std::cout << m[i][j] << ( j < columns - 1 ? ' ' : '\n' );
    return m;
}
 
void delete_matrix(int ** m, int rows){
    for ( int i = 0; i < rows; ++i )
        delete [] m[i];
    delete [] m;
}
 
int main(){
    int r = 4, c = 5;
    
    srand(time(NULL));
    delete_matrix(dump_matrix(fill_matrix(new_matrix(r, c), r, c), r, c), r); // гы :)
    
    std::cout << std::endl;
    return 0;
}
sasha2x
0 / 0 / 0
Регистрация: 14.03.2011
Сообщений: 7
19.03.2011, 01:41  [ТС]     Не хочет работать Rand #7
Все всем огромное спасибо , разобрался и реализовал таким образом :
C++
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
 
using namespace std;
long ** date(long **mas, int x, int y){ //a)
        mas = new long* [x];
        for (int i = 0; i < x; i++) 
                mas[i] = new long [y];
        for(int i=0;i<x;i++)
          for(int j=0;j<y;j++)
              mas[i][j] = 0;
        return mas;
}
void ran(long **mas,int x,int y){ //b)
  for(int i=0; i<x; i++)
     for(int j=0; j<y;j++)
           mas[i][j]=rand()%100;
  }
void delet(long **&mas,int x,int y){//d)
        for (int i = 0; i < x; i++) 
      delete [](mas[i]);
 delete []mas;
 mas=0;
}
void print(long **mas,int x,int y){
       for(int i=0; i<x; i++){
             for(int j=0; j<y; j++)
           cout<<mas[i][j]<<"\t";
         cout<<endl;
}
}
 
 
long **sum(long **mas1,long **mas2,int x1,int y1,int x2,int y2){ //
if((x1!=x2)||(y1!=y2)){
        cout << "Error 403 :D,PA3MEPHOCTb MATRIXS HE BEPHA";
    return 0;}
    long **mas=NULL;
    mas=date(mas,x1,y1);
    for(int i=0;i<x1;i++)
   for(int j=0;j<y1;j++)
   mas[i][j] = mas1[i][j] + mas2[i][j];
  return mas;
}
long** p(long **mas1,long **mas2,int x1,int y1,int x2,int y2){
    if(y1!=x2){
     cout<<"Error 404 :D,PA3MEPHOCTb MATRIXS HE BEPHA";
     return 0;
    }
        long **mas=NULL;
        mas=date(mas,x1,y2);
     for(int i=0;i<x1;i++)
     for(int j=0;j<y2;j++) 
      for (int k=0;k<y1;k++) 
          mas[i][j]+=mas1[i][k]*mas2[k][j];
   
     return mas;
}
 
 
 
int main(){
        int n,m;
        long **A=NULL,**B =NULL,**C =NULL,**D =NULL,**E=NULL,**F=NULL,**G=NULL,**H=NULL,**I=NULL, **J = NULL;
        cout <<"Введите размерности для матриц:\n\t\t\t\tn=";  
        cin >> n;
        cout << "\t\t\t\tm=";
        cin >>m;
        cout << endl;
        A = date(A,n,m);
        B = date(B,m,n);
        C = date(C,n,n);
        D = date(D,n,m);
 
        ran(A,n,m);
        ran(B,m,n);
        ran(C,n,n);
        ran(D,n,m);
        cout<<endl<<endl<<"Input MATRIX"<<endl<<endl;
        print(A,n,m);
        cout<< endl<<endl;
        print(B,m,n);
        cout<<endl<<endl;
        print(C,n,n);
        cout<<endl<<endl;
        print(D,n,m);
        cout<<endl<<endl;
        
        cout<<endl<<endl<<"Output MATRIX :"<<endl<<endl;
        cout<<"\n A*B: \n";
        E = p(A,B,n,m,m,n);
        if(!E){
        cout << "Sorry, but the further calculations are not possible. We stop program work...";
        return -3;} 
        print(E,n,n);
        getch();
 
        cout<<"\n C*C: \n";
        F = p(C,C,n,n,n,n);
        if(!F){
        cout << "Sorry, but the further calculations are not possible. We stop program work...";
        return -4;} 
        print(F,n,n);
        getch();
        
        cout<<"\n A*B + C*C: \n";
        G = sum(E,F,n,n,n,n);
        if(!G){
        cout << "Sorry, but the further calculations are not possible. We stop program work...";
        return -5;} 
        print(G,n,n);
        getch();
 
        cout<<"\n A + D: \n";
        H = sum(A,D,n,m,n,m);
        if(!H){
        cout << "Sorry, but the further calculations are not possible. We stop program work...";
        return -6;} 
        print(H,n,m);
        getch();
        
        cout<<"\n (A*B + C*C)*(A + D): \n";
        I = p(G,H,n,n,n,m);
        if(!I){
        cout << "Sorry, but the further calculations are not possible. We stop program work...";
        return -7;} 
        print(I,n,m);
        getch();
        
    
        delet(A,n,m);
        delet(B,m,n);
        delet(C,n,n);
        delet(D,n,m);
        return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2011, 02:03     Не хочет работать Rand
Еще ссылки по теме:

Почему не хочет работать код? C++
C++ CopyFile не хочет работать с аргументами команды
C++ Макрос не хочет работать
Не хочет работать C++
C++ Программа не хочет работать с русскими буквами

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
19.03.2011, 02:03     Не хочет работать Rand #8
easybudda,

Не по теме:

C++
1
delete_matrix(dump_matrix(fill_matrix(new_matrix(r, c), r, c), r, c), r); // гы :)
Да, Вы, батенька, извращенец)))

Yandex
Объявления
19.03.2011, 02:03     Не хочет работать Rand
Ответ Создать тему
Опции темы

Текущее время: 06:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru