Программирование

Давайте здесь устроим поле для обсуждения неясных моментов программирования на Паскале

 <Паскаль-программа> ::=

  1.  <Паскаль-программа> ::= <заголовок_программы>; <блок> <точка>
  2.  <точка> ::= .
  3.  < /pre>

В чём вопрос,Роман?

В чём вопрос, Роман?
Возможно, Вы пробуете вставить в комментарий код? Если это так, то избегайте пробелов внутри открывающего и закрывающего тегов.

Д.з. Федосов

Привет всем подскажите пожалуйста, что выполняет операторная
последовательность стоящая в 4-9 строках ?

  1. Program Sq2;
  2. Var A, B, C, D, X, X1, X2 : Real;
  3. Begin
  4.      Writeln ('Введите коэффициенты уравнения (A, B, C) ');
  5.      readln(a,b,c);
  6.      If A=0 Then
  7.      If B=0 Then
  8.      If C=0 Then Writeln('X - любое число')
  9.     Else Writeln('Корней нет! ')
  10. Else
  11.     Begin
  12.        X:=-C/B;
  13.        Writeln('X=',X:8:3);
  14.     End
  15. Else
  16.    Begin
  17.       D:=B*B-4*A*C;
  18.       If D<0 Then Writeln ('Корней нет! ')
  19.    Else
  20.          Begin
  21.             X1:=(-B+SQRT(D))/2/A;
  22.             X2:=(-B-SQRT(D))/2/A;
  23.             Writeln ('X1=', X1:8:3, ' X2=',X2:8:3);
  24.          End;
  25.     End;
  26. End.  

Евгений,

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

  1. Program Sq2; //Решаем кв.уравнение: A*X^2+B*X+C=0
  2. Var A, B, C, D, X, X1, X2 : Real;
  3. Begin
  4.      Writeln ('Введите коэффициенты уравнения (A, B, C) ');
  5.      readln(a,b,c);
  6.      If A=0 Then // Ур. не квадратное, т.к. коэффициент A=0
  7.           If B=0 Then // A=0, B=0
  8.                If C=0 Then Writeln('X - любое число') // A=0, B=0, C=0
  9.                Else Writeln('Корней нет! ') // 0*X^2+0*X+C=0, при С<>0
  10.           Else  Begin // A=0, B<>0
  11.                X:=-C/B;
  12.                Writeln('X=',X:8:3);
  13.           End
  14.      Else Begin // A<>0, ур-е действительно квадратное
  15.           D:=B*B-4*A*C;
  16.           If D<0 Then Writeln ('Корней нет! ')
  17.           Else Begin // два корня, возможно, равных
  18.                 X1:=(-B+SQRT(D))/2/A;
  19.                 X2:=(-B-SQRT(D))/2/A;
  20.                 Writeln ('X1=', X1:8:3, ' X2=',X2:8:3);
  21.           End
  22.      End;
  23. End.  

Согласен!

Согласен, Валерий Шехамболетович, что код не правильно оформлен.
Возможно из за этого я его полностью и не смог правильно прочитать.
Буду стараться, Спасибо за помощь!

Задача: написать программу,

Задача: написать программу, вычисляющую cos x, с заданной точностью eps

  1. program MyCos;
  2. var x,y,a,eps:real;
  3.             i:word;
  4. begin
  5.   readln(x);
  6.   readln(eps);
  7.   a:=x;
  8.   y:=1;
  9.   i:=1;
  10.   while abs(a)>= eps do begin
  11.     a:=-(a*x)/(i+1) ; inc(i,3); y:= y+a
  12.   end;
  13.   Writeln(' cos x =' , y);
  14. end.

Нет, Никита. Строка 11

Нет, Никита. Строка 11 ошибочна. Просчитайте 2-3 члена ряда.

Может быть так:

  1. program MyCos;
  2. var x,y,a,eps:real;
  3.             i:word;
  4. begin
  5.   readln(x);
  6.   readln(eps);
  7.   a:=x;
  8.   y:=1;
  9.   i:=1;
  10.   while abs(a)>= eps do begin
  11.     a:=-(a*x)/((i+1)*i ); inc(i,2); y:= y+a
  12.   end;
  13.   Writeln(' cos x =' , y);
  14. end.

Две ошибки исправили, Никита.

Две ошибки исправили, Никита. Но там сидит и третья!

тогда так:

  1. ...
  2.  a:=-(a*x)/((i+1)*i ); inc(i,2); y:= y-a
  3. ....

Добавили ещё одну ошибку. Ну,

Добавили ещё одну ошибку.
Ну, помогите же кто-нибудь Никите!

Тогда так:

  1. ...        
  2. a:= - a*x/((i+1)*i ) ; inc(i,2) ; y:=y+a
  3. ...

Это в точности семантически

Это в точности семантически совпадает с Вашим вариантом a:=-(a*x)/((i+1)*i ); inc(i,2); y:= y+a
и содержит ту же ошибку.

Ошибку так и не нашёл...Попробую записать в более понятном виде:

  1. program MyCos;
  2. var x,stx,y,eps: real;   //stx -  степень x
  3.           i,f,z: integer; // f - факториал ,z -  знак
  4. Begin
  5.  Readln(x);
  6.  Readln(eps);
  7.  stx:= x*x;  //x в степени 2
  8.  f:= 2;  // начальное значение факториала
  9.  y:= 1;  
  10.  i:= 2;  
  11.  z:= -1;  //знак элемента
  12.  while stx/f >=eps do begin  
  13.   y:=y+z*stx/f;
  14.   inc(i,2);
  15.   stx:=stx*x*x;
  16.   f:=f*(i-1)*i;
  17.   z:=z*(-1);  //смена знака
  18.  end;
  19.  Writeln(' cos= ',y);
  20. end.

Cпорно, что стало понятней,

Cпорно, что стало понятней, но зато ошибка исчезла.

Исчезла ...

...та ошибка, но появилась свеженькая!
Если хотите, Никита, всё объясню.

Виктория, Роман, Сурен -

Виктория, Роман, Сурен - подключайтесь к решению задачи о вычислении косинуса!

Да)

Я хочу что бы вы объяснили.

Приз - балл...

Приз - балл тому, кто первым найдёт ошибку вот в этом коде (Втр, 23/10/2012 - 17:26 — Никита Ширшов).
Давайте, Никита, дадим попробовать тем, кто на сайте. Интересно же ...
А может быть Вы и сами справитесь. Ошибка то ведь очевидна и легко обнаруживается мысленным прокручиванием нескольких повторений цикла (ну, если Вы формулу разложения косинуса правильно записали)

Извините, а можете написать

Извините, а можете написать условие задачи

По секрету сказать, последний

По секрету сказать, последний Ваш код, Никита всё же верен. Но, как Вы думаете, будет ли верен в таком же стиле расписанный синус?

Да

Думаю, что будет верным и для синуса.

Условие и решение аналогичной

Условие и решение аналогичной задачи для синуса давались на лекциии.
Вот это условие: найти значение ф-ции Cos X = 1- X^2/2! + X^4/4! - X^6/6! + ...
с заданной точностью eps>0, при условии, что |X|<1.

Я ожидал, Никита, что Вы так

Я ожидал, Никита, что Вы так ответите. И будете не правы. Аналогичное решение для синуса не пройдёт (это связано с одним важным различительным свойством указанных двух функций. Каким?).
И вот поэтому оно меня не очень устраивает.

Свойство:

sinx - нечётная, а cosx - чётная

Ну, хорошо. Возвращаю Вас к

Ну, хорошо. Возвращаю Вас к этому Вашему коду:

  1. readln(x);
  2. readln(eps);
  3. a:=x;
  4. y:=1;
  5. i:=1;
  6. while abs(a)>= eps do begin
  7.     a:=-(a*x)/((i+1)*i ); inc(i,2); y:= y+a
  8. end;
  9. Writeln(' cos x =' , y);

Ошибка в том, что степень X с каждым повторением цикла будет наращиваться на ЕДИНИЦУ, т.к. Вы домножаете a на X, а не на X^2, как того требует формула разложения. Например, после второго повторения цикла, Вы получите в числителе X^3, которое в формулу не должно входить. Странно, что Вы этого не увидели. Придумайте, как всё исправить.

Верно, Никита,

Верно, Никита, чётность-нечётность этих двух ф-ций!
Во втором своём решении Вы пропустили ABS(...) в заголовке цикла, что не повлияет на Cos x (числители - чётные степени X, будут неотрицательны вне зависимости от знака X). А знак числителя для SIN X при X<0 стал бы скакать, выкинув нас сразу же из цикла по минусу (а не потому, что модуль X стал достаточно мал).

Вот исправил ошибку:

  1. program MyCos;
  2. var x,y,a,eps:real;
  3.             i:word;
  4. begin
  5.  readln(x);
  6.  readln(eps);
  7.  a:=x;
  8.  y:=1;
  9.  i:=1;
  10.  while abs(a)>= eps do begin
  11.   a:=-(a*x)/((i+1)*i) ; inc(i,2);a:=a*x; y:= y+a;
  12.  end;
  13.  Writeln(' cos x =' , y);
  14. end.

Теперь верно, но почему так

Теперь верно, но почему так всё сложно?!

  1. ...
  2. a:=1;
  3. y:=1;
  4. i:=1;
  5. while abs(a)>= eps do begin
  6.     a:=- a*sqr(x)/((i+1)*i) ;
  7.     y:= y+a;
  8.     inc(i,2);
  9. end;
  10. ...

И всё же, мы с Вами сделали это, поздравим друг друга!

Для полноты картины, вариант

Для полноты картины, вариант на основе Repeat))

  1. program cos_x;
  2. var x, y, a, eps :Real;
  3.       i :Word;              
  4. begin
  5. Writeln('Vvedite ugol v radianah');
  6. Readln(x);
  7. Writeln('Vvedite pogreshnost');
  8. Readln(eps);
  9. i := 0;
  10. y := 1;
  11. a := 1;
  12. repeat
  13.     a := -a * sqr(x) / ((i + 1) * (i + 2));
  14.     y := y + a;
  15.     inc(i, 2);
  16. until abs(a) < eps;
  17. Writeln(y);
  18. Readln
  19. end.                                

Вполне нормален и этот

Вполне нормален и этот вариат.

Давайте на этом закончим, у

Давайте на этом закончим, у меня ещё дела.
А завтра около 21:00 желающие могут поучаствовать в розыгрыше нескольких бонусных задач на циклы For и целочисленную арифметику. Пока!

Всем доброй ночи)

Всем доброй ночи)

Валерий Шахамболетович

Валерий Шахамболетович напишите пожалуйста условия задачи АВС из модуля

Сурен,

Странно Вы назвали эту задачу: ABC (Эй-Би-Си).
Могу предположить, что имелась ввиду задача о модуле (т.е. функции ABS(А)).
Ну, так вот она:

Что Вы можете сказать о следующей конструкции в ТП: case A<0 of true:else A:= -A end ?
1. Она синтаксически не верна;
2. Её действие полностью эквивалентно вычислению abs(A);
3. Её действие полностью эквивалентно вычислению - abs(A);
4. Её действие состоит в чём-то ином.

Именно об эту задачу Вы и споткнулись.
Я где-то уже обмолвился, что это наиболее тонкая из всех задач, и я включил её в порядке эксперимента. При этом, понимал, что формально правильный ответ могут выбрать многие, но наиболее подготовленные, как мне казалось, выберут ответ (3). Так всё и случилось.

Подумайте над этой задачей ещё раз все вместе, в спокойной обстановке. Обоснованный правильный ответ - 1 балл.

Ну, взять переменную А,

Ну, взять переменную А, скорее всего целочисленного типа, и проверить её на отрицательное значение, если она отрицательна, т.е. булевская операция А < 0 вернула true, то оставить её как есть (true: пустой оператор), а если не отрицательна, то сделать её отрицательной в принудительном порядке. Ответ 3: Её действие полностью эквивалентно вычислению - abs(A);

ЗАДАЧИ НА FOR

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

Написать ТП-программы решения следующих задач, на основе использования оператор цикла FOR.

1.В ТП дано натуральное число N типа Word. Используя оператор FOR, определить его десятичную значность, т.е. длину его десятичной записи (Например, 3035 - четырёхзначное).

2.Используя минимально возможное число операторов, напечатать все нечётные натуральные числа, не превосходящие 100.

3.Дано 2 натуральных числа M и N. Вывести в порядке убывания все их общие делители.

4.Дана входная последовательность из N целых чисел. Найти значение наибольшего члена этой последовательности.

5.Ввести N десятичных цифр (знаков) и образовать из них соответствующее значение A типа Word (Например, введя 4 цифры: ‘3’,’0’,’5’,’2’, мы должны сформировать значение A=3052)

ВНИМАНИЕ!
Дабы не лишать вовремя не зашедших на сайт шанса, в один день каждому разрешается предложить решение не более, чем одной задачи!
Обсуждать предлагаемые решения можно без ограничений. Как обычно, оцениваю как результативность, так и активность. Удачи!

если меня не подводит мой

если меня не подводит мой здравый смысл,то эта конструкция синтаксически не верна,так как после true в данном случае else никак не должен стоять,т.е.

  1. case A<0 of
  2. true:else A:= -A
  3. end.

Вашу версию, Зарина, легко

Вашу версию, Зарина, легко проверить на компьютере, практически ...

Задача 2

  1. program zd2;
  2. var i:byte;
  3. begin
  4. for i:=1 to 100 do begin
  5.   if (i mod 2)<>0 then  writeln(i);
  6. end;
  7. end.

добрый вечер! задача 2

  1. program Chislo;
  2. var i:integer;
  3. begin
  4.     for i:=1 to 100 do begin
  5.         if odd(i) then begin
  6.         writeln(i,', ');
  7.        end;
  8.     end;
  9. end.

Задача 4

  1. program Task4;
  2.   var n, i, max : integer;
  3.  
  4. begin
  5.   write ('Введите n: ');
  6.   readln (n);                                 // Читаем длину последовательности
  7.   readln (max);                            // Первый член последовательности считаем максимальным
  8.   for I := 2 to n  do begin            // Обработка последовательности
  9.     readln (n);                             // Читаем новый член последовательности
  10.     if n > max then max:= n       // Если введённое значение оказалось больше максимального переобозначаем max
  11.   end;
  12.   writeln ('Максимум: ', max);
  13.   readln
  14. end.

Забыл о том, что case — это

Забыл о том, что case — это оператор выбора. Тогда так: проверить переменную А на отрицательность, если булевская операция вернёт TRUE, т.е. А отрицательное значение, то... то она совпадёт с константой TRUE и сделает... ничего не сделает, оставит эту переменную как есть, если же булевская операция вернёт FALSE, то она не совпадёт с предложенной константой и выполнится обязательная часть else и переменная станет отрицательной.

Если А отрицательное

Если А отрицательное (проверка A<0 - результат true), то никаких действий не производится (оператор после "true:" пустой).
Если же оно неотрицательное (проверка A<0 - результат не true), то оно приравнивается себе с противоположным знаком (выполняется оператор после else) ответ будет под номером 3

Первые, одновременно!

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

интересено получилось с

интересено получилось с Никитой минута в минуту))

Задача 2

  1.    var i,n:integer;
  2. begin
  3.   write('n=');
  4.   read(n);
  5.   for i := 1 to n-1 do
  6.     begin
  7.     if i mod 2=1 then
  8.     write(i, ' ');
  9.     end;
  10.   readln
  11. end.

Андрей,Роман.

Андрей. Я бы предпочёл Ваш первый пост. Он и конкретен и в логике понятен.
Роман. Ваша логика тоже понятна.Ответ, правда, Вами не выбран.
Решения не верны.

Задача 4

  1.    var i,n,max:integer;
  2. begin
  3.  max:=0;
  4.  write('n=');
  5.  read(n);
  6.  for i:=n downto 1 do
  7.     begin
  8.       if n>max then  max:=max;
  9.       write(max);
  10.     end;
  11.  readln
  12. end.

var

  1. var i,j,n,m:integer;
  2. begin
  3. write('n=');
  4. read(n);
  5. write('m=');
  6. read(m);
  7.   for i:=1 to n do begin
  8.   for j:=1 to m do begin
  9.       if (n mod i)=0 and (m mod j)=0 and (i=j) then write(i);
  10.   end;
  11.   end;
  12. end . <\pre>