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

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

Валерий Шахамболетович Задача №4

наш учитель говорил,что легче "сверху" "вниз" пойти,так как за мЕньшее количество шагов можно сделать. Я так и сделала,но мое решение вы не рассмотрели,может я неправильно сделала где-то? Посмотрите пожалуйста..

Зарина,

Простите, но Вы очень не понятны в своём последнем посте ни стилистически, ни по существу.
Причём тут "сверху вниз" (хотя и есть такая технология разработки программ)?
Я только могу предположить, что Вы задаёте вопрос по поводу вот этого (Пт, 26/10/2012 - 22:03 — Джанчатова Зарина) своего кода. Так здесь нечего комментировать и бессмысленно говорить об ошибках - они во всём. Вы даже не поняли условия задачи...
И странно, что Вас совершенно не интересует проведённый мною подробнейший анализ, в том числе, и этой, интересующей Вас задачи 4. Я в недоумении...

Я поняла смысл задачи,надо

Я поняла смысл задачи,надо найти МАКСИМУМ из N. У нас такая домашняя была когда-то и я решила ее ТАК ЖЕ как Саша здесь. И мне тогда сказали,что лучше воспользоваться циклом "for i:=n downto 1 do..." и сразу же вывести максимум. Не сочтите за неуважение,но я ваш анализ ПОДРОБНО изучила и до сих пор изучаю, но все равно не могу понять почему у меня "ВЕЗДЕ" ошибки

Вопрос о case-операторе

Некоторые интересуются-таки этим, никем верно не выполненным заданием из теста:
Что Вы можете сказать о следующей конструкции в ТП: case A<0 of true:else A:= -A end ?


1. Она синтаксически не верна;
2. Её действие полностью эквивалентно вычислению abs(A);
3. Её действие полностью эквивалентно вычислению - abs(A);
4. Её действие состоит в чём-то ином.

Перепишем:

  1. case A<0 of
  2.      true:    //пустой оператор
  3.      else A:= -A  // если A не отрицательно, меняем его знак
  4. end

В такой форме хорошо видно, что с синтаксисом всё впорядке.
Семантически это эквивалентно оператору A:= - abs(A).
Казалось бы, нужно выбрать ответ 3.
Однако это не так, потому что:
выполнение оператора A:= - abs(A) может изменить значение A,
a вычисление выражения - abs(A) не может.
Поэтому правильным является ответ 4 теста.

Зарина.

Что такое "МАКСИМУМ из N"? - Вы так сейчас написали.

самое большое число,т.е. N

самое большое число,т.е. N

Зарина.

Я Вашего ответа не понимаю. N - это буква, а не число.
Предлагаю Вам для начала копию МНОЮ написанного условия этой задачи в своём посте показать.

Кроме того, "самого большого

Кроме того, "самого большого числа", как известно, не существует...

Хорошо, не мучайтесь, Зарина.

Хорошо, не мучайтесь, Зарина. Проблемы, вижу, серьёзные. Давайте сегодня попробуем встретиться и разобраться после 4-й пары. А пока отдыхайте. Доброй ночи!

все я поняла разницу=) N это

все я поняла разницу=) N это количество,а не число,я задачу неправильно прочла не единожды,спасибо Валерий Шахамболетович за просвещение)

Я поняла Валерий

Я поняла Валерий Шахамболетович,это моя невнимательность меня подводит просто,Спокойной ночи!

И всё равно, читая всё это

И всё равно, читая всё это "...У нас такая домашняя была когда-то и я решила ее ТАК ЖЕ как Саша здесь. И мне тогда сказали,что лучше воспользоваться циклом "for i:=n downto 1 do..." и сразу же вывести максимум ... ", я уверен, что у Вас проблемы и что с ними надо разбираться ...

Сотрировка МП записей файлов

  1. procedure SortFile(var f:_file); // type _file=file of integer;
  2.   var i,j,x,y:longint;
  3. begin
  4.  for j:=2 to FileSize(f)-1 do begin  // итерации
  5.   for i:=0 to FileSize(f)-j do begin  // проход по записям
  6.    seek(f,i); // текущая позиция i
  7.    read(f,x); // читаем х
  8.    read(f,y); // читаем у
  9.    if x>y then begin // если  x>y
  10.     seek(f,i); // вернулись к позиции i
  11.     write(f,y,x); // записали в обратном порядке, т. е. сначала у, потом х
  12.    end; // if
  13.   end;//  внутренний for
  14.  end;// внешний for
  15. end;// SortFile

А Вы испытайте в деле свою

А Вы испытайте в деле свою сортировку, Никита.

Не знаю в чём ошибка, но

Не знаю в чём ошибка, но мои проверки проходит (выхода за границы индекса нет )

Ну и чудненько.

Разве я сказал что там ошибка и не работает?

нет, Вы не говорили. Но я не

нет, Вы не говорили. Но я не пойму что в коде не так

Задача

Написать программу, которая формирует по заданному натуральному n, файл следующей структуры :
1
2 3
4 5 6
7 8 9 10
...

  1. program Exmpl_1;
  2.  var f:text;
  3.   s:string;
  4.   n:Integer;
  5.  
  6.  procedure triangle(n:integer);
  7.   var b,i,j:integer;
  8.   pp:boolean;
  9.  begin
  10.   pp:=false; // инициализация
  11.   i:=1;
  12.   b:=1;
  13.   for j:=1 to n do begin // от 1 до n
  14.    repeat
  15.     write(f,i,' '); // записываем первый элемент
  16.     inc(b); // увеличиваем b
  17.     inc(i); // увеличиваем i
  18.     if i=n+1 then  begin // если   i=n+1 ...
  19.      pp:=true  // pp присвоили  true
  20.     end; // if
  21.    until b>j; //выполняем пока b>j
  22.    if pp then break; // если pp=true , выходим из цикла
  23.    writeln(f); // переход на новую строку в файле f
  24.    b:=1; // b:=1
  25.   end; // for
  26.  end;//  procedure triangle
  27.  
  28. begin
  29.  write('Имя выводного файла:');
  30.  readln(s);
  31.  assign(f,s);// привязка
  32.  write('n = ');
  33.  readln(n);
  34.  rewrite(f);// создаем пустой файл
  35.  triangle(n); // вызываем процедуру
  36.  close(f); // закрыли файл
  37. end.

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

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

P.s. Комментарии типа:
inc(b); // увеличиваем b
inc(i); // увеличиваем i
совсем уж никчёмные ...

Ок

учту, при решении подобных задач

Как вариант решения

Как вариант решения по условию в Вашей версии:

  1. procedure triangle(n:integer; var f: Text);
  2.   Var i, inLn, lnCount: LongInt;
  3. Begin
  4.    i:=1;  // значение первого элемента
  5.    inLn:=1; // число элементов в 1-й строке
  6.    Repeat
  7.       For lnCount:=1 to inLn Do Begin  // формируем строку
  8.           Write(f,i:3); Inc(i)
  9.       End;
  10.       WriteLn(f); // к следующей строке ...
  11.       Inc(inLn); //... в которой будет на один элемент больше
  12.    Until i>n;
  13. End;

Обратите внимание на выбор имён переменных и на смысловой (т.е. в терминах поставленной задачи), а не технический (прибавили, зациклили и т.п.) стиль комментариев.

Для быстрой проверки этого кода запустите его, например, так:

  1. ...
  2. Begin
  3.    triangle(20,output);
  4.    readln;
  5. End.

Объясните себе, что произойдёт и почему.

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

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

Что Вы понимаете под

Что Вы понимаете под "неоднократыми запросами" к тексовому файлу? Если речь идёт о различных выборках из файла (отличники, задолжники и т.п.), то каждый новый просмотр файла, безусловно возможен только после его "перемотки" в начало (т.е. закрытия с последующим переоткрытием).

И еще вопросы по текстовым

И еще вопросы по текстовым файлам. Как определить совпадают ли два файла? И как, например, из одного файла переписать все его строки в другой?

под "неоднократными

под "неоднократными запросами" это и имела в виду. Попробую

юнит очереди в ТП

  1. unit Queue;
  2. interface // интерфейсная часть
  3.  procedure ini;// инициализация
  4.  procedure push(x:integer); // добавить элемент в конец очереди
  5.  function pop:integer; // снять элемент с начала очереди
  6.  function emp:boolean; // проверка на пустоту очереди
  7. implementation// реализационная часть
  8.  const lim =150;
  9.  var  a:array[1..lim]of integer;
  10.   back,front:0..lim; // front - указатель начала очереди; back - указатель конца очереди  
  11.  procedure ini; // инициализация указателей
  12.  begin
  13.   back:=0; // конец очереди
  14.   front:=0;// начало очереди
  15.  end;
  16.  procedure push(x:integer);//добавление элементов в очередь
  17.  begin
  18.   inc(back); // передвинули указатель конца
  19.   a[back]:=x;// записали в него x (теперь back указывает на х)
  20.  end;
  21.  function pop:integer;// снять элементы очереди
  22.  begin
  23.   inc(front); //передвинули указатель начала
  24.   pop:=a[front]; // сняли элемент ( указатель начала находится в положении рор)
  25.  end;
  26.  function emp:boolean; // проверка на пустоту
  27.  begin
  28.   emp:=(front=back); // если указатель начала совпал с указателем конца, то очередь пуста
  29.  end;
  30. begin // инициализационная часть
  31.  ini;// инициализация очереди
  32. end.

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

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

Здрпвствуйте! Я думаю, что не

Здрпвствуйте! Я думаю, что не совсем правильно. После begin нужен end; ... так программа выведет ошибку.