Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Dimka-novitsek
14 / 14 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
#1

Как скоротить, не обьявляя переменную? - C++

16.09.2013, 21:42. Просмотров 577. Ответов 17
Метки нет (Все метки)

Использование оператора безусловного перехода. К стати, я не вижу, как бы я вот написал то же самое биз него, так что зря его так критикуют.

В операторе иф ошибка. Я все же хотел как-нибудь выпиндреться и не обьявлять булеву переменную и вводить прямо в скобки ифа. Вот что я надумал

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
// Листинг 7.3.
 
 // Сложные условия в конструкциях while
 
 Boop: counter++; cout << "Enter a Bool number: "; if(  cin >>)return 0;// начало цикла
    unsigned short small;
 
    unsigned long large;
 
   const unsigned short MAXSMALL=65535;
 
 
 
   cout << "Enter a small number: ";
 
   cin >> small;
 
   cout << "Enter a large number: ";
 
  cin >> large;
 
 
 
   cout << "small: " << small << "...";
 
 
   // на каждой итерации проверяются три условия
 
   while (small < large && large > 0 && small < MAXSMALL)
 
      {
 
    if (small % 5000 == 0) // после каждых 5000 строк выводится точка
 
    cout << ".";
    small++;
    large-=2;
 
      }
 
 
 
   cout << "\nSmall: " << small << " Large: " << large << endl;
 
   goto Boop; // возвращение к началу
   system("pause");return 0;
 
 }
Как что-то подобное написать правильно?
http://www.cyberforum.ru/cpp-beginners/thread565807.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2013, 21:42
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как скоротить, не обьявляя переменную? (C++):

Процедура, записывающая в переменную X минимальное из значений X и Y, а в переменную Y – максимальное
Описать процедуру Minmax(X, Y), записывающую в переменную X минимальное из...

Как строковую переменную(String) сканвертировать в переменную типа(Real)
У меня есть Edit1.Text (строковая) а var x: Real каким образом мне...

Как передать из ACCESS переменную STRING в переменную окружения (типа CMD команды SET=)
Добрый день! Подскажите как установить переменную окружения из ACCESS....

Как задасть значение Textbox в переменную, а затем эту переменную вывести в другой форме
Приветствую Есть форма с полем, где есть значение, как значение этого поле...

Как передать переменную окна через текстовую переменную?
Открыл одно окно, потом второе, и хочу передать индетефикатор первого окна во...

17
ValeryS
Модератор
7127 / 5395 / 669
Регистрация: 14.02.2011
Сообщений: 18,212
16.09.2013, 21:46 #2
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
К стати, я не вижу, как бы я вот написал то же самое биз него, так что зря его так критикуют.
элементарно Ватсон
C++
1
2
3
4
5
6
//Boop: 
while(1)
{ counter++; cout << "Enter a Bool number: "; if(  cin >>)return 0;// начало цикла
........................................
 
 }// goto Boop; // возвращение к началу
видать не зря

Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
if( *cin >>)return 0;
что сие означает?
1
Dimka-novitsek
14 / 14 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
16.09.2013, 21:56  [ТС] #3
Спасибо!!!!!!


Означает выход из прграммы, по замыслу.
0
ValeryS
Модератор
7127 / 5395 / 669
Регистрация: 14.02.2011
Сообщений: 18,212
16.09.2013, 21:57 #4
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Означает выход из прграммы, по замыслу.
ну а по жизни?
1
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
16.09.2013, 21:59 #5
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
Использование оператора безусловного перехода. К стати, я не вижу, как бы я вот написал то же самое биз него, так что зря его так критикуют.
Dimka-novitsek, для вас авторитеты в программировании существуют, кроме Либерти? Вот что Прата пишет насчёт goto.
1
Миниатюры
Как скоротить, не обьявляя переменную?  
ValeryS
16.09.2013, 22:04
  #6

Не по теме:

alsav22,
я бы даже сказал не в большинстве,а всегда
за всю мою практику ни разу не использовал
разве что в начале, когда переходил с ассемблера, мышление было "спагетти" испорчено

1
Dimka-novitsek
14 / 14 / 2
Регистрация: 26.04.2012
Сообщений: 1,091
16.09.2013, 22:26  [ТС] #7
Да, спасибо!!

