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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2011, 11:01   #1
Azrieil
Пользователь
 
Регистрация: 18.12.2010
Сообщений: 15
По умолчанию rand тупит

...или я туплю
код
Код:
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
int main()
{
   int i,j,n,v=0,t,z;
   int z1=0,z2=1,z3;
   clrscr();
   printf ("Vvedite razmer matritci ");
        scanf ("%i", &n);
        int** arr;
        printf ("Kak zapolnaem matricu?\n0 - random( chisla s 1 do 9)\n1 - s klaviaturi\n");
        scanf ("%i", &v);
        srand (time(0));
        switch (v)
        {
        case 0:
                for (i=0; i<n; i++)
                        {
                        for (j=0; j<n; j++)
                                {
                                arr[i][j] = rand()%10+1;
                                }
                        break;
                        }
        case 1:
                for (i=0; i<n; i++)
                {
                        for (j=0; j<n; j++)
                        {
                                printf ("arr[%i][%i]= ", i+1, j+1);
                                scanf ("%i", &arr[i][j]);
                        }
                }

        }


   for (i=0; i<n; i++)
        {
                for (j=0; j<n; j++)
                {
                        printf ("%i ", arr[i][j]);
                }
                printf ("\n");
        }
  system("PAUSE");

  for (z=0;z<5;++z)
  {
  printf("Viberite nomer zadania:\n1.Summa elementov v neparnih stolbah\n2.Dobutok elementov v parnih strokah\n3.Minimalniy element glavnoi diagonali.");
  printf("\n\nDla vihoda iz programmu vvedite 4\n\n");
  scanf("%d", &z);
  if (z==1)
     {
     void p1( int**, int&, int, int, int);
     p1( arr, z1, i,n,j);
     printf ("Summa ravna %d.", z1);
     }
  if (z==2)
     {
     void p2( int**, int&, int, int, int);
     p2( arr, z2,i,n,j);
     printf ("Dobutok raven %d.", z2);
     }
  if (z==3)
     {
     void p3( int**, int&,int,int,int);
     p3( arr,z3,i,n,j);
     printf ("Minimalniy element, eto %d\n", z3);
     }
  if (z==4)
     {break;}
  if (z!=1 && z!=2 && z!=3 && z!=4)
     {printf("Nepravilniy nomer\n");z=0;}

  }
  return 0;
  }



  void p1(int** arr, int& z1, int i, int n, int j)
  {
  for (i=0;i<n;i++)
      {
                for (j=0;j<n;j++)
                {
                        if (j%2==0)
                        {z1=z1+arr[i][j];}
                }
      }


  }

  void p2(int** arr, int& z2, int i, int n, int j)
  {
    for (i=0;i<n;i++)
      {
                for (j=0;j<n;j++)
                {
                        if (i%2!=0)
                        {z2=z2*arr[i][j];}
                }
      }



  }

  void p3(int** arr, int& z3, int i, int n, int j)
  {
  z3=arr[0][0];
    for (i=0;i<n;i++)
    {
                for (j=0;j<n;++j)
                {
                        if (i==j && z3 > arr[i][j])
                        {z3=arr[i][j];}
                }

    }
  }
Все работает нормально, вот только функция рандом (main) заполняет 1-ую строку, и в итоге выходят матрицы типа
1 8 3
1 8 3
1 8 3
Azrieil вне форума Ответить с цитированием
Старый 30.05.2011, 11:03   #2
Azrieil
Пользователь
 
Регистрация: 18.12.2010
Сообщений: 15
По умолчанию

Код:
                for (i=0; i<n; i++)
                        {
                        for (j=0; j<n; j++)
                                {
                                arr[i][j] = rand()%10+1;
                                }
                        break;
                        }
В этом куске рандом. Вроде сделан правильно, и все же хз что
Azrieil вне форума Ответить с цитированием
Старый 30.05.2011, 11:18   #3
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Код:
   printf ("Vvedite razmer matritci ");
        scanf ("%i", &n);
        int** arr;
Динамические массивы так не объявляются...
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 30.05.2011, 11:24   #4
Azrieil
Пользователь
 
Регистрация: 18.12.2010
Сообщений: 15
По умолчанию

ЭТО причина проблемы, или так, к слову?
Azrieil вне форума Ответить с цитированием
Старый 30.05.2011, 11:29   #5
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
Сообщение от Azrieil Посмотреть сообщение
ЭТО причина проблемы, или так, к слову?
Ну, с утра в понедельник я других причин пока не углядел -)
Ты объявляешь указатель на указатель, но память для этого не выделяешь.
Попробуй выделить память для массива указателей.


Код:
        int** arr;
        arr=(int**)malloc(n * sizeof(int));
	for(int i = 0; i < n; i++)
		arr[i]=(int*)malloc(n * sizeof(int));
С выделением памяти все работает.
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062

Последний раз редактировалось Mandrivnyk; 30.05.2011 в 11:46.
Mandrivnyk вне форума Ответить с цитированием
Старый 30.05.2011, 11:56   #6
Azrieil
Пользователь
 
Регистрация: 18.12.2010
Сообщений: 15
По умолчанию

Рандом вроде починился...хотя что-то я накорявил в выделении памяти.
Теперь при компиляции из борланда программа xxx работает нормально, но когда запускаешь просто xxx.exe, вылетает...
Azrieil вне форума Ответить с цитированием
Старый 30.05.2011, 12:15   #7
Azrieil
Пользователь
 
Регистрация: 18.12.2010
Сообщений: 15
Хорошо

Цитата:
Сообщение от Mandrivnyk Посмотреть сообщение

Код:
        int** arr;
        arr=(int**)malloc(n * sizeof(int));
	for(int i = 0; i < n; i++)
		arr[i]=(int*)malloc(n * sizeof(int));
С выделением памяти все работает.
Не очень понимаю этого текста, но вроде работает. Спасибо
Azrieil вне форума Ответить с цитированием
Старый 31.05.2011, 10:35   #8
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
Не очень понимаю этого текста
malloc(x) выделяет x байт памяти и возвращает на них указатель
malloc(n*sizeof(int)) выделяет память под массив из n переменных типа int
у Вас двумерный массив; вы создаете массив из указателей, каждый из которых, в свою очередь, указатель на строку матрицы
да, и еще, вы же на с++ пишете? тогда можно так
Код:
int** arr;
arr=new int*[n];
for(int i = 0; i < n; i++)
	arr[i]=new int[n];
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
тупит оператива VVVadim Компьютерное железо 2 17.04.2011 18:27
тупит комп Gastrit Помощь студентам 3 06.11.2008 00:16
ТУПИТ BDS 2006 ! ПОМОГИТЕ ! UnD)eaD)Snake Софт 8 19.07.2007 23:48