Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Цикл For, Тип счётчиков в цикле For 
V
    Опции темы
Lion_Smith
Дата 16.7.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 14.3.2008

Репутация: нет
Всего: нет



Есть вот такой цикл:
Код

   for (int i =0,j =str.Length-1; i<j; i++,j--)
      if(str[i]!=str[j]) return(false);


А что мне сделать что бы переменная i была типа float, а переменная j типа int?? Или все инициализаторы в цикле For должны непременно быть одного типа? А если я например хочу использовать в качестве счётчиков две переменные разного типа int и string?
PM MAIL   Вверх
MasterOfCode
Дата 16.7.2008, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

Репутация: 2
Всего: 27



Что мешает непосредственно в теле цикла опреировать переменно типа float...


--------------------
user posted image
PM ICQ   Вверх
Lion_Smith
Дата 16.7.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 14.3.2008

Репутация: нет
Всего: нет



Ни чего! smile Вопрос то о другом! Можно ли использовать разнотипные перемеенные в качестве инициализаторов!? И если можно, то как их объявить? Я просто не нашёл ответа на свой вопрос, по этому на форуме и пишу!
PM MAIL   Вверх
QryStaL
Дата 16.7.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 10
Всего: 32



Код

int j = 10;
for (float i = 0; i < j; i++, j--)
{
}



--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
Ram1reS
Дата 16.7.2008, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 25.4.2008
Где: Москва

Репутация: 2
Всего: 5



Цитата(Lion_Smith @ 16.7.2008,  11:38)
Есть вот такой цикл:
Код

   for (int i =0,j =str.Length-1; i<j; i++,j--)
      if(str[i]!=str[j]) return(false);


А что мне сделать что бы переменная i была типа float, а переменная j типа int?? Или все инициализаторы в цикле For должны непременно быть одного типа? А если я например хочу использовать в качестве счётчиков две переменные разного типа int и string?

Хмм... видимо Вы неправильно понимаете как работает цикл For.

Код

for( инициализация счетчиков/условий ; условие продолжения цикла ; действие по окончании итерации цикла )
{
    // тело
}


т.е. можете оперировать чем угодно и как угодно, например:
Код

for (string s = String.Empty; s != "aaaa"; s += "a")
{
       // some work
}

--------------------
 
PM MAIL ICQ   Вверх
Lion_Smith
Дата 16.7.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 14.3.2008

Репутация: нет
Всего: нет



Хм.. 

Цитата


т.е. можете оперировать чем угодно и как угодно, например:Код
Код

for (string s = String.Empty; s != "aaaa"; s += "a")
{
       // some work
}





здесь в качестве инициализатора используется одна переменная типа string, а если я хочу использовать 2 переменные? Например одну s типа стринг, а другую i типа int?? Как их инициализировать в инициализаторе??

Такой код не подходит:

Цитата

Код

int j = 10;
for (float i = 0; i < j; i++, j--)
{
}



В данном случае переменная j не умрёт после того как цикл будет закончен, а нужно чтоб умерла.

Кроме того при компиляции выдало ошибку:
  Error    1    A local variable named 'j' cannot be declared in this scope because it would give a different meaning to 'j', which is already used in a 'child' scope to denote something else    C:\Documents and Settings\Rkuznetsov\My Documents\Visual Studio 2008\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs    95    23    WindowsFormsApplication1




Это сообщение отредактировал(а) Lion_Smith - 16.7.2008, 11:59
PM MAIL   Вверх
Ram1reS
Дата 16.7.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 25.4.2008
Где: Москва

Репутация: 2
Всего: 5



Вот вырезка из спецификации C# (8.8.3)
Цитата

The for-initializer, if present, consists of either a local-variable-declaration (§8.5.1) or a list of statement-expressions (§8.6) separated by commas. 


Соответвтенно объявить вы можете только одну переменную, а вот инициализировать уже объявленные сколько угодно через запятую.
--------------------
 