А вот как-то вставить булеву переменнуюв цикл, что-то пока не получается. Чтоб раз-она там, и не обьявлять ее.

С этим значком не плучается тоже, т.к. так if( *cin >>)return 0; получается error C2100: недопустимое косвенное обращение
0
ValeryS
Модератор
7127 / 5395 / 669
Регистрация: 14.02.2011
Сообщений: 18,212
16.09.2013, 22:32 #8
Цитата Сообщение от Dimka-novitsek Посмотреть сообщение
cin >>
ну дак данные с клавы заслать куда то надо
1
Tulosba
16.09.2013, 22:35
  #9

Не по теме:

ValeryS, ну для всяческих генераторов кода goto штука удобная.

1
ValeryS
Модератор
7127 / 5395 / 669
Регистрация: 14.02.2011
Сообщений: 18,212
16.09.2013, 22:42 #10
Цитата Сообщение от Tulosba Посмотреть сообщение
ValeryS, ну для всяческих генераторов кода goto штука удобная.
не спорю поскольку не работал
но вот разбиратся
я раньше мог написать так
C++
1
2
3
4
5
if(a==b)
 goto met;
fnc();
met:
return;
потом писал так
C++
1
2
3
4
if(a==b)
 return;
fnc();
return;
а сейчас могу написать так
C++
1
2
3
if(a!=b)
 fnc();
return;
и пока не встречал кода который нельзя переписать без гото
1
zer0mail
2451 / 2085 / 216
Регистрация: 03.07.2012
Сообщений: 7,566
Записей в блоге: 1
17.09.2013, 00:05 #11
Цитата Сообщение от ValeryS Посмотреть сообщение
и пока не встречал кода который нельзя переписать без гото
Можно-то можно, но не всегда нужно

Я делал расчеты, где штук 5 вложенных циклов. Каждый цикл на своем уровне проверяет некоторые условия и выход может произойти на цикл 2-3 уровнями выше (или вообще завершить все циклы). Как это просто сделать без goto (устанавливать различные флажки или есть другой способ)?
1
ValeryS
Модератор
7127 / 5395 / 669
Регистрация: 14.02.2011
Сообщений: 18,212
17.09.2013, 07:19 #12
Цитата Сообщение от zer0mail Посмотреть сообщение
Я делал расчеты, где штук 5 вложенных циклов. Каждый цикл на своем уровне проверяет некоторые условия и выход может произойти на цикл 2-3 уровнями выше (или вообще завершить все циклы). Как это просто сделать без goto (устанавливать различные флажки или есть другой способ)?
не понял
кто куда должен выйти?
кусочек кода, пожалуйста

Добавлено через 7 минут
ну вот пример
вместо
C++
1
2
3
4
5
6
for(i=0;i<10;i++)
  for(j=0;j<10;j++) 
     if(a==b)
        goto m1;
 
m1:
можно написать так
C++
1
2
3
4
5
6
7
fnc()
{
for(i=0;i<10;i++)
  for(j=0;j<10;j++) 
     if(a==b)
        return ;
}
или так
C++
1
2
3
4
5
6
7
8
9
for(i=0;i<10;i++)
  {
    for(j=0;j<10;j++) 
     { 
       if(a==b)
        break;
     }
    if(j<10)
       break;
или еще куча способов которые не нарушают модуль
0
zer0mail
2451 / 2085 / 216
Регистрация: 03.07.2012
Сообщений: 7,566
Записей в блоге: 1
17.09.2013, 10:13 #13
Цитата Сообщение от ValeryS Посмотреть сообщение
не понял кто куда должен выйти?кусочек кода, пожалуйста
или еще куча способов которые не нарушают модуль
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
fnc()
{
for(i=0;i<10;i++) {
    for(j=0;j<10;j++)  {
        for(k=0;k<10;k++) {
            for(m=0;m<10;m++)  {
                 if(x==y) goto m2;
                 if(x==z) goto m1;
                 for(m=0;m<10;m++)
                     if(a==b) goto m0;
                     if(a==c) goto m2;
                }
            }
        }
        {...}
        m2:
    }
    {...}
    m1: 
}
m0:
....
}
1
Croessmah
++Ͻ
14158 / 8083 / 1513
Регистрация: 27.09.2012
Сообщений: 19,920
Записей в блоге: 3
Завершенные тесты: 1
17.09.2013, 10:19 #14
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
/* Данный набор операторов if и goto есть семантический эквивалент
 * оператора switch (x) */
if (x == 10)
  goto L10;
else if (x == 11)
  goto L11;
else if (x == 12)
  goto L12;
else
  goto Ldefault;
{                        <--- скобка 1
L10:                     <--- метка "case 10"
  y = 1;
  goto Finish;           <--- break
L11:                     <--- метка "case 11"
L12:                     <--- метка "case 12"
  y = 2;
  /* goto Finish; */     <--- закомментированный break
Ldefault:                <--- метка "default"
  y = 3;
  goto Finish;           <--- break
}                        <--- скобка 2
Finish:                  <--- метка за пределами switch'а, куда ведут все break'и
                              эта метка полностью эквивалентна тому, что есть
                              в циклах for и while
Взято из блога пользователя Evg "Как работает оператор switch в Си/Си++ "

Очень наглядно, да?
1
ValeryS
Модератор
7127 / 5395 / 669
Регистрация: 14.02.2011
Сообщений: 18,212
17.09.2013, 10:36 #15
Цитата Сообщение от Croessmah Посмотреть сообщение
Взято из блога пользователя Evg
во первых он пишет не реальный код, а как это работает
во вторых это не всегда так
этот подход при сильно разреженном свитче
например такой код
C++
1
2
3
4
5
6
7
switch(m)
 {
   case 11: /* code 11*/ break;
   case 12: /*code12*/ break;
   case 13: /*code13*/ break;  
   default:  /*codeDefault*/
 }
превратится в ассемблере в такой код( чаще всего)
tabl:
offset code 11
offset code 12
offset codeDefault

1 вычесть из m 11
2 если меньше нуля и больше 2 то идти на codeDefault
3 полученное число умножить на размер адреса(чаще всего 4)
4 прибавить полученное число к адресу таблицы
5 по полученному адресу читать смешение
6 идти по полученному смещению

вечером скину дизасемблерный код (сейчас нет возможности)
а может и имитацию на Си засандалю
zer0mail, подумать надо, не готов так сходу
1
Croessmah
++Ͻ
14158 / 8083 / 1513
Регистрация: 27.09.2012
Сообщений: 19,920
Записей в блоге: 3
Завершенные тесты: 1
17.09.2013, 10:55 #16
Цитата Сообщение от ValeryS Посмотреть сообщение
во первых он пишет не реальный код, а как это работает
Да какая разница? Фрагмет приведен ради оценки читабельности
0
ValeryS
Модератор
7127 / 5395 / 669
Регистрация: 14.02.2011
Сообщений: 18,212
17.09.2013, 10:57 #17
Цитата Сообщение от Croessmah Посмотреть сообщение
Да какая разница?
скажи честно, ты сам будешь такой код писать
Цитата Сообщение от Croessmah Посмотреть сообщение
ради оценки читабельности
0
Croessmah
++Ͻ
14158 / 8083 / 1513
Регистрация: 27.09.2012
Сообщений: 19,920
Записей в блоге: 3
Завершенные тесты: 1
17.09.2013, 11:07 #18
Цитата Сообщение от ValeryS Посмотреть сообщение
скажи честно, ты сам будешь такой код писать
Конечно буду. Его разбор будет наказанием на том свете для программистов-грешников
1
17.09.2013, 11:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2013, 11:07
Привет! Вот еще темы с решениями:

Как вставить переменную java скрипт в php переменную
Здравия, форумчане! Извиняюсь за некорректность заголовка... Подскажите...

Как строковую переменную передать из TStringStream в переменную String?
Доброе время суток! Подскажите, как строковую переменную передать из...

Как новую переменную пронумеровать через другую переменную?
здравствуйте, уважаемые сижу вот голову ломаю над элементарщиной: q=1...

Как создать статическую переменную в Паскале? Переменную, которая сохраняет значение, при выходе из функции
Пробую так, но, естественно, ничего не получается: procedure a; var s :...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru