Что нового

Использование "If", "Then", "Else"

Mark

Новичок
Сообщения
22
Репутация
1
Почему не работает такой кусок кода
Код:
$file = FileOpen("sample.txt", 0)
$iYes = 0
$iNo = 0

While 1
    $line = FileReadLine($file)
     If @error = -1 Then ExitLoop
    $stringLeft = StringLeft( $line, 2)
     if $stringLeft = "Да" then $iYes = $iYes + 1 else $iNo = $iNo + 1
Wend

MsgBox(0, "Записей 'Да':", $iYes)
MsgBox(0, "Записей 'Нет':", $iNo)

FileClose($file)


Если выкинуть
Код:
else $iNo = $iNo + 1
то работает, но естественно считает только первую переменную и чего компилятору не нравится сегмент else не пойму :wacko:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Mark [?]
и чего компилятору не нравится сегмент else не пойму
Синтаксис ему не нравится:

Код:
; ...
While 1
    $line = FileReadLine($file)
     If @error = -1 Then ExitLoop
    $stringLeft = StringLeft( $line, 2)
	If $stringLeft = "Да" Then 
		 $iYes = $iYes + 1 
	Else 
		 $iNo = $iNo + 1 
	EndIf
Wend
; ...

If...Then - Условное выполнение одиночного выражения.
Этот тип конструкции If используется для сокращения записи при условных выполнениях одиночных выражений и не требует указания EndIf.

Всё это есть в справке ;)
 

killbond

Осваивающий
Сообщения
96
Репутация
32
  • Не закрыл условный оператор
  • Не ввел счетчик строк
  • Конструкции if ... else ... endif лучше писать в несколько строк (личный опыт)
  • Код не учитывает того, что первые 2 символа могут быть пробелами

Все это исправлено в этой версии:
Код:
$file = FileOpen("sample.txt", 0)
$iYes = 0
$iNo = 0

$aValueOfStrings = StringSplit ( FileRead ( $file ), @CRLF)

For $iCounter = 1 to $aValueOfStrings [0]
    $line = FileReadLine($file, $iCounter)
		If @error = -1 Then ExitLoop
    $stringLeft = StringLeft( StringStripWS($line, 8), 2)
		if $stringLeft = "Да" then 
			$iYes += 1 
		else 
			$iNo += 1
		EndIf
Next

MsgBox(0, "Записей 'Да':", $iYes)
MsgBox(0, "Записей 'Нет':", $iNo)

FileClose($file)
 
Автор
M

Mark

Новичок
Сообщения
22
Репутация
1
Спасибо.
Справку читал. С EndIf у меня тоже на работало, как оказалось из-за того, что я писал и Then и Else в одну строку :D
Перепроверил только, что когда в строку ругается, когда раскидать по отдельным строчкам нормально.
Буду знать :-[



PS
* Не закрыл условный оператор
Это да...
* Не ввел счетчик строк
Код:
While 1
    $line = FileReadLine($file)
     If @error = -1 Then ExitLoop
....
Wend

Имхо, чем не счетчик?
* Конструкции if ... else ... endif лучше писать в несколько строк (личный опыт)
Иначе, как оказалось и не работает :D
* Код не учитывает того, что первые 2 символа могут быть пробелами
Файл генерирует альтернативная программа, смысла вставлять такие проверки нет, так как пробелов там не может быть в принципе.
 

killbond

Осваивающий
Сообщения
96
Репутация
32
Mark сказал(а):
* Не ввел счетчик строк
Код:
While 1
    $line = FileReadLine($file)
     If @error = -1 Then ExitLoop
....
Wend

Имхо, чем не счетчик?

Тоже вариант... я и не думал, что такая вариация возможна, извини... :-[ Но по мне, все-таки, привычней как я писал.
 
Автор
M

Mark

Новичок
Сообщения
22
Репутация
1
killbond сказал(а):
Тоже вариант... я и не думал, что такая вариация возможна, извини... :-[ Но по мне, все-таки, привычней как я писал.

Твой подсчет хуже тем, что для определения количества строк делается отдельный проход файла. Это не критично при маленьких файлах, а мне тут придется текстовые файлы минимум по 20-30 метров (50000+ строк) парсить, каждый лишний проход это время :smile:

Те в идеале, кучей этих Else, ElseIf я хочу пропарсить за один проход эту громадину.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Mark [?]
* Конструкции if ... else ... endif лучше писать в несколько строк (личный опыт)
Иначе, как оказалось и не работает
А что, раньше работало? :smile:
Не как оказалось, а потому что у вас второй IF не: " Условное выполнение одиночного выражения " и требуется Else следовательно у вас конструкция IF ... Then ... Else ... EndIf а её в сокращённой форме писать нельзя, требуется перенос на новую строку.
 
Автор
M

Mark

Новичок
Сообщения
22
Репутация
1
Garrett сказал(а):
Mark [?]
* Конструкции if ... else ... endif лучше писать в несколько строк (личный опыт)
Иначе, как оказалось и не работает
А что, раньше работало? :smile:
Не как оказалось, а потому что у вас второй IF не: " Условное выполнение одиночного выражения " и требуется Else следовательно у вас конструкция IF ... Then ... Else ... EndIf а её в сокращённой форме писать нельзя, требуется перенос на новую строку.

А теперь посмотрим название раздела.
"Для новичков" - лично мне не было понятно, что писать нужно обязательно на разных строках. Так как пользуюсь If... Else второй раз и ни разу не использовал вот таких вот каскадных условных выборок. Теперь понятно. Спасибо, помогли :beer:
 

killbond

Осваивающий
Сообщения
96
Репутация
32
Garrett сказал(а):
Mark [?]
* Конструкции if ... else ... endif лучше писать в несколько строк (личный опыт)
Иначе, как оказалось и не работает
А что, раньше работало? :smile:
Не как оказалось, а потому что у вас второй IF не: " Условное выполнение одиночного выражения " и требуется Else следовательно у вас конструкция IF ... Then ... Else ... EndIf а её в сокращённой форме писать нельзя, требуется перенос на новую строку.

Хм... мне это говорит о том, что я невнимательно читаю хелп, за эту заметку вам спасибо.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Кстати, вопреки логике, многострочные конструкции в AutoIt выполняются быстрее ~35% (по крайней мере на моей машине).

Код:
$Timer = TimerInit()
$Count = 0
For $i = 1 To 500000
	If $i > 0 Then $Count += 1
Next
ConsoleWrite(TimerDiff($Timer) & @CR)

$Timer = TimerInit()
$Count = 0
For $i = 1 To 500000
	If $i > 0 Then
		$Count += 1
	EndIf
Next
ConsoleWrite(TimerDiff($Timer) & @CR)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Re: Использование \"If\", \"Then\", \"Else\"

Ха! На самом деле!
Выходит что сокращённая форма записи для IF, сокращает только количество строк в коде, в ущерб скорости.
Интересно с чем это связано?


Добавлено:
Сообщение автоматически объединено:

Mark
Ничего личного.
Просто я заметил, что вы не поняли до конца всей сути, вот и акцентировал ваше внимание. ;)

killbond
Не за что. Рад помочь.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: Использование \"If\", \"Then\", \"Else\"

killbond [?]
я и не думал, что такая вариация возможна
Значит срочно в справку, там много есть чего многие не знали :laugh:


Добавлено:
Сообщение автоматически объединено:

OffTopic:
Yashied [?]
многострочные конструкции в AutoIt выполняются быстрее
Где то мы с тобой это уже обсуждали, только немогу найти где...
 

SyDr

Сидра
Сообщения
651
Репутация
158
Yashied [?]
Кстати, вопреки логике, многострочные конструкции в AutoIt выполняются быстрее ~35% (по крайней мере на моей машине).
Ну ведь не обязательно вопреки логике. Язык ведь интерпретируемый. Получается, что во время выполнения проще обработать три простых строки, чем одну сложную.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Скорее всего так оно и есть. Лично я никогда не писал и не пишу в одну строку.
 

akoulev

Новичок
Сообщения
169
Репутация
2
SyDr сказал(а):
...во время выполнения проще обработать три простых строки, чем одну сложную.
Это - человеческая логика. А "бездушный автомат" ;) или:
- выполняет три строки;
или же
- сперва преобразует длинную строку во всё те же самые три строки (на что требуется время, время преобразования), после чего - выполняет оные три строки.
По-моему, так. (с) Милн.
 
Верх