PM MAIL ICQ   Вверх
Lion_Smith
Дата 17.7.2008, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 14.3.2008

Репутация: нет
Всего: нет



Спецификация дело хорошее!  smile 

А на практике я имею примерно следующее! 
Вот синтаксис цикла for:
Цитата

for(инициализаторы; условие; список_выражений) оператор

Cколько раз будет выполнено тело этого цикла зависит от трех управляющих элементов, заданных в скобках:

1) Инициализаторы задают начальное значение одной или нескольких переменных, часто называемых счетчиками или просто переменными цикла.
2) Условие задает условие окончания цикла. Результатом вычисления условия должно быть значение true или false. Условие вычисляется на каждой итерации цикла. Если условие цикла истинно, то выполняется тело цикла, т.е. оператор. Как только условие становится ложным, цикл завершает свою работу.
3) После того как выполненно тело цикла, изменяются значения счетчиков и снова проверяется условие. Значения счётчиков (инициализаторов) изменяются в списке выражений, которые записываются через запятую.

С условием всё ясно. Это любое логическое выражение, оно одно его значения true или false. 
Со списком вырожений тоже всё понятно. Это просто блок выражений которые изменяют значения переменных, причём в этом блоке можно на ряду с инициализаторами использовать и ранее объявленные и инициализированные в коде переменные. Например:
Код

int str = 56;
string MyStr = "приветик";
for (int k = 0; k < str; k++, k++, k = MyStr.Length - 1)
 { k = k + 1; }

Из этого же примера видно, что значение счётчиков можно свободно использовать и в теле цикла.
Теперь обратим внимание на счётчики (инициализаторы). Это как минимум одна переменная любого типа срок жизни которой ограничен циклом. Тоесть переменная-инициализатор уничтожается как только цикл перестаёт работать, её значение теряется и показанный ниже код выдаст нам ошибку ещё на этапе компиляции, потому что к моменту str=k, переменая k уже будет уничтожена. В этом и есть прелесть использования инициализаторов.
Код

int str = 56;
string MyStr = "приветик";
for (int k = 0; k < str; k++, k++, k = MyStr.Length - 1)
 { k = k + 1; }
str=k;

Стоит отметить что иницализатор вовсе не обязательно вообще где бы то ни было использовать. Здесь мы создаём счётчик, но не где его не используем, по этому инициализировать, тоесть присваивать ему значение вовсе не обязательно:
Код

int str = 56;
for (int k; 0 < str; str = str - 1) { ; }

а если не создавать счётчик, а попытаться использовать уже существующую переменную str, то нам опять выдаст ошибку компиляции.

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

int str = 56;
for (int k, y, w; 0 < str; str = str - 1) { ; }

Все эти переменные создаются и существуют внутри цикла и у всех у них один тип. В данном случае это тип int.

Нельзя задать в качестве инициализаторов цикла две и более разнотипных переменых!!! Нельзя использовать в качестве инициализатора уже существующую переменную. Нельзя задать в области инициализации значение кукой-нибудь существующей переменной. Такой код выдаст ошибку:
Код

    str=32;
                for (int k, z=0, string w; 0 < str; str = str - 1) { ; }
                
                int z;
                for (int k, z=0,w; 0 < str; str = str - 1) { ; }
                
                int z=1;
                for (int k, z=0,w; 0 < str; str = str - 1) { ; }
                
За то, раз переменная k является инициализаторорм цикла, то мы можем использовать её вновь и вновь в нескольких циклах нашего кода подряд, всё равно по окончани каждого из этих циклов она будет уничтожена.

PS: это конечно всем известно, так что сорри за мой маленький  smile писал скорее для себя...

PM MAIL   Вверх
oleeg
Дата 17.7.2008, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 27.11.2006

Репутация: нет
Всего: нет



Так в чем проблема, можно использовать 2 цикла.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0517 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.