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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 3 4 [5]   Вниз
  Печать  
Автор Тема: Прошу помощи в написании формы записи на приём  (Прочитано 72902 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Kaspiy
Участник

ua
Offline Offline

« Ответ #120 : 22-02-2014 17:32 » 

Код:
=3
не нужно.  Вместо 3 должно быть состояние таймера.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #121 : 22-02-2014 17:54 » 

Kaspiy, да. Но главное это декларация переменной через ключевое слово var. Лишнее - это if снизу и число 3.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Kaspiy
Участник

ua
Offline Offline

« Ответ #122 : 22-02-2014 19:54 » 

Код:
<html> 
<head>
<script type="text/javascript">
function startTime() // запуск таймера
{
var x = startTime; // переменной задал значение
var tm= new Date();
var h=tm.getHours(); // выводим часы
var m=tm.getMinutes(); // выводим минуты
var s=tm.getSeconds(); // выводим секунды
m=checkTime(m); //проверяем минуты
s=checkTime(s); // проверяем секунды
document.getElementById('txt').innerHTML=h+":"+m+":"+s; //назначаем ИД элемента, показ времени.
t=setTimeout('startTime()',500);


}
function checkTime(i) // методы проверки времени
{
if (i<10)
{
i="0" + i;
}
return i;
}

function OnClick() {  // то, что у меня не работает. Остановка по клику.
    if (x == startTime){
stopTime();
} else {
startTime();
}
state = !state;
}
</script>
<style type="text/css">
}
body{
background:white;
}
div{
font-size:300%;
}
</style>
</head>
<body  onload="startTime()"> <!--При загрузке старницы запускаем таймер -->
<getElementById onmouseover="body.style.background = '#FFCC66'" onmouseout="body.style.background = 'white'"  id="txt"></getElementByID>
<body>
</html>

