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

Программирование с нуля - это совсем просто! 32) Строки. И продолжение ответов


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

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

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

32) Строки. И продолжение ответов

Строки - это еще один тип данных, так же как целые числа или числа с плавающей запятой. Для обозначения этого типа применяется слово string.

var s: string; // объявлена переменная типа string

Представляет собой строка последовательность символов, заключенную в кавычки. Символы внутри строки могут использоваться в любой доступной на вашем компьютере кодировке, русской, английской или китайской. С консольными программами русский будет некорректно отображаться, но со следующего занятия к графическому интерфейсу перейдем, там уже с этим не будет проблем.

  s := ' это строка! ' ;

  Строка может быть пустой, не содержащей ни одного символа:

  s := ' ' ; // между кавычками нет пробела!

Строки удобны при обработке всевозможной текстовой информации. Например, просмотреть документ, и выделить в нем интересные данные, обработать запись пути к файлу итд.

  Строки можно складывать :) Для этого используется символ "+", с его помощью они сцпеляются друг за другом :

  s1 := ' Привет ' ;
  s2 := ' тебе ' ;
  s3 := s1 + s2 + ' ! ' ;
  writeln(s3); // будет напечатано Привет тебе!

  Определить число символов в строке можно с помощью функции length() :

  ...
  writeln(s3); // будет напечатано Привет тебе!
  writeln( length(s3) ); // будет напечатано 12

Можно вырезать из строки подстроку, в этом поможет функция copy(). Первый ее параметр - препарируемая строка, второй - номер символа, с которого начинается вырезание, и третий - длина вырезаемой подстроки.

  ...
  s3 := s1 + s2 + ' ! ' ;
  s1 := copy( s3, 2, 5 );
  writeln(s1); // будет напечатано ривет

Можно проверить, есть ли в строке подстрока. Для этого надо задействовать функцию Pos(), первый параметр которой - подстрока, а второй - строка, в которой эта подстрока ищется :)

Возвращает pos() либо ноль, если подстроки в строке нету, либо номер символа, с которого эта подстрока начинается.

  ...
  s3 := s1 + s2 + ' ! ' ;
  pos( ' ривет ' , s3 ) будет равно 2.
  pos( ' ривет! ' , s3 ) будет равно 0.
  pos( ' ! ' , s3 ) будет равно 12.

Также, можно преобразовывать число в строку, а строку - в число (если в строке корректная запись числа).

Функция StrToInt(s), где s - значение типа string, возвращает значение типа integer, являющееся числовым представлением записанного в строке значения (или ноль, если эта запись некорректна).

  var x: Integer;
  begin
  x := StrToInt( ' 22 ' ); // в x запишется число 22
  x := StrToInt( ' фиг ' ); // в x запишется число 0

Функция IntToStr() наоборот превращает число в строковое представление. Здесь ошибок не бывает :)

  var s: string;
  begin
  s := IntToStr( 12345 ); // в s запишется строка ' 12345 '

В Бейсике и Си строки заключаются в двойные кавычки, не одинарные. Тип string и в Бейсике есть, и складывать строки в нем тоже можно:

Dim s As String
s = "привет" + " тебе"
Console.WriteLine(s)

В Си, как и полагается, все посложнее :)

Для того чтобы курсор возвращался в начало строки надо было добавить помимо "\n" ещё и "\r". Но дальше возникла более серьезная - библиотеку atlstr.h он найти не может и пишет [C++ Error] Unit1.cpp(2): E2209 Unable to open include file atlstr.h И вот с этим ничего поделать не могу. Пробовал смотреть справку, но там не очень понятно даны описания, да к тому же на английском, в общем не помогло.
Сергей

Мне как раз написали про atlstr.h - он только в Visual Studio .NET. В ранних версиях можно вроде как-то так строки использовать:

  #include <string>
  using namespace std;

...

  string MoiaStroka;

В BorlandC++ я проверял, работает. Соответственно, присваивать строки можно так:

MoiaStroka = "привет";

а вот складывать нельзя. Правда, есть обходной маневр - можно прицеплять к текущему значению переменной в хвост в помощью сокращенного оператора присваивания "+=" :

MoiaStroka += " тебе!";

  Пока со строками все. Мы к ним вернемся чуть попозже. И упражнения по строкам тоже будут, главное, чтобы все (кто делает :) успевали сделать задания и не слишком торопились.


Варианты на фанту (пиво :) и чулки. Готовые алгоритмы.

Здравствуйте вот решил попробовать пояснить решение задачки про фанту! Для начала хочу сказать что задачка не так проста для решения как кажется на первый взгляд. Самое главное найти МИНИМАЛЬНУЮ сумму начальных денег.
Для примера рассмотрим кусочек из двух дней пятницы и четверга.
1) В пятницу нам надо иметь не менее к денег на покупку одной бутылки фанты! А для покупки мы сдаем пустые ненужные бутылки! Как говорил ДЯДЯ Федор: «Чтобы продать что то ненужное, надо сначала купить что то ненужное, а у нас денег нет!». Вот здесь и есть основной смысл решения, те деньги (пусть будут рубли) которые мы получаем за пустые бутылки – дороже тех денег которые остались с четверга как сдача, потому что нам нужно сначала купить эти пустые бутылки в четверг как полные!!! Введем такой коэффициент как стоимость денег он будет равен отношению стоимости полной бутылки (к) к пустой (п) (поясню, чтобы получить 1 рубль за пустую бутылку в пятницу, нужно потратить к/п рублей в четверг на полную), и мы поймем что он будет явно больше 1 и скорее всего равен 3-10, а то и больше, поскольку пустая бутылка намного дешевле полной!!!!! А вот коэффициент стоимости сдачи будет 1 поскольку мы считаем что для нее мы бутылки не сдавали, эти деньги просто у нас были!
Пример про пиво: полная бутылка стоит 10 рублей, а пустая 1 рубль, значит чтобы получить 1 рубль за пустую бутылку, нужно сначала потратить 10 рублей на полную!
2) Теперь подумаем, что нужно чтобы купить 1 бутылку в пятницу. В идеале, надо иметь в кармане сдачу с четверга в размере к, но по условию это невозможно, поскольку каждый день друзья тратили все деньги по полной, то есть сдача всегда должна быть меньше стоимости полной бутылки. Теперь попробуем вывести оптимальное число пустых бутылок которое надо сдать и, добавив сдачу, купить полную. Из пункта 1 следует, что чем меньше пустых бутылок мы сдадим в пятницу, тем меньше денег мы потратим на них в четверг (когда будем покупать их как полные). Но поскольку сдача не может быть равна стоимости полной бутылки, то мы должны сдать хотя бы ОДНУ пустую бутылку. Тогда мы получим что нужная в пятницу сумма денег к=п+сд, где сд сдача оставшаяся с четверга! Отсюда считаем что в четверг у нас должно остаться сд=к-п денег сдачи!
Пример про пиво: чтобы набрать 10 рублей на полную бутылку нужно А) сдать 10 пустых бутылок, Б) сдать 1 пустую и добавить 9 рублей. В первом случае мы потратим 100 рублей (10х10) для покупки этих пустых бутылок в четверг как полных, а во втором 19 рублей (1х10+9)!
3) Значит, для того чтобы купить одну полную бутылку фанты в пятницу, нам надо иметь в четверг сумму N=к+сд, (сд=к-п) на которую купить одну полную и оставить сдачу. Выпив фанту, сдать в пятницу пустую бутылку и, добавив сдачу, купить полную! Теперь о полном решении, сдача в задачке играет основную роль, именно на ней мы и можем экономить деньги. Теперь просто напишу формулы расчетов, а алгоритмов написано уже много.
Сумма денег в предыдущий день будет равна
N[i-1] = k*s[i-1]+сд[i-1]
Коэффициент s определяет количество пустых бутылок.
s[i-1] = Целая часть((N[i]-k)/n) + 1
Сдача от покупки
сд[i-1] = N[i]-s[i-1]*n
Если принять что для пятницы N[5]=k, и прогнать цикл 4 раза то мы и получим нужную сумму (и она будет точно минимальной).
Ошибкой тех решений что были на сайте являлось то, что все считали что отношение k/n не целое число, и неправильно рассчитывали оптимальную сдачу!!!
Андрей

И еще один ответ про чулки - Андрея же:

Алгоритм
1 Для определенного числа пар определенных цветов -- Количество шук N=n+2k, где n общее количество чулок одного цвета, k количество нужных пар (если задано два числа, то большее)
2 Для определенного числа пар одного (неопределенного) цвета -- количество шук N=4k-1, k количество нужных пар
3 Для определенного числа любых пар (цвет неважен) -- количество шук N=2k+1, k количество нужных пар

Я тоже сторонник именно такого подхода - постараться сделать как можно более универсальный алгоритм (и как можно более простой :), а потом его быстро закодировать, то есть думать за столом, а не за монитором. Как говорил один умный человек, экономьте в программе не пять операторов, а пятьдесят. Можно код вылизывать, а можно - алгоритм. Что дает гораздо больший эффект.

Исходные тексты.
Как я понимаю в рассылке от 10 ноября вы выложили программы, написанные подписчиками, но в них же очень много ошибок. Или вы специально выкладываете код с ошибками чтоб другие находили ошибки?
Евгений

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

Это ко всем обращение! Если какой-то код, прием в нем какой-то понравился, то все же сначала проверьте его на правильность, потестируйте на разных результатах. Публикация кода в рассылке (если код - не мой :) не означает его правильности!

  Я думаю что можно сделать набольшое замечание что-ли
  На протяжении всех уроков встречаю следующее:
  program Project1;
  {$APPTYPE CONSOLE}
  var X: Integer;
  var Y: Integer;
  begin
  ...
  end.
  Вопрос: зачем несколько раз объявлять раздел переменных?
  Достаточно одного раза!
  Евгений

То есть можно так записать сокращенно (без Var второй раз):

Var X: Integer;
   Y: Integer;

Или так, через запятую:

Var X, Y: Integer;
   Z: Real;

Но переменные разных типов надо, конечно, разносить.

Ответ про брусок:

  {$APPTYPE CONSOLE}
  uses Math,SysUtils;
   var x,y,z,w,h,v :real;
  begin
    writeln( ' Dobro pojalovat v programy rascheta podgonki bruska k pazu ' );
     readln;
      writeln( ' Esli ti chelovek ne sovsem glupii to ' );
       readln;
        writeln( ' Vozmi lineiky ' );
         readln;
          writeln( ' Vzjal? Teper izmer paz i brusok ' );
           readln ;
            writeln( ' Vvedi dliny bruska ' );
             readln (z);
              readln;
              writeln( ' Vvedi visoty bruska ' );
               readln(y);
                writeln( ' Vvedi shiriny bruska ' );
                 readln (x);
                 writeln( ' Vvedi shiriny paza ' );
                  readln (w);
                   writeln ( ' Vvedi visoty paza ' );
                    readln (h);
                     writeln ( ' Vvedi glubiny paza ' );
                      readln (v);
                       writeln ( ' Spasibo.Ne naprjaglo? ' );
                         readln;
    if v=0 then
     begin;
      writeln ( ' A mi dumali chto ti umnei ' );
       readln;
     end
      else
       if ((x<=w) and (y<=h)) or ((x<=h) and (y<=w)) then
        begin;
         if v>=z then
          begin;
           writeln ( ' Vse pravilno sdelal.Vse podhodin ' );
             readln ;
          end
           else
            begin;
             writeln ( ' Vozmi uglubi paz ili otrej brusok ' );
              readln;
            end;
         end
          else
           begin;
            writeln ( ' Dlja paravoza objasnjaem podgoni shirinu i visoty bruska ' );
             readln;
           end ;
       writeln ( ' Spasibo za sotrudnichestvo ' );
       readln;
  end.
Олег

То же - на Си++. Команды с cin/cout - это такая еще одна возможность языка по вводу/выводу со стандартных устройств (консоли в частности).

  #include<iostream>
  using namespace std;

  void main()
  {
          cout<<"Wvedite razmer x - storona parallelogramma"<<"\n";
          int x,y,z,w,h;
          cin>>x;
          cout<<"Wvedite razmer y - storona parallelogramma"<<"\n";
          cin>>y;
          cout<<"Wvedite razmer z - vusota parallelogramma"<<"\n";
          cin>>z;
          cout<<"Wvedite razmer w - storona paza"<<"\n";
          cin>>w;
          cout<<"Wvedite razmer h - storona paza"<<"\n";
          cin>>h;

          if(((x<=w)&&(y<=h))||((x<=h)&&(y<=w)))
          
                  cout<<"Prochodit po ploscosty x-y"<<"\n";

          else
                  cout<<"Ne prochodit po ploscosty x-y"<<"\n";

          if(((x<=w)&&(z<=h))||((x<=h)&&(z<=w)))

                  cout<<"Prochodit po ploscosty x-z "<<"\n";

          else
              cout<<"Ne prochodit po ploscosty x-z "<<"\n";

          if(((y<=h)&&(z<=w))||((y<=w)&&(z<=h)))
          
                  cout<<"Prochodit po ploscosty y-z" <<"\n";
          
          else
                  cout<<"Ne prochodit po ploscosty y-z " <<"\n";
  }
  Александр

Далее.

с заданием 7 провозился 3 вечера. Не столько даже с тем как записать (понятно ,что если предмет больше или равен пазу то он не влезет туда ,если равен можно забить конечно ,но будем считать что это не наш случай) а сколько разобраться о каких ошибках мне пишет компилятор. О. Если бы не пример из 24 урока про оператор "else". Пришлось его отдельно рассмотреть, подправить чтоб не мелькал а держался на экране. Причем когда я переписывал его по буквам он не работал, (ошибки чтоб их) а при копировании - как родной. Где ошибка была так и не понял.
Сергей, у меня тут совет возник для таких как я. Начинающих.
Чтобы не создавать на каждое задание проект можно работать в одном .Сделал задание 1 проверил, отладил, работает. Скопировал текст программы в "Блокнот" или другой редактор и там сохранил. А в Delphi все удалил. Делай задание 2 . Текст из "Блокнота" вставить можно всегда. Я делаю так .
Алексей

Можно еще проще - текст из редактора Дельфи сохранять командой Save As... в виде текста. Но я обычно старые проекты просто архивирую и в сторонку... На память :)

Вот решения Сергея по квадратному уравнению и про параллелепипед:

  #include <conio.h>
  #include <math.h>
  float a,b,c,x,d,x1,x2,y;
  int main()
  {
          cprintf("vvedite a ");
          cscanf("%f", &a);
          cprintf("\n\rvvedite b ");
          cscanf("%f", &b);
          cprintf("\n\rvvedite c ");
          cscanf("%f", &c);
          if (a==0){
                    cprintf("\n\rEto ne kvadratnoe uravnenie koren= %f\n\r", -c/b);
                  }
          else {
                    d=pow(b,2)-(4*a*c);
                    cprintf("diskriminant =%f\n\r",d);
                    if (d<0) {
                              cprintf("kornei net");
                             }
                    else {
                           x1 = (-b+sqrt(d))/2*a;
                           x2 = (-b-sqrt(d))/2*a;
                           cprintf("x1=%f \n\rx2=%f\n\r",x1,x2);
                         }
               }
           cscanf("%f", &y);
  }

  Она немного отличается, от заданного алгоритма, но, на мой взгляд,
  только в деталях.

   
  А вот решение на задачу про параллелепипед и паз, если я
  правильно понял условие,
  то оно(решение) должно выглядеть примерно так(правда я немного
  накрутил с условием
  проверки, но вроде работает):
       1.1. Ввести стороны параллелепипеда x,y,z,
       1.2. Ввести размеры паза w,h,
       1.3. Выполнить проверку условия
       (x=w или x=h или z=w или z=h)и(y=h или z=h или y=w или z=w)
          1.3.1. Если – да, то вывести, что влезет
          1.3.2. Если – нет, то вывести, что не влезет
       1.4. Завершить программу.

  Сама программа выглядит так:
  #include <conio.h>
  int main()
  {
      float x,y,z,w,h,e;
      cprintf("vvedite storoni paralepipeda, cherez probel x, y, z");
      cscanf("%f %f %f", &x,&y,&z);
      cprintf("\n\rvvedite razmeri paza w, h");
      cscanf("%f %f", &w,&h);
      if (((x==w)||(x==h)||(z==h)||(z==w))&&((y==h)||(z==h)||(y==w)||(z==w)))
          {
          cprintf("\n\rvlezet");
          }
      else
          {
          cprintf("\n\rne vlezet");
          }
      cscanf("%f", &e);

Восьмая задача:

  #include <iostream>

  using namespace std;

  main()
  {
          int sum = 0;
          for ( int i = 0; i < 1000; i++ )
          {
                  if ( i % 2 != 0 )
                          sum += i;
          }

          cout << sum;

          system("PAUSE");
  }
Сергей

Очень элегантно и компактно, правда? ОБратите внимание, как переменная i декларируется, прямо внутри цикла! Я лично не сторонник таких вещей, предпочитаю все в одном месте объявлять, чтобы не путаться потом. Но это кто как привык.

Варианты на Паскале:

  {ex8}
  {$APPTYPE CONSOLE}
  var i,s:integer;
  begin
  s:=0;
  for i:=1 to 1000 do
    if i mod 2>0 then s:=s+i;
  writeln( ' s= ' ,s);
  readln;
  end.
Владимир

  Задание № 8 (совсем легко получилось), ответ 250000:
  ...........
  uses math,
    SysUtils;
     var a,s:integer;
  begin
   s:=0;
   a:=1;
   while a<=1000 do
   begin
   s:=s+a;
   a:=a+2;
   end;
   writeln(s);
   readln;
  end.
   
  Задание № 9 (тоже не сложно, правда не знаю, что такое факториал.
  Я поняла, что это произведение последовательных чисел, но
  ответы............немного смущают, буду искать, что-нибудь про это.
  Интересно.):
  Кстати, при числах по-моему(забыла уже какие брала) больше 20,
  тоже 0 всегда получается. А почему??????
   
  var a,n,f:integer;
  begin
   
  readln(n); //при n=10 f=3628800; при n=69 f=0 ? а при n=0, надо
  ввести другое число
  if n<=0 then (мне вообще
  сказали, что при 0 один получится)
  begin
  writeln( ' vvedite n>0 ' );
  end
  else
  begin
   f:=1;
   a:=1;
   while a<=n do
   begin
   f:=f*a;
   a:=a+1;
   end;
   writeln(f);
   end;
   readln;
  end
Лена

Следующий вариант.

  8. Найдите сумму первой тысячи нечетных положительных чисел.
   
   
  {$APPTYPE CONSOLE}
   
  uses
    SysUtils;
       var i,sum: Integer;
  begin
    sum := 0;
    i := 2;
    while i <= 1000 do
      begin
      sum := sum + i;
      i := i + 2;
      end;
    writeln(sum);
       readln;
  end.
   
  Ответ:250500
   
  9. Вычислите факториал числа - n! .
   
  {$APPTYPE CONSOLE}
   
  uses
    SysUtils;
   
  var i,n,j:Integer;
  begin
          WriteLn( ' vvedite n ' );
          WriteLn(n);
          readln(n);
          if n<0 then
                  begin
                  Writeln( ' vi vveli ne to chislo ' );
                  readln; //выводится сообщение о не положительном
  значении
                  end
   else
           if n=0 then
                  begin
                  Writeln( ' n!= 0 ' );
                  readln;
                  end
          else
                  begin
                  i := 1;
                  j := 1;
                  while
                  i <= n do
                          begin
                          j := j*i;
                          i := i+1;
                          end;
                           writeln ( ' n!= ' );
                          writeln (j);
                            readln;
                  end;
  end.
   
   
   
  Ответ:
  при n = 10 n!=3628800
  при n = 0 n!=0
  А вот при n = 69 факториал вычислить не удаётся, его значение
  выходит из диапозона значений Integer.
Карташёва Наталия. E-mail: signat@mail.ru

Насчет факториала, конечно, многие отметили, что получающееся значение выходит за все мыслимые рамки :)

Это связано с тем, что компьютер ведь отводит для каждой переменной (ячейки) ограниченный объем памяти, поэтому слишком длинные или большие числа он не сможет обработать. В Дельфи, например, диапазон допустимых значений для типа Integer такой:

от -2147483648 до 2147483647

Для типа Real (в последних версиях Дельфи рекомендуют вместо устаревшего Real указывать Double) - так:

от 5.0 x 10^-324 до 1.7 x 10^308

А в Си вообще может быть ужас!!! Если в Паскале к числу максимально допустимому прибавить единичку:

  var n: Integer;
  begin
  n := 2147483647;
  n := n + 1;
  end.

то в момент выполнения оператора

  n := n + 1;

возникнет естественная ошибка (ошибки, возникающие непосредственно во время работы програмы, называются ОШИБКИ ВРЕМЕНИ ВЫПОЛНЕНИЯ, runtime-ошибки). Так как значение n стало больше максимально допустимого.

А вот в Си :

       int i;
       i = 2147483647;
       i ++;

НЕТ! Никаких ошибок в команде i++ выявлено не будет.

Знаете, каким будет значение i, равное 2147483647, если его увеличить на единицу? Попробуйте догадаться :)

Правильно - "-2147483648" (с минусом), самому малому (или большому?) отрицательному. То есть как бы по кругу замкнутому значения изменяются, сразу за самым большим положительным идет самое большое (малое?) отрицательное.

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

"Язык Си - как нож мясника: прост, остр и исключительно эффективен в умелых руках. Как и всякое острое орудие, Си может принести увечья тем, кто не умеет им пользоваться"
Эндрю Кениг "Си: Ловушки и западни".

Так что если Си используете, то смотрите, не порежьтесь :)

  Задание 8 (найти сумму певой тысячи нечетных положительных
  чисел):
  program Project15_sum1000;

  {$APPTYPE CONSOLE}

    var
    i, Sum: integer;
  begin
      i:=1;
      Sum:=1;
      while (i<=1000) do
          begin
          Sum:=Sum+i;
          i:=i+2;
          end;
           writeln(Sum);
      readln;

  end.
   Задание 9(вычисление факториала n!):
  program Project16_faktorial;

  {$APPTYPE CONSOLE}

    var
    i, n:integer;
     z:integer;

  begin

      i:=1;
        readln(z);
        readln(n);
        if n>=0 then
        begin
          while (i<=z) do
          begin
          n:=n*i;
          i:=i+1;
          writeln(n);
          end ;
        end;
         if (n<0) then
          begin
          writeln( ' Vvedeno otriczatelnoe chislo ' );
          end;
          readln;
  end.
Карлыгаш

Еще.

   я на днях часа 2 разбирался с кодировками и все-таки
       !научил дельфу "разговаривать" по-русски!
   
   А сегодня у меня с утра- одно только программирование.
     Если Вам интересно: 10:00-12:00 -запись в тетрадку решений
  задач 8,9,10,11
    12:00-14:00 -задачи 12. Формула,конечно,is too wild! не знаю как по
  русски её назвать.
   
  В этом письме -исходники задач 8,9,10 . Остальные постараюсь
  прислать утром.
    
  8. Найдите сумму первой тысячи нечетных положительных чисел
   
  program Project08;
   
  {$APPTYPE CONSOLE}
   
  uses
    SysUtils;
   
  var x,sum:integer;
   
  begin//gl
  {Найдите сумму первой тысячи нечетных положительных чисел}
    x:=1;
    sum:=0;
  while x<1000 do
    begin//1
     sum:=sum+x;
     x:=x+2;
    end; //1
    write( ' cymma paBHa = ' );
    writeln(sum);
    readln;
  end. //gl
   
  Ответ:250000
   
      9. Вычислите факториал числа - n!
   
  program Project09;
   
  {$APPTYPE CONSOLE}
   
   var i,x,n: integer;
       var sum: real;
        begin
      
     write( ' vvedite n = ' );
     readln(n);
   if n=0 then
   writeln( ' factorial= 0! ' )
   
   else
       begin
   x:=1;
   sum:=1;
   for i:=1 to n do
       begin
   sum:=sum*x;
   x:=x+1;
       end;
   write( ' factorial = ' );
   writeln(sum);
          end;
    readln;
  end.
   
  Ответы : для 10 -3628800
                  для 0 -0!
                  для 69 -1.711224....Е+0098
Алексей

Кстати - а почему это не у всех получился нормальный ответ с факториалом 69, как у Алексея? Нули какие-то, ошибки?

Знаете, почему я взял 69? Потому что на старых программируемых калькуляторах :) для разрядов степени (после буквы E) отводилось только два разряда, и факториал 69 (10 в степени 98) был последним, который вычислялся корректно!

Пока все.

Как написал один из подписчиков,

Перерыв! По этому адскому ящику идет "Осторожно, Задов!", а я его буду смотреть.

:)

Свежий анекдот!
Студенту-заочнику (юрист) необходимо сдать дискету преподавателю для копирования на нее домашнего задания. Дискету нужно подписать. Получаю пачку дискет и копирую. Одну дискету вставить в дисковод не могу. Вопрос на засыпку: почему? Ответ: лицевая часть дискеты заклеена наклейкой с фамилией ПОЛНОСТЬЮ! Вопрос студенту: в каком качестве используется дискета юристом?
Ирина

Однажды, тот же молодой сисадмин познакомился с веб-дизайнершей. по привычке он сразу же спросил, какой у нее ip-адрес, но услышав, что ip-адрес у нее динамический, тут же потерял к ней всякий интерес.
- мне не нравятся девушки легкого поведения, - объяснял он потом своим друзьям.

Далее - графический интерфейс, продолжение ответов (решайте-решайте!), сказки.


(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
Отписаться

В избранное