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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2013, 20:58   #1
Faton 11
Пользователь
 
Регистрация: 04.10.2011
Сообщений: 74
По умолчанию Переделать код

Добрый вечер! Нужно было числа от 0 до 32 распределить в случайном порядке. Для этого был создан генератор случайных неповторяющихся чисел. Как можно переделать этот код, не используя команду "goto loop"?

Код:
#include <stdafx.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <string>
#include <sstream>
#include <cmath>
#include <fstream>

using namespace std;

const int N=34;
int mas[N];
string mas2[N];
string mas3[N];
int a;

int main ()
{ 
 srand ( time(NULL) );
      for(int i=0;i<N;++i)
       {
          loop: a=rand()%33;
	            for(int l=0;l<i;l++)
                 {
                    if(mas[l]==a)
                     {
                       goto loop;
                     }
                    mas[i]=a;
                 }
	  }
system ("pause");
}
Faton 11 вне форума Ответить с цитированием
Старый 20.01.2013, 21:13   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

break вместо goto loop;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.01.2013, 21:31   #3
Faton 11
Пользователь
 
Регистрация: 04.10.2011
Сообщений: 74
По умолчанию

тогда сравнение происходит только с нулевым элементом массива и числа повторяются
Faton 11 вне форума Ответить с цитированием
Старый 20.01.2013, 22:36   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

код-то вообще плохой
Код:
for(int l=0;l<i;l++)
                 {
                    if(mas[l]==a)
                     {
                       goto loop;
                     }
                    mas[i]=a; //1
                 }
присваивание 1 выполнится столько раз, сколько в массиве элементов, не совпадающих с "а" стоит перед первым элементом, совпадающим с "а". Должно выполняться только 1 раз.
rrrFer вне форума Ответить с цитированием
Старый 20.01.2013, 22:40   #5
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Одного break здесь мало, т.к. goto loop здесь являются ещ одним циклом. Например так (можно и лучше написать):

Код:
for(int i=0;i<N;++i){
    bool q = true;
        while(q){
            q=false;
            a=rand()%33;
            for(int l=0;l<i;l++)
                if(mas[l]==a){
                    q=true;
                    break;				
                }		
	    if(!q)
                mas[i]=a; 
        }
 }
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...

Последний раз редактировалось sVasilich; 20.01.2013 в 22:44.
sVasilich вне форума Ответить с цитированием
Старый 20.01.2013, 22:42   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Код:
#include <iostream>
#include <stdlib.h>
#include <time.h>

int main() { 
  
  const int N=34;
  int mas[N];

  srand(time(NULL));
  for (int l, i = 0; i < N;) {
    mas[i] = rand() % N;
    for (l = 0; l < i; l++)
      if (mas[l] == mas[i])
	break;
    i += l == i;
  }
  
  for (int i = 0; i < N; ++i)
    std::cout << mas[i] << " ";
  
  return 0;
}
твой код чуть поправил
-----------
не проверял, возможны опечатки

Цитата:
Одного break здесь мало,
достаточно

тока это говнокод, алгоритм может очень долго работать. Лучше сгенерировать ряд чисел по порядку, а потом перемешать

Последний раз редактировалось rrrFer; 20.01.2013 в 22:45. Причина: добавил
rrrFer вне форума Ответить с цитированием
Старый 21.01.2013, 02:11   #7
Faton 11
Пользователь
 
Регистрация: 04.10.2011
Сообщений: 74
По умолчанию

Всем спасибо за ответы, с этими кодами все генерируется как надо!

Цитата:
Лучше сгенерировать ряд чисел по порядку, а потом перемешать
да, так действительно лучше =)

Последний раз редактировалось Faton 11; 21.01.2013 в 02:13.
Faton 11 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
переделать код на ассемблер skanku Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 18.07.2014 12:25
переделать код Frank63 Паскаль, Turbo Pascal, PascalABC.NET 1 05.11.2012 15:45
Переделать в код Delphi!! Настена290 Помощь студентам 2 01.02.2012 15:52
Не могу переделать код из С++ в Си FRATER1234 Общие вопросы C/C++ 11 02.11.2011 11:02
Переделать код Hepri Работа с сетью в Delphi 3 20.08.2009 20:28