Пробовал с переменной. У меня не получается =((
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #123 : 22-02-2014 20:47 » 

Kaspiy, что не получается?

Тут две проблемы:

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

2) Непонятно, как ты это проверяешь и как доводишь до рабочего состояния. Смотрел ли видеоролик по технике отладки программы в браузере? Как пошагово выполнять код, что такое "точка останова" (breakpoint). Потому что часть проблем без этого просто невозможно "осилить".

Итак, по поводу синтаксиса. Есть ещё такое понятие "область видимости". Коротко правило звучит следующим образом: какие переменные объявлены внутри функции, те не видны снаружи этой функции.

Т.е. у тебя в коде сейчас:
Код: (Javascript)
function startTime() // запуск таймера
{
var x = startTime; // переменной задал значение
допустим, но
Код: (Javascript)
function OnClick() {  // то, что у меня не работает. Остановка по клику.
    if (x == startTime){
Это совсем другая функция. Тот верхний x - это внутри функции startTime внутренняя переменная. Этот нижний x - внутри функции OnClick внутренняя переменная. Они называются одинаково, но это разные переменные. Каждая из них не видна в другом месте - за пределами функций.

Переменная должна быть глобальной - за пределами всех функций, которые её используют. Но это не значит, что её можно влепить куда угодно.

Уровни видимости переменных на примере:
Код: (HTML)
<script type="text/javascript">
        var x = 1; // Глобальная переменная
        alert("Global " + String(x));
       
        (function() {
                alert("Into function global " + String(x)); // Глобальная переменная видна внутри функции        
        })();
       
        function f() {
                alert("Into f before " + String(x)); // Глобальная переменная не видна здесь,
                // потому что она перекрыта внутренней переменной с таким же именем
                var x = 2; // Локальная переменная внутри функции
                // Это новая переменная с тем же названием "перекрывает" глобальную,
                alert("Into f after " + String(x)); // Локальная переменная видна внутри функции
        }
       
        f(); // Вызвали функцию, там была локальная переменная x.
        alert("After f global " + String(x)); // Глобальная переменная не "испортилась" от вызова функции.
        // это были разные переменные.
                       
        function u() {
                var z = 3; // Локальная переменная внутри функции попадает в замыкание для всех вложенных функций
                function v() {
                        return z; // Для функции v переменная как глобальная, но для функции u она остаётся локальной
                }
                return v;
        }
       
        var w = u(); // Вызвали u, там была локальная переменная. Но раз мы помним внутри w внутреннюю функцию
        // из u, значит локальная переменная u тоже запомнилась в замыкании,
        alert("Closure 1 " + String(w())); // и мы её видим при каждом запуске функции
        alert("Closure 2 " + String(w())); // это там внутри одна и та же переменная.
</script>
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #124 : 22-02-2014 21:00 » 

МАТЬ-матьматьмать

Форматируй код...
Не жалей пробелов и табов

покажи мне в спецификации html  элемент getElementById
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #125 : 22-02-2014 21:03 » 

Dimka, вторая проблема с синтаксисом - это непонимание, что ты пишешь.

Вот почему ты x сравниваешь с startTime? Ну то есть так в общем-то можно: x содержит либо функцию startTime, либо ничего. Но ни один программист в этой задаче так делать не станет. У меня ощущение, что ты не очень-то понимаешь, что куда и зачем присваивать.

Затем, ты вставил переменную x, но как было, оставил строчку
Код: (Javascript)
        state = !state;
А что такое тогда здесь state? Т.е. весь алгоритм целиком теряет смысл, если ты смотришь одну переменную - x, а сохраняешь значение совсем другой переменной state, никак с x не связанной. В чём логика?

Пока складывается впечатление, что сам алгоритм в коде "ускользает" от твоего внимания. Но в то же время ты вроде бы (сам?) написал алгоритм обработки даты и построения текста для часов. Это странно и непонятно. Как в фильме "Джентльмены удачи" было: "Так не бывает: тут помню - тут не помню." Улыбаюсь

Второй раз повторяю: давай ты каждую (!) строчку кода прокомментируешь. Напишешь словами, что в ней делается, какая переменная используется, какой смысл этой переменной, ради чего она тут в этой строчке нужна, что в переменной содержится. Вот как у тебя про дату прокомментировано - точно так же везде, но ещё подробнее. Если это управляющая конструкция (условие, цикл), то опять же словами описываешь смысл.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Kaspiy
Участник

ua
Offline Offline

« Ответ #126 : 23-02-2014 00:15 » 

Код: (Javascript)
<html>

<head>

<script type="text/javascript">

function stopTime() {      // остановка таймера
var y;  //назначил переменную для stopTime
}

function startTime()   // запуск таймера
{
var x;          // назначил переменную для startTime
       
var tm= new Date();    

var h=tm.getHours();   // выводим часы

var m=tm.getMinutes();   // выводим минуты

var s=tm.getSeconds();   // выводим секунды

m=checkTime(m);          //проверяем минуты

s=checkTime(s);          // проверяем секунды

document.getElementById('txt').innerHTML=h+":"+m+":"+s;           //назначаем ИД элемента, показ времени.

t=setTimeout('startTime()',1000);        // время обновляется каждую секунду (1000 миллисекунд)


}
function checkTime(i)    // методы проверки времени
{

if (i<10)        // если одно из значений (секунды, минуты, часы) меньше 10,
{

i="0" + i;        // то к нему спереди преписывается 0 (ноль)
}

return i;         // возвращается занчение i,если i<10
}

function OnClick() {       // Функция OnClick, содержащая условия выполнениях остановки/ запуска таймера при определенных условиях.
   
        if (!x) // если время идет
        {    
       
        stopTime();     // останавливаем время
       
        }
        else     // в другом случае
        {                
         
        startTime();      // запускаем время
       
        }
        state = !x;      // сохраняем,запомниаем состояние
}

</script>

</head>

<body  onload="startTime()"> <!--При загрузке старницы запускаем таймер -->

<element onClick="stopTime()"  onmouseover="body.style.background = '#EEE8AA'"  onmouseout="body.style.background = 'white'"  id="txt"></element> <!--к элементу
                                                                                                                                                                                                                                                        с ИД "txt" применяются действия -->

<body>

</html>
 

 С ума сойти... Здесь была моя ладья...
« Последнее редактирование: 23-02-2014 00:29 от Kaspiy » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #127 : 23-02-2014 00:32 » 

покажи мне в спецификации html  элемент element

Где форматирование кода?

Dimka! Я тебя прошу... Пока не исправится  не надо ничего говорить
« Последнее редактирование: 23-02-2014 00:34 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Kaspiy
Участник

ua
Offline Offline

« Ответ #128 : 23-02-2014 00:53 » 

покажи мне в спецификации html  элемент element

Где форматирование кода?

Dimka! Я тебя прошу... Пока не исправится  не надо ничего говорить


Да попытался же отформатировать код. Что в нем такого "страшного"?
Если я пишу <p> или <div>, то ничего не работает так, как должно.
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #129 : 23-02-2014 00:59 » 

Где здесь форматирование.
Код:
function startTime()   // запуск таймера
{
var x;          // назначил переменную для startTime
      
var tm= new Date();    

var h=tm.getHours();   // выводим часы

var m=tm.getMinutes();   // выводим минуты

var s=tm.getSeconds();   // выводим секунды

m=checkTime(m);          //проверяем минуты

s=checkTime(s);          // проверяем секунды

document.getElementById('txt').innerHTML=h+":"+m+":"+s;           //назначаем ИД элемента, показ времени.

t=setTimeout('startTime()',1000);        // время обновляется каждую секунду (1000 миллисекунд)


Это форматирование?


}

Цитата
Если я пишу <p> или <div>, то ничего не работает так, как должно.
Потому и не работает, потому что...
Не работает... а я не вижу код

зы - у меня работает.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Kaspiy
Участник

ua
Offline Offline

« Ответ #130 : 23-02-2014 01:11 » 

Цитата
Если я пишу <p> или <div>, то ничего не работает так, как должно.
Потому и не работает, потому что...
Не работает... а я не вижу код

зы - у меня работает.
При наведении курсора на часы меняется фон? А при наведении на строку с часами?)

зы - что мне сделать с этим кодом,чтобы он был "красивым"? сделал же отступы, что там еще запилить?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #131 : 23-02-2014 08:24 » 

Kaspiy, форматирование - это не столько отступы между строчками, сколько отступы слева. Ну у меня же масса кода написана. Ты же видишь, что он написан "лесенкой": какие-то строчки сдвинуты вправо пробелами сильнее, чем другие? Если ты не понимаешь этого, ты спросил "почему так?" Не спросил. А это и есть форматирование. Как оно делается? Любая управляющая конструкция (function, if, for, while, switch, with и т.д.) может содержать в себе код - этот код "глубже" задвигается, чтобы видеть, где начало, а где конец конструкции.

Дальше, если ты добавляешь div, и не работает, это не значит, что div неправильный, и его надо менять на что попало. Причина ошибки может быть в другом, и как раз её надо найти. Ты не ответил на вопрос: смотрел ли ты ролики, как работать с отладчиком, и пробовал ли отлаживать сам? Ты хотя бы список ошибок и замечаний от браузера на свой код видел? Игра в "угадайку" - это очень нудное, трудоёмкое и бессмысленное занятие. К сожалению, мы тут ею и занимаемся.

Молодец, что прокомментировал строчки. Давай посмотрим:
Код: (Javascript)
function stopTime() {      // остановка таймера
var y;  //назначил переменную для stopTime
}
Почему Sla требует форматирования? Где начало, где конец функции, что внутри, что снаружи функции? Вот непонятно, ты это видишь или не видишь? Было бы форматирование, было бы понятно, что и как ты видишь.

Я скопировал твою функцию от начала и до конца. Поясни её смысл. Что она должна делать по замыслу? Что она делает на самом деле?

Не очень понятно, почему после моего примера у тебя стали массово появляться тут и там переменные x, y и т.д. Мой пример был - пример конструкций: их синтаксис - форма записи, и семантика - какой смысл имеет область видимости. Этот мой пример вообще ничего не делает полезного. Ты же его воспринял как нечто, что можно взять и скопировать себе. А зачем? Программирование - это ж не шаманство: взять кусочек, вставить себе, и ура - получилось. Это написание осмысленного кода. Если ты берёшь чужой код, значит ты его прочитал так, будто написал сам, убедился, что он в точности делает то, что нужно, и только потом вставил себе.

Согласен со Sla - не будем двигаться вперёд, пока не разберёмся с имеющимся. А то информации много, и на пользу это пока не идёт.

Итак, во-первых, отформатируй код, во-вторых, в коде в комментариях поясни не фразой "остановка таймера", а опиши всю синтаксическую конструкцию: как она называется, какой у неё идентификатор (если есть), как вычисляется выражение (если есть выражение) - каждую скобку, каждую запятую, потому что в языке у них есть конкретный смысл, и этот смысл ты должен знать так хорошо, что ночью тебя разбуди - ты сразу сможешь объяснить.

Например:
Код: (Javascript)
function stopTime() { // Объявлена функция stopTime, эта функция предназначена для остановки таймера, функция начинается
    var y;  // Объявлена переменная y, локальная для функции stopTime, смысла никакого не несёт
} // Закончилась функция stopTime
И сразу видно, какая написана бессмыслица: действия никакого нет, зачем туда "впендюрена" y - непонятно, мысль автора остаётся туманной и загадочной для читателя.

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

Как читаются синтаксические конструкции. Разберём по шагам "под микроскопом", что называется. Отсюда же будет видно, что форматировать.

Вычленяем из текста ключевые значки:
Код: (Javascript)
function ()
Значит это место - объявление функции.

Затем ищем идентификатор - как функция называется в коде:
Код: (Javascript)
function checkTime()
понимаем, что функция называется checkTime. Т.е. объявлена функция checkTime.

Дальше смотрим, есть ли у неё параметры:
Код: (Javascript)
function checkTime(i)
Видим параметр i. Т.е. объявлена функция checkTime с параметром i. Всё это вместе называется "заголовок функции".

У любой функции помимо заголовка есть тело. Тело записывается внутри фигурных скобок:
Код: (Javascript)
function checkTime(i) {
}
Вот видим объявление функции checkTime, с параметром i, состоящей из заголовка и тела функции.

Всё, что внутри тела функции - записывается с отступом. Там должны следовать операторы один за другим последовательно.

Какой первый оператор внутри функции? Видим ключевое слово if, за ним скрывается условная конструкция. Любая условная конструкция может быть сокращённого вида
Код: (Javascript)
if() ;
а может быть полного вида:
Код: (Javascript)
if() ; else ;
Полный вид отличается от сокращённого наличием слова else. Есть у нас после if слово else внутри checkTime - нету, значит конструкция сокращённая. Итак функция с первым её оператором:
Код: (Javascript)
function checkTime(i) {
    if() ;
}

Условие строится таким образом, что внутри круглых скобок должно стоять вычисляемое выражение, которое даёт ответ "истина" или "ложь". Что это за выражение?
Код: (Javascript)
function checkTime(i) {
    if( < ) ;
}
Это двуместный оператор сравнения "<" - "меньше", означающий, что результат подвыражения слева должен быть меньше результата подвыражения справа. Оба результата подвыражений должны быть одного типа, и должны быть либо числами, либо строками.

В нашем случае в левом подвыражении находится переменная i, т.е. смотрится, что внутри неё записано,
Код: (Javascript)
function checkTime(i) {
    if(i < ) ;
}
а в правом подвыражении константа 10 - число.
Код: (Javascript)
function checkTime(i) {
    if(i < 10) ;
}
Раз 10 - число, значит и внутри i предполагается число. В итоге смысл выражения такой: "числовое значение переменной i меньше числа 10?". На это можно ответить "да" или "нет" - как раз подходит для if.

В итоге объявлена функция checkTime, с параметром i, внутри функции первым делом проверяется условие, является ли числовое значение параметра i меньше числа 10.

После круглых скобок оператора if должен следовать оператор, содержащий код, выполняющийся только при "срабатывании" условия. Что это в нашем случае за оператор такой? А это оператор блока кода - фигурные скобки "{" и "}". Точно такой же, как у тела функции. Он позволяет внутри себя включать несколько последовательных операторов.
Код: (Javascript)
function checkTime(i) {
    if(i < 10) {
    }
}

Что внутри блока кода, исполняемого по условию? А там оператор присваивания. И раз он внутри, мы его опять записываем с отступом:
Код: (Javascript)
function checkTime(i) {
    if(i < 10) {
        = ;
    }
}
Это тоже двуместный оператор, слева от него должна быть обязательно переменная, а справа любое вычисляемое выражение. Какая у нас переменная слева? А это всё тот же параметр i.
Код: (Javascript)
function checkTime(i) {
    if(i < 10) {
        i = ;
    }
}
Справа мы видим сложное выражение. Такие выражения мы можем помещать в оператор круглые скобки "(" и ")", чтобы чётко видеть границы составных частей выражения и понимать порядок их выполнения:
Код: (Javascript)
function checkTime(i) {
    if(i < 10) {
        i = ();
    }
}

Внутри сложного выражения мы находим оператор "+" - тоже двуместный, означающий либо сложение чисел, либо сцепление (конкатенацию) строк.
Код: (Javascript)
function checkTime(i) {
    if(i < 10) {
        i = ( + );
    }
}
Слева и справа от оператора "+" могут быть подвыражения, и они должны иметь общий тип: либо оба быть строками, либо оба быть числами. Слева у нас строковая константа "0":
Код: (Javascript)
function checkTime(i) {
    if(i < 10) {
        i = ("0" + );
    }
}
Значит справа тоже должно быть строковое выражение. А что мы там видим? А мы там видим всё тот же пераметр i функции, значение которого и берётся.
Код: (Javascript)
function checkTime(i) {
    if(i < 10) {
        i = ("0" + i);
    }
}
Ну и поскольку это достаточно простое выражение, то круглые скобки тут необязательны при записи:
Код: (Javascript)
function checkTime(i) {
    if(i < 10) {
        i = "0" + i;
    }
}
Больше в функции ничего нет.

Kaspiy, твоя задача научиться видеть код вот так вот подробно, в уме уметь проговорить "прочитать" любую конструкцию, задумываться над каждой буковкой.

Теперь критически посмотрим на эту функцию и на логику её работы:

1) Внутри условия мы выяснили, что i должно быть обязательно числом, а внутри оператора "+" та же самая i должна быть непременно строкой. Как же это работает? А так, что преобразование типа делается неявно. И это - не очень-то хорошее дело, это то, что программист фактически упустил из виду. Тогда уж лучше явно указывать типы выражений и преобразования:
Код: (Javascript)
function checkTime(i) {
    if(Number(i) < 10) {
        i = "0" + String(i);
    }
}
Никаких "подразумевается".

2) Ещё интересно, что функция не возвращает никакого результата, однако в том месте, где функция используется, явным образом от неё ожидается результат, например:
Код: (Javascript)
m=checkTime(m);          //проверяем минуты
Что будет записано в переменную m в операторе присваивания? Результат функции checkTime. А где внутри функции checkTime возвращается результат? Нигде. Как же это работает? А так, что последнее упомянутое выражение "неявно" считается результатом. Опять программист не контролирует, что происходит. Никаких "неявно", никаких "подразумевается" - должны вернуть результат:
Код: (Javascript)
function checkTime(i) {
    if(Number(i) < 10) {
        i = "0" + String(i);
    }
    return i;
}
Это делает оператор return. Он завершает работу функции (т.е. весь код внутри блока после return не работает), и возвращает результат функции - его можно использовать снаружи в выражениях и для присваивания.

3) Внутри функции параметр i не только читается, но и переписывается. Это выходит так, что в месте вызова функции должна находиться переменная, передаваемая по ссылке, и запрещены любые вычисляемые выражения, иначе результат всей работы просто пропадёт. Или, наоборот, если вместо выражения подставить переменную, эта переменная на вызывающей стороне изменится. Это подход вредный и опасный, потому что использующий функцию программист никак такого "подвоха" не ожидает. С этим явлением надо бороться. Борются с ним с помощью внутренней локальной переменной, куда один раз копируется значение параметра. Дальше параметр сам по себе, а с внутренней переменной можно делать что угодно - она никому снаружи не видна и не интересна.
Код: (Javascript)
function checkTime(i) {
    var r = i;
    if(Number(r) < 10) {
        r = "0" + String(r);
    }
    return r;
}

4) Задумчивость вызывает сравнение i < 10. Т.е. если i = 3, то результат будет "03" - хорошо. Но если i = -33, то результат будет "0-33" - а оно нам надо? Это получается, что опять неявно, опять предполагается, что функция получит в качестве i только положительные числа, да ещё и, похоже, целые. Ни с дробными, ни с отрицательными, ни с нечислами никакой внятной работы функции не будет. Гораздо правильнее будет  работать со строчкой, в которой гарантированно находится число, гарантированно целое и положительное, и гарантировано в 1 цифру. Как этого достичь? Например, так:
Код: (Javascript)
function checkTime(i) {
    var r = String(Number(i));
    if(r.length == 1) {
        r = "0" + r;
    }
    return r;
}
Сначала мы преобразуем значение параметра i в число, чтобы это было гарантированно число. Если параметр содержит что-то, что в число не преобразуется, будет число NaN. Затем мы сразу же это число преобразуем в строчку. Что получается? Если это число не целое, там заведомо будет десятичная точка или запятая, - т.е. длина строчки заведомо больше 1, если это отрицательное число, там будет минус, и опять длина заведомо больше 1, если там будет NaN, длина этой строчки заведомо больше 1. Т.е. получат строчку длиной 1 только неотрицательные целые числа от 0 до 9. Поэтому можно написать условие по длине строки: если длина строки 1, то добавляем слева "0", иначе возвращаем как есть без изменений. И если снаружи в функцию передали что-то неподходящее, то никаких дополнительных нулей прибавляться не будет.

Kaspiy, Итак, в десятый раз повторяем: разбери, отформатируй, объясни, вникни в код, который ты написал. Если ты не знаешь чего-то, какое-то выражение непонятное, у тебя нет объяснения - не "шамань" по принципу "авось заработает", задай конкретный вопрос: "что вот от сих до сих я выражения не понимаю - объясните".
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: 1 2 3 4 [5]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines