Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: непонятно как работает код  (Прочитано 17711 раз)
0 Пользователей и 1 Гость смотрят эту тему.
urus
Гость
« : 07-05-2004 23:50 » 

До недавнего дня думал что я хоть что-то знаю в VB , а теперь понял , что
ничего не понимаю . Столкнулся с таким необъяснимым (для меня) явлением
Пишу код :
'osch1 v 1 . 2 НАЗОВЁМ ЭТУ ЧАСТЬ КОДА А
If (e <> e1 Or e <> e2) And (f <> f1 Or f <> f2) _
And (g = g1 Or g = g2) And (h = h1 Or h = h2) Then
osch1.Text = "В 1-ом и 2-ом действии неверно записано само действие"
osch1.Visible = True
t1.BackColor = &HFF&
t2.BackColor = &HFF&
t3.BackColor = 14811134
t4.BackColor = 14811134
End If
'osch1 v1 ЭТУ Б
If (e <> e1 Or e <> e2) And (f = f1 Or f = f2) _
And (g = g1 Or g = g2) And (h = h1 Or h = h2) Then
osch1.Text = "В 1-ом действии неверно записано само действие"
osch1.Visible = True
t1.BackColor = &HFF&
t2.BackColor = 14811134
t3.BackColor = 14811134
t4.BackColor = 14811134
End If
'osch1 v2 ЭТУ Ц
If (e = e1 Or e = e2) And (f <> f1 Or f <> f2) _
And (g = g1 Or g = g2) And (h = h1 Or h = h2) Then
osch1.Text = "Во 2-ом действии неверно записано само действие"
osch1.Visible = True
t2.BackColor = &HFF&
t1.BackColor = 14811134
t3.BackColor = 14811134
t4.BackColor = 14811134
End If
'osch1 v3 ЭТУ Д
If (e = e1 Or e = e2) And (f = f1 Or f = f2) _
And (g <> g1 Or g <> g2) And (h = h1 Or h = h2) Then
osch1.Text = "В 3-ем действии неверно записано само действие"
osch1.Visible = True
t3.BackColor = &HFF&
t2.BackColor = 14811134
t1.BackColor = 14811134
t4.BackColor = 14811134
End If
'osch1 v4 ЭТУ Е
If (e = e1 Or e = e2) And (f = f1 Or f = f2) _
And (g = g1 Or g = g2) And (h <> h1 Or h <> h2) Then
osch1.Text = "В 4-ом действии неверно записано само действие"
osch1.Visible = True
t4.BackColor = &HFF&
t2.BackColor = 14811134
t3.BackColor = 14811134
t1.BackColor = 14811134
End If
 ТАК вот когда код записан в таком виде то всё работает как задуманно
но как только я сталю код А после кодов Б Ц Д Е , а не так как он записан
здесь перед Б Ц Д Е , то начинается геморой программа нехочет отображать
"ошибка в 1-ом действии" и "ошибка в 2-ом действии" даже если правильно
введено значения всёравно выдайтся сообщение " ошибка в 1-ом и 2-ом действии"
причём "ошибка в 3-ом действии" и "ошибка в 4-ом действии" отображает
правильно Если дописать ещё
'osch1 v 1 . 3
If (e <> e1 Or e <> e2) And (f = f1 Or f = f2) _
And (g <> g1 Or g <> g2) And (h = h1 Or h = h2) Then
osch1.Text = "В 1-ом и 3-em действии неверно записано само действие"
osch1.Visible = True
t1.BackColor = &HFF&
t3.BackColor = &HFF&
t2.BackColor = 14811134
t4.BackColor = 14811134
End If
 то куда его не ставь всёравно полная чехорда но разная в зависимости от того где
стоит код подскажите что я тут намудрил ?
Амне нужпо перебрать все возможные комбинации и после записи полного
кода у меня началась такая неразбериха что караул :oops:   Вот такой я вот
Записан
Dusk
Команда клуба

ru
Offline Offline
Пол: Мужской
Редкий, но веселый вид


« Ответ #1 : 08-05-2004 12:31 » 

urus,  так все правильно: вот смотри, в первоначальном варианте к примеру задано:
           e=e1, e<>e2
           f=f1, f<>f2
           g=g1, g<>g2
           h=h1, h<>h2
При таких начальных условиях при перестановках твой код будет работать по разному и всегда будет высвечиваться ошибка последней проверки, в первоначальном коде это будет "В 4-ом действии неверно записано само действие".
А работает это так: происходит первая проверка - ошибка есть - код отработал, вторая проверка - ошибка есть - код отработал, перезатерев работу предыдущего кода... и т.д. до последней проверки которую ты как раз и видишь...
Если ты переставишь код А в конец, то результат проверки Б и С ты никогда не увидишь, не успеешь, потому что проверка А - это общий случай Б и С, и проблема тут совершенно не Бейсике...


PS. Кстати, на твоем месте я бы написал процедуру, которая выводила бы сообщение об ошибке и устанавливала чвета, а проверке высывал бы ее передавая параметры - код был бы более компактен и легкочитаем.
Записан

Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших
Опыт - это то, что появляется сразу после того, как он был так необходим...
Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
Anonymous
Гость
« Ответ #2 : 08-05-2004 19:34 » 

 Так больше нельзя...   Вот такой я вот  :?:
Записан
urus
Гость
« Ответ #3 : 08-05-2004 19:36 » 

Жаль
Записан
urus
Гость
« Ответ #4 : 08-05-2004 19:38 » 

Всё , здаюсь . Видно самому мне дойти до этого не дано . Пршу помощи .
Нужно записать такую феньку . Сначало опишу в чём смысл .
Есть 4 текстовых поля для пальзователя и 8 полей visible=false
В скрытые поля заранее заложены правильные ответы , т.е если t1- поле
для пользователя то t1s1 i t1s2 скрытые поля с правильными ответами для
t1 также для t2- t2s1 i t2s2 , для t3-t3s1 i t3s2 и для t4-t4s1 и t4s2
Т.е для правильного ответа в t1 оно может принять значение только t1s1
или 1s2  а все другие ответы будут неверными. Ну тчно также и для t2 , t3 , t4
 Обозначим t1s1 i t1s2 как А , t2s1 и t2s2 как B , t3s1 i t3s2 как C и t4s1 и t4s2 как D ,
Так вот надо записать
 Если t1=А (а А для правильного ответа может равнятся либо t1s1 либо t1s2) и
t2=B (а B для правильного ответа может равнятся либо t2s1 либо t2s2) и
t3=C (а C для правильного ответа может равнятся либо t3s1 либо t3s2) и
t4=D (а D для правильного ответа может равнятся либо t4s1 либо t4s2) То
ошибка Фалсе
Цвет т1=белый
Цвет т1=белый
Цвет т1=белый
Цвет т1=белый  
Иначе
    Если t1<> A and t2=D and t3=C and t4=D Then
ошибка.Visible=true
ошибка.Text="Ошибка в 1 действии"
Цвет т1=белый
Цвет т1=белый
Цвет т1=белый
Цвет т1=белый
end if
    Если t1<> A and t2<>D and t3=C and t4=D Then
ошибка.Visible=true
ошибка.Text="Ошибка в 1 и 2 действии"
Цвет т1=белый
Цвет т1=белый
Цвет т1=белый
Цвет т1=белый
end if   и так все возможные варианты
В общем должно быть
Нажимаем на кнопку и если есть ошибки то должно указать
в каких действиях (допустим были в 1и 2 исправляем их и пусть опять ошиблись
в 1 действии , то при нажатии кнопки выдаётся сообщение что ошибка в 1
действии )
Вот такая примочка мне нужна КАК ЕЁ СДЕЛАТЬ
ВСЕМ СПАСИБО
Записан
Алёна
Молодой специалист

ru
Offline Offline
Блондинка...


WWW
« Ответ #5 : 09-05-2004 11:02 » 

:?: А обязательно проходить все этапы, а потом указывать пользователю, что он ошибся в первом действии.

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

Цитата

Цвет т1=белый
Цвет т1=белый
Цвет т1=белый
Цвет т1=белый


Лично мне не понятно что белает этот блок.
Записан

Стену можно пробить только головой. Все остальное орудия.
urus
Гость
« Ответ #6 : 09-05-2004 11:49 » 

Цвет т1=белый
Цвет т1=белый
Цвет т1=белый
Цвет т1=белый
на это можно не обращать внимания . Это я его по идиотски записал . скопировал и не исправил как надо , он нуженн
чтоб менять цвет , если поле заполнено правильно то поле белое если нет то красное
  Так в том и беда Алёнка , что когда поэтапно то никаких проблем , а нужно чтоб ошибки выдовались в конце . Ведь они могут быть не только в 1 но и во 2-ом или в 3-ем и 4-ом или в 2-ом и 4-ом действиях (если не общитался то тут 15 комбинаций)  Здесь была моя ладья...
Записан
Алёна
Молодой специалист

ru
Offline Offline
Блондинка...


WWW
« Ответ #7 : 09-05-2004 16:37 » 

Давай напишу тебе одну алгоритм для вовода сообщения об ошибке, правда как воплотить его в Basic не знаю.

Данные по правильным ответам храняться в массиве (таблице) где число столбцов равно количеству вариантов ответа в нашем случае два

Например в первой строке будет
Цитата

t1s1 либо t1s2


Во второй
Цитата

t2s1 либо t2s2


Число строк в массиве будет равняться количеству вопросов.
Всё это будет обрабатываться в цикле.

n - количество вопросов (верхняя граница массива)
u - ответ пользователя
array1 (2,n) - массив в котором храняться данные о правильных ответах
array2 (n) -  текст сообщения, в строки массива мы последовательно будем записывать есть или нет ошибки

For i=1 to n
If u = array1 (1,i) or (или) array1 (2,i) then  
array2 (n) = "действие "+ n + " правильное"
else
array2 (n) = действие "+ n + " неправильное"
EndIf
Конец цикла.

В результате у тебя получиться в массиве:
действие 1 правильное
действие 2 неправильное
действие 3 правильное
действие 3 правильное...........

А если хочешь сделать привязку к двум цветам можно сделать третьий массив array3 в котором будут храниться данные о цвете. И програмный код примет вид:

For i=1 to n

If u = array1 (1,i) or (или) array1 (2,i)

then  
array2 (n) = "действие "+ n + " правильное"
array3 (n) = 0           (белый цвет)

else
array2 (n) = действие "+ n + " неправильное"
array3 (n) = 1           (красный цвет)

EndIf
Конец цикла.


p.s. По моему это должно нормально перейти в програмный код.

p.p.s. Как правильно пишутся операторовы VB я не знаю, я рассматривала VBA последнее время (а до этого, когда-то QBasic  Вот такой я вот )
Записан

Стену можно пробить только головой. Все остальное орудия.
urus
Гость
« Ответ #8 : 10-05-2004 20:22 » 

:?: Алёнка , солнце , спасибо тебе за ответ . Я его как прочитал меня как осенило , сейчас
сижу и думаю почему раньше недошёл до этого .  Правда я код записал по другому , без
масива(я пока слабо предстовляю что это такое)но когда разберусь то попробую и твой вариант
Но тут у меня появился такой вопросик
Если я налету пишу переменную :
if t1=t1s1 or t1=t1s2 then
m=1
else
m=2
end if  Так вот какое будет m (я её нигде не объявлял , как в примере есть так m и записано)
т.е какой тип будет у m - строка . число или Variant  ?
Записан
Dusk
Команда клуба

ru
Offline Offline
Пол: Мужской
Редкий, но веселый вид


« Ответ #9 : 11-05-2004 08:32 » 

urus, самым простым способом было бы сделать так окрасить все поля в белый цвет. Протом проверить каждое поле на ошибку, и если она есть выкрасить это поле в красный цвет. После всех проверок, если есть ошибки, вывести сообщение типа "Существуют ошибки".

Есть более серьезный случай: проверяешь все варианты только, как я понял у тебя ошибка в поле тогда когда значение в нем не равно ни одному проверочному значению, условие (a<>a1 and a<>a2) а не  (a<>a1 or a<>a2).

И таких проверок будет 2^4 = 16...
Записан

Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших
Опыт - это то, что появляется сразу после того, как он был так необходим...
Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
Алёна
Молодой специалист

ru
Offline Offline
Блондинка...


WWW
« Ответ #10 : 11-05-2004 18:15 » 

Цитата

Так вот какое будет m я её нигде не объявлял


Так объяви , тип можешь выбрать произвольно.

Если выберешь Variant, исправь

Цитата

if t1=t1s1 or t1=t1s2 then
m=0
else
m=1
end if


А если что нибудь другое, как хочешь....

Только учти насколько удобно тебе будет обрабатывать m, определенного типа.
Записан

Стену можно пробить только головой. Все остальное орудия.
urus
Гость
« Ответ #11 : 25-05-2004 22:05 » 

:есть ли в ВБ6 что нибудь (даже не знаю что ) чтоб сравнивало текстовые поля
не в буквально а более-менее по смыслу ? подробнее это выглядит так:
В программе заложены простые задачи по математике за 3 класс и пользователь её должен
решить , но она проверяет ответы по 3 параметрам
правильность записи действий ; численные ответы в действиях И
Правильность записи коментария к действию , с первыми 2 проверками всё лады т.к там
цифры а вот коментарий к действию пишется текстом и тут начинаются проблемы
Я сразу заложил был 2 пра вильных ответа потом 4 но мелкая всёравно умудряется писать
коментарии мимо . Пример: залаживаю в программу правильный ответ
 "вес одного ящика груш"
 "весит один ящик груш"
 "вес ящика с грушами"
 "весит один ящик с грушами"
Мелкая пишет "вес одного ящика с грушами" или "весит ящик груш" получается
по смыслу ответ верный но программа выдаёт ошибку
так вот как можно придумать чтоб программа сверялаболее гибко чтоли ? или
ничего не сделаешь как только добавить ещё верных ответов новедь все
записать просто невозможно . Может есть способ сравнивать как-то по
другому ?roll:
Записан
Алёна
Молодой специалист

ru
Offline Offline
Блондинка...


WWW
« Ответ #12 : 26-05-2004 13:29 » 

Цитата

ответов но ведь все
записать просто невозможно


А ты попробуй сделать комбиницию из раскрывающихся списков и полей ввода и тд.

Например:

Цитата

вес

Забей в метку Label жестко, что бы пользователь не мог менять. НО т.к. у тебя несколько вопросов в Label  - значения считывай из какой то таблицы (массива).  ТТ.е: вес, длинна, ширина.

Цитата

одного  


поле для ввода количества ящиков 1,2,3....... если надо считать веса разного количества ящиков, Если надо считать вес одного ящика то в следующем пункте напиши "один ящик"
Цитата


ящика

 
Раскрывающийся список: ящик, коробка, мешок  (Но тут проблема в окончаниях)
Цитата

груш


Раскрывающийся список

Потом поле для ввода куда пользователь вносит вес ящика груш(или чего нибудь ещё)

А потом все полученное соедени в одну кучу (кроме последнего поля) и сравнивай с правильными ответами.

P/S/ Пожет это можно сделать по другому, не знаю.
Записан

Стену можно пробить только головой. Все остальное орудия.
Anonymous
Гость
« Ответ #13 : 16-06-2004 22:03 » 

:rolЧто- то совсем непонятное твориться и никак не могу понять что не
так . В общем на МДИформу ставлю Тулбар . К проекту подключаю
Microsoft Forms2.0 Objekt Librey.И вот тут начинается интересная вещ
Тулбар устонавливаю вертикально слева и когда устонавливаю на него
ну к примеру ToggleButton (именно он мне нужен ) из Microsoft Forms2.0 Objekt Librey
то кнопка невидна на тулбаре а только значки что она выделена и прописывается в коде
Запускаю проект на выполнение и возвращаюсь обратно и на тулбаре появляются кнопки
Если свойство тулбар Align ntgthm выставить из 3-vbAlignLeft в
1-vbAlignTop те поставить горизонтально то кнопки опять пропадают
и что не делай не пявляются . Снова ставлю тулбар вертикально и опять
кнопки становятся видны(свойства кнопок и бара не меняю всё визбле
труе и кода никакого нет )В овщем если в двух словах то элементы
из Microsoft Forms2.0 Objekt Librey ставятся как-то непонятно на
вертикальный тулбар и совсем не видимы на горизонтальном хотя в коде
прописаны Дальше больше если эти обьекты устонавливать  на Кулбар
то в режиме проектирования они отображаются как и положено но при
запуске проекта они невидны ( свойство стоит правильно Труе)
Вот такой коломбурполучается .Да все элементы что грузятся по умолчанию работают чётко
У меня Visual Basic 6.0
Это я что-то не так делаю или может бейсик дуркует Подскажите кто знает в чём тут дело
  И ещё такой вопрос ; как полоски Кулбара сделать пошире что-то я
устонавливаю ширину больше но всё остаётся на месте
l:
Записан
urus
Гость
« Ответ #14 : 16-06-2004 22:07 » new

Цитата: Anonymous
:l:
вроде входил а записался почемуто как гость мой вопрос чуть выше "Что- то совсем непонятное твориться и никак не могу понять что не так "
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines