Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование с нуля - это совсем просто! 28) Народное творчество и комментарии к комментариям


Информационный Канал Subscribe.Ru

 
Школа программирования

Программирование с нуля - это совсем просто!

28) Народное творчество и комментарии к комментариям

Он сделал это! (он - это я :)

Давно хотел выложить ваши примеры замечательные, но уж очень вручную оформлять исходные тексты сложно - кавычки там, символы больше/меньше надо в хтмл аккуратно перекодировать, а уж про отступы и выделения ключевых слов и не говорю...

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

Написал небольшую утилитку, которая перегоняет исходный текст (пока на Паскале) в нормальный хтмл-код, пригодный, как очень хочется надеяться, для нормального восприятия в рассылках прежде всего.

Поэтому сейчас я буду экспериментировать!

Самой первой, приславшей достаточно оригинальный код (из тех, кто обучается с нуля), была Лена (Лена, привет! :). Вот одна из ее собственных программ:

  program Project2;

  {$APPTYPE CONSOLE}

  var x: integer;
  var y: integer;
  var z: integer;
  var a: integer;
  var b: integer;
  var c: integer;
  var d: integer;
  begin
  writeln( ' Iz punkta A vyshel peshehod so skorostyu 4km/ch ' );
  writeln( ' cherez 2chasa, iz punkta A v tom zhe napravlenii vyehal velosipedist
  so skorostyu 8km/ch ' );
  writeln( ' Na kakom rasstoyanii ot punkta A velosipedist dogonit
  peshehoda? ' );
  writeln( ' Reshenie: ' );
  writeln( ' Sv=Vv*Tv ' );
  writeln( ' Sp=Vp*Tp ' );
  writeln( ' Tp=Tv+2 ' );
  writeln( ' Sv=Sp ' );
  x:=8;
  y:=4;
  z:=2;
  a:=y*z;
  b:=x-y;
  c:=a div b;
  d:=x*c;
  readln;
  write( ' OTVET: ' );
  write(d);
  write( ' killometrov ' );
  readln;
  end.

И посложнее:

   А это фокус с угадыванием чисел(в детстве играли):

  program Project2;

  {$APPTYPE CONSOLE}
  var x,r,d,e,z1,z2:integer;
  begin
  writeln( ' Zadumaitelyuboechislo,bolshe10,iumnozhteegona10. '
  readln;
  writeln( ' Zadumaite lyuboe odnoznachnoe chislo i umnozhte ego na 9 ' );
  readln;
  writeln( ' Naidite raznitsu mezhdu vtorym i pervym proizvedeniem. ' );
  readln;
  writeln( ' Vvedite poluchennyi rezultat. ' );
  readln(x);
  r:=x;
  d:=r div 10;
  e:=r mod 10;
  z1:=d+e;
  z2:=(z1*10-r) div 9;
  write( ' Vy zadumali chisla: ' );
  write( z1);
  write( ' u ' );
  write( z2);
  readln;
  end.
  По моему здорово получилось, и детям понравилось очень.

Ответы Сергея с Украины:

  1. Ввести два числа a и b и напечатать максимальное из них.

  program y241;
  {$APPTYPE CONSOLE}
  var a, b: integer;
  begin
  readln (a, b);
  if a>b then writeln (a)
         else writeln (b);
  readln;
  end.

  2. Ввести три числа x, y, z. Напечатать минимальное из них.

  program y242;
  {$APPTYPE CONSOLE}
  var x, y, z, n: integer;
  begin
  readln (x, y, z);
  if x<y then n:=x else n:=y;
  if n<z then writeln (n) else writeln (z);
  readln;
  end.

  3. Ввести три числа x, y, z. Найти, что больше - их сумма или их
  произведение.

  program y243;
  {$APPTYPE CONSOLE}
  var x, y, z: integer;
  begin
  readln (x, y, z);
  if (x+y+z)>x*y*z then writeln ( ' bolwe syma ' )
                   else writeln ( ' bolwe proizvedenie ' );
  readln;
  end.

  4. Ввести три числа x, y, z. Если x > y > z, то напечатать разность x-z, в
  противном случае - максимальное из трех.

  program y244;
  {$APPTYPE CONSOLE}
  var x, y, z, n: integer;
  begin
  readln (x, y, z);
  if (x>y) and (y>z) then writeln (x-z)
                     else begin
                          if x>y then n:=x else n:=y;
                          if n>z then writeln (n) else writeln (z);
                          end;
  readln;
  end.

  5. Ввести два числа a и b. Если a > b, то изменить значение a на
  произведение a и b, в противном случае
  изменить значение b на сумму a и b.
  Напечатать результирующие значения a и b.

  program y245;
  {$APPTYPE CONSOLE}
  var a, b, n: integer;
  begin
  readln (a, b);
  if a>b then a:=a*b
         else b:=a+b;
  writeln (a);
  writeln (b);
  readln;
  end.

  Проверял, все работает!

В смысле, Сергей проверял, не я :)

Кстати, обратите внимание. В условных операторах, если надо выполнить один оператор в зависимости от условия, указывать begin end не обязательно. То есть вариант

  if a>b then
   begin
   a:=a*b;
   end;

можно так записать:

  if a>b then
   a:=a*b;

А вот если в группе команд два и более операторов:

  if a>b then
   begin
   a:=a*b;
   b:=b*2;
   end;

то сокращать группу, охваченную begin end, нельзя. Отбрасывать, в смысле, begin end, нельзя. Потому что если записать

  if a>b then
   a:=a*b;
   b:=b*2;

то на самом деле компилятор воспримет только первый оператор как относящийся к then:

  if a>b then
   begin
   a:=a*b;
   end;
   b:=b*2;

Запомнили? Понятно, в чем разница? Я специально это раньше не упоминал, чтобы вы не путались пока.

  Пример Задание 4 ( самое сложное, на мой взгляд , из
  представленных)
   
  var x: integer;
  var y: integer;
  var z: integer;
  begin
  writeln( ' V vedite chislo "X" ' );
  readln(x);
  writeln( ' V vedite chislo "Y" ' );
  readln(y);
  writeln( ' V vedite chislo "Z" ' );
  readln(z);
  if (x>y) and (y>z) then
  begin
  writeln( x-z );
  writeln( ' Chislo "X" bolshee ' );
  end;
  if (z>x) and (x>=y)or (z>y)and (y>=x) then
  begin
  writeln( z );
  writeln( ' Chislo "Z" bolshee ' );
  end;
  if (y>z) and (z>=x)or (y>x)and (x>=z) then
  begin
  writeln( y );
  writeln( ' Chislo "Y" bolshee ' );
  end;
   
  writeln( ' "Press ENTER" ' );
   
  readln;
   
  end.
Papaleff

Далее.

  ====2. Ввести три числа x, y, z. Напечатать минимальное из них.===
   Вы её посмотрите,потом будет вопрос.
   
  program Project2;
   
  {$APPTYPE CONSOLE}
    var x: integer;
    var y: integer;
    var z: integer;
   
  begin
   writeln( ' vvedite x;y;z ' );
   readln(x,y,z);
     if (x=y)or(x=z)or(y=z) then
      begin
             write( ' vvedite poj-sta PA3HbIE chisla,a to ya putayus,sorry ' );
             readln;
      end
     else
  begin
   if(x<z)and(x<y) then
     begin
     write( ' minimum=x;x= ' );
     writeln(x);
     readln;
     end
   else
     begin
       if (y<z) then
         begin
         write( ' minimum=y;y= ' );
         writeln(y);
         readln;
         end
       else
         begin
           if (z<y) then
             begin
             write( ' minimum=z;z= ' );
             writeln(z);
             readln;
             end
         end
      end;
  end
  end.

  Я тут вроде бы придумал,как можно записать программу для
   нахождения минимального значения из 10 , например.
     но для этого нужна Ваша помощь !
   
  {$APPTYPE CONSOLE}
  var (x,y,s): integer;
   
   begin
  s:=1;
  write( ' vvedite chislo ' );
  writeln(s);
  readln(x);
      s:=s+1;
      if (s=11) then
              begin
              write( ' minimalnoe chislo- ' );
              writeln(x);
              readln;
              end
              end
      else
              begin
              write( ' vvedite chislo ' );
              writeln(s);
              readln(y);
              end
      if(y<x) then
              begin
                  x:=y;
              end
      Здесь должен быть переход на строчку s:=s+1;
      как это записать?

Алексей

Посмотрите, Алексей сам придумал алгоритм нахождения минимального (при простейшем исправлении - максимального) числа! Очень рад.

Переходом лучше никогда не пользоваться :) Алгоритм лучше так сделать - просто выполнять многократно группу команд, в данном случае 10 раз. Оператор цикла в следующем выпуске, все уже просят :)

  program ex1;
  var a,b,bol:integer;
  begin
  {Ввести значения A и B командой присваивания}
  a:=34;b:=-3;
  if a>b then bol:=a else bol:=b;
  writeln( ' Большее - ' ,bol);
  end.
   
  program ex2;
  var a,b,c,min:integer;
  begin
  a:=24;b:=-3;c:=34;
  if (a<b) and (a<c) then Min:=a
                            else if b<c then Min:=b
                                          else Min:=c;
  writeln ( ' Min = ' ,Min);
  readln;
  end.
   
  program ex3;
  var x,y,z:integer;
  begin
  readln(x,y,z);
  if x*y*z>x+y+z
     then writeln( ' больше произведение ' )
     else writeln( ' больше сумма ' );
  end.
   
  program ex4;
  var x,y,z,max,raz:integer;
  begin
  x:=24;y:=-3;z:=34;
  if (x>y) and (x>z) then Max:=x
                            else if y>z then max:=y
                                                   else max :=z;
  if (b<a) and (b>c)
        then writeln(x-z)
        else writeln(max);
  readln;
  end.
   
  program ex5;
  var a,b:integer;
  begin
  readln(a,b);
  if a>b then a:=a*b else b:=a+b;
  writeln( ' a= ' ,a, ' b= ' ,b);
  end.
Владимир

Два примечания. Во-первых, словами min и max лучше не пользоваться - это стандартные функции нахождения минимального и максимального из двух чисел, и хотя когда они описаны как переменные, то и будут восприниматься как переменные (это замечательное свойство Паскаля), но самими этими функциями уже воспользоваться не удастся. Это совпадение в данном случае случайно, но на будущее старайтесь избегать простых очевидных названий переменных - они могут уже быть задействованы в языке для каких-то целей.

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

А вот чтобы это было не так, может, стоило, как я уже писал, рассказать народу про комментарии? ;)

Слушаюсь! :)

Итак, комментарии. Наглядность программы можно повышать разными способами. Было бы очень здорово, если бы текст, понятный компилятору , мы могли бы разбавлять своими собственными комментариями и примечаниями. Например, это мог быть текст нашего алгоритма, который мы последовательно переводили бы в программный код. Или вот как Владимир сделал.

Чтобы подсказать компилятору, что некоторый текст - комментарий разработчика , и его не надо анализировать, перед таким текстом достаточно поставить два символа - "//" . Для совместимости со старыми версиями Паскаля можно также использовать фигурные скобки. Более того, допускается также такая пара: "(*" и "*)". Все, что между ними, считается комментарий. Он выделяется обычно в редакторе серым.

Как только в строке встречается //, вся ее оставшаяся часть компилятором пропускается, и он переходит к разбору следующей строки. Таким образом, во-первых, после символов комментария можно указывать текст на любом языке, в том числе и русском, а во-вторых, для выделения большого количества подряд идущих строк-комментариев лучше использовать пары { } или (* *).

If Psw = 0 Then // проверяем секретный код!

Обратите внимание: комментарии выделяются в редакторе серым цветом. Таким образом оболочка подсказывает программисту, где находится текст программы, а где - комментарий разработчика.

Профессиональные программисты отводят комментированию своих текстов очень большое значение. В серьезных государственных организациях и крупных коммерческих компаниях процесс добавления в программу комментариев считается обязательным. Так, в Министерстве обороны США на один оператор программы приходится в среднем четыреста слов комментария.

Но при этом очень важно писать комментарии осмысленно. Не имеет смысла, например, для вышеприведенного условного оператора делать комментарий "сравниваем значение переменной Psw с нулем". Это и так ясно. Важно указать, что происходит в этом месте программы с точки зрения реализации основного алгоритма , а не опускаться до деталей кодирования. Правильным комментарием может быть следующая запись:

          if Psw = 0 then // проверяем секретный код

              { Ничего нового не сообщено,
               можно продолжать работу.
               Ждем дальнейших указаний : }
              WriteLn( ' Продолжайте работу! ' );

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

Следующий пример.

    Написал программу Фэн-Шуй

   {$APPTYPE CONSOLE}

  var n,m,t:integer;
  begin
     writeln( ' your bearthday year(55,85...) ' );
     readln(t);
     n:=100-t;
     m:=n mod 9;
      if m=0 then m:=9;
     writeln( ' your numb is ' ,m, ' smotry svoe napravlenie na picyHke ' );
     writeln(4, ' ' ,9, ' ' ,2);
     writeln(3, ' ' ,5, ' ' ,7);
     writeln(8, ' ' ,1, ' ' ,6);
     readln;
  end.
     Простенько, но зато своё.
   Ярослав.

И в заключение:

  1) Задание1:
  program Project8_srav1;

  {$APPTYPE CONSOLE}
   var a, b:integer;

  begin
        readln(a);
        readln(b);
        if a>b then
        begin
        writeln( ' chislo "a" maximalnoe is nih ' );
        end
        else
        begin
        writeln( ' chislo "b" maximalnoe ' );
        end;
        readln;
  end.

  2) Задание 2:
  program Project9;

  {$APPTYPE CONSOLE}

    var x,y,z:integer;
  begin
       readln(x);
       readln(y);
       readln(z);
       if (x<y) and (x<z)then
       begin
       writeln( ' x - min ' );
       end
       else begin
       writeln( ' y or z - min ' );
       if (y<x) and (y<z) then
       begin
       writeln( ' y - min ' );
       end
          else
          begin
          writeln( ' z - min ' );
          end;

        end;

       readln;

  end.
   
  3) Задание 3:
  program Project10_srav3;

  {$APPTYPE CONSOLE}

    var x,y,z:integer;
        p:integer; // сумма чисел
        s:integer; // произведение чисел

  begin
     readln(x);
     readln(y);
     readln(z);
     p:=x+y+z;
     writeln(p);
     s:=x*y*z;
     writeln(s);
     if p>s then
          begin
          writeln( ' Summa chisel bolshe chem prozvedenie ' );
          end
          else
                  begin
                  if s>p then
                          begin
                          writeln( ' Proizvedenie bolshe chem summa ' );
                          end
                          else
                          begin
                          writeln( ' Proizvedenie ravno summe chisel ' );
                          end;
                  end;

     readln;

  end.
   
  4) Задание 4:
  program Project11_srav4;

  {$APPTYPE CONSOLE}

   var x,y,z:real;
       q:real;

  begin
       readln(x);
       readln(y);
       readln(z);
       if (x<>y) and (x<>z)then
        begin
          if (x>y)and (y>z) then
       begin
          q:=x-z;
          writeln(q);
       end
       else
          if (y>x) and (y>z)then
          begin
          writeln( ' y-max ' );
          end
          else
          if (z<>x) and (z<>y) then
                  begin
                  writeln( ' z-max ' );
                  end
                  else
                  begin
                  writeln( ' z ravno y ' );
                  end;
          end;
       readln;
  end.
   
  5) Задание 5:
  program Project12_srav5;

  {$APPTYPE CONSOLE}

    var a,b:real;
        z,v:real;
  begin
        readln(a);
        readln(b);
        if a>b then
          begin
          z:=a*b;
          writeln(z);
          a:=z;
          write( ' a= ' );
          writeln(a);
          end
          else
                  if b>a then
                  begin
                  v:=a+b;
                  writeln(v);
                  b:=v;
                  write( ' b= ' );
                  writeln(b);
                  end;
          readln;

  end.
   
  Вот все ответы на Ваши задания, я проверила, работают.
  Карлыгаш.

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


(c) 2004 Сергей Бобровский bobrovsky@russianenterprisesolutions.com

Школа программирования с нуля
http://russianenterprisesolutions.com/sbo/

Все предыдущие выпуски базового курса тут:
http://russianenterprisesolutions.com/sbo/base.htm

 

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.prognull
Отписаться

В избранное