|
Гость
Практика (реш.задач)
|
Вт 14 Июн 2005 12:52
Anna
|
|
|
Привет всем и модератору в том числе! Прошу помочь c листингом программы.
Условие таково: Написать программу посещения студентами дисплейного класса. Учесть приход и уход студентов в течение занятий. Данные представить в виде линейного списка. (Моя тема-Динамические переменные.)
Спасибочки заранее. ![Rolling Eyes](images/smiles/icon_rolleyes.gif)
|
|
|
Dobrinya Ivashenko
Ответик по "практике"
|
Вт 14 Июн 2005 12:58
dobrinya
|
|
|
Салютик, Анютка.
Ты у нас первая по практике, так сказать. Лови решение. Только, знаешь, листинг листингом, а вот самой решить и разобраться - совсем другое дело. Короче, больше не размещаею решение задач в программном коде. Не обижайся. Будем расматривать только локальные проблемы и трудности.
TYPE
Link=^data; {указатель на тип данных }
data=record {описание самого типа данных }
FIO:string[50]; {ФИО }
timeStart,timeEnd:string[5]; {время нчала и конца (15:03) }
next:Link; {указатель на следующую запись}
end;
VAR
P,First:Link; {указатели на запись: текущую, первую}
m:byte; {для меню }
{добавление новой записи в список}
PROCEDURE addFirst(a:Link);
BEGIN
a^.next:=First;
First:=a;
END;
{ввод данных в текущую запись}
PROCEDURE InputData;
BEGIN
P:=new(Link);
write('Введите ФИО: ');
readln(P^.FIO);
write('Введите время начала: ');
readln(P^.timeStart);
write('Введите время окончания: ');
readln(P^.timeEnd);
addFirst(P);
END;
{вывод на экран}
PROCEDURE Print;
var
curr:Link; {указатель на очередную запись }
count:integer; {счетчик }
BEGIN
count:=0;
curr:=First; {установить указатель на первую запись}
while curr<>nil do
begin
inc(count);
writeln(count,') ',curr^.FIO:55,curr^.timeStart:10,curr^.timeEnd);
curr:=curr^.next; {перейти к очередной записи }
end;
readln;
END;
{===== основная программа =====}
BEGIN
new(P); {создать новую динамическую переменную и установить на нее указатель}
{цикл меню}
repeat
InputData; {ввод данных }
writeln;
writeln('1 - добавить в список');
writeln('2 - распечатать весь список и выйти');
write('=>');
readln(m);
until m=2;
Print; {вывод на экран}
END.
|
|
|
Dobrinya Ivashenko
Всё те же "Динамические структуры данных."
|
Ср 15 Июн 2005 08:30
dobrinya
|
|
|
Друзья, вышеуказанная тема очень актуальна и пригодится при изучении объектно-ориентированного программирования.
Попалась очень интересная, на мой взгляд задачка, от преподавателя ведущего практику, Н.А.Астаховой. Условие таково:
Написать процедуру сортировки линейного списка по возрастанию. Элементами списка являются целые числа.
Прошу поделиться мнениями о пути написания кода. Принимаю замечания.
Программный код (решение проблемы):
uses crt;
TYPE
Link=^data; {указатель на тип данных }
data=record {описание самого типа данных }
FIO:string[50]; {ФИО }
N:integer; {номер }
next:Link; {указатель (адрес) на следующую запись}
end;
VAR
P,First:Link; {указатели на запись: текущую, первую }
m:byte; {для меню }
{процедура - добавление новой записи в список}
PROCEDURE AddData;
BEGIN
P:=new(Link); { выделить память и адрес записать в P}
P^.next:=First; { адрес на следующую запись }
First:=P; { сохраняем адрес первой записи }
{здесь заполняйте запись данными в соответствии с вашим типом }
write('Введите ФИО: ');
readln(P^.FIO);
write('Введите номер: ');
readln(P^.N);
END;
{вывод на экран}
PROCEDURE Print;
var
count:integer; {счетчик для нумерации }
BEGIN
count:=0;
P:=First; {начать с первой записи }
while P<>nil do
begin
inc(count); {увеличить счетчик }
writeln(count,') ',P^.FIO,' ',P^.N);
P:=P^.next; {перейти к очередной записи }
end;
readln;
END;
{процедура - удаление всего списка, освобождение динамической памяти}
PROCEDURE DelData;
BEGIN
P:=First;
while P<>nil do
begin
First:=P^.next; {сохранить адрес указывающий на следующую запись}
dispose(P); {освободить память по текущему адресу }
P:=First; {сохраненный адрес записать в P }
end;
END;
{процедура - сортировки списка по возрастанию}
PROCEDURE Sort;
var
P1,P2,TMP:Link; {P1,P2 - адрес записи для циклов, TMP - временно}
BEGIN
new(TMP); {выделим память для TMP }
P1:=First; {начать цикл 1 с первой записи }
while P1<>nil do {выполняем пока не дошли до конца цикла 1}
begin
P2:=First; {начать цикл 2 с первой записи }
while P2<>nil do {выполняем пока не дошли до конца цикла 2}
begin
if P1^.N<P2^.N then
begin
{сохраняем данные в временную переменную}
{адрес на следующую запись не изменяем! }
TMP^.FIO:=P1^.FIO;
TMP^.N:=P1^.N;
{делаем обмен данными по адресу P1 }
P1^.FIO:=P2^.FIO;
P1^.N:=P2^.N;
{делаем обмен данными по адресу P2 }
P2^.FIO:=TMP^.FIO;
P2^.N:=TMP^.N;
end;
P2:=P2^.next; {переходим к следующей записи цикла 2}
end;
P1:=P1^.next; {переходим к следующей записи цикла 1}
end;
dispose(TMP); {освобождаем память, занимаемую TMP }
END;
{==== основная программа ====}
BEGIN
clrscr
First:=nil; {нет записей в списке, адрес пустой }
repeat { меню }
AddData;
writeln('1 - добавить новую запись');
writeln('2 - выйти и далее...');
write('=>');
readln(m);
until m=2; {end меню}
writeln('== До сортировки ==');
Print;
Sort;
writeln('== После сортировки ==');
Print;
DelData;
readkey;
END.
{Примечание: First - первая запись с конца!}
Данный пример показывает: как вводить данные в список с помощью меню, как вывести список на экран, как отсортировать список, как освободить пямять занимаемую списком.
|
|
|
freeman
|
Ср 02 Ноя 2005 10:28
freeman
|
|
|
А вот такая задачка: написать программу выводящюю саму себя на экран(файлами пользоваться запрещаеться!)
|
|
|
Alexey N. Sergeev
|
Чт 03 Ноя 2005 13:52
alexey
|
|
|
freeman писал(а): | А вот такая задачка: написать программу выводящюю саму себя на экран(файлами пользоваться запрещаеться!) |
Если файлами не пользоваться, то возможно ли это?
|
|
|
Dobrinya Ivashenko
OTVET
|
Пн 07 Ноя 2005 09:48
dobrinya
|
|
|
Sorry, сколько у меня на это есть времени?
Уже начинаю.
В скором времени ждите листинга, слава Богу, а то уж совсем скучно стало... ![Very Happy](images/smiles/icon_biggrin.gif)
|
|
|
Dobrinya Ivashenko
|
Пн 07 Ноя 2005 09:55
dobrinya
|
|
|
alexey писал(а): | freeman писал(а): | А вот такая задачка: написать программу выводящюю саму себя на экран(файлами пользоваться запрещаеться!) |
Если файлами не пользоваться, то возможно ли это? |
Дайте возможность кое-что "поднять". В наиближайшее время надеюсь найти метод решения. Наверное возможно. Если условие гласит об этом? Стоит подумать ![Question](images/smiles/icon_question.gif)
|
|
|
freeman
|
Вт 08 Ноя 2005 12:20
freeman
|
|
|
alexey писал(а): |
Если файлами не пользоваться, то возможно ли это? |
Да, вполне реально! (Листинг занимает всего 3 строчки)
|
|
|
Alexander Shagin
|
Чт 10 Ноя 2005 18:37
shagin
|
|
|
freeman писал(а): | alexey писал(а): |
Если файлами не пользоваться, то возможно ли это? |
Да, вполне реально! (Листинг занимает всего 3 строчки) |
А что имеется ввиду под термином "сама себя"?
|
|
|
Alexey N. Sergeev
|
Пт 11 Ноя 2005 15:22
alexey
|
|
|
freeman писал(а): | alexey писал(а): |
Если файлами не пользоваться, то возможно ли это? |
Да, вполне реально! (Листинг занимает всего 3 строчки) |
Заитриговали ![Smile](images/smiles/icon_smile.gif)
|
|
|
Alexander Shagin
|
Пт 11 Ноя 2005 15:44
shagin
|
|
|
freeman писал(а): | А вот такая задачка: написать программу выводящюю саму себя на экран(файлами пользоваться запрещаеться!) |
А я правильно понимаю постановку задачи?
Написать программу, которая выводит на экран свой исходный код (содержимое основного *.pas или *.dpr файла) не используя обращение к диску?
|
|
|
freeman
|
Пн 14 Ноя 2005 12:03
freeman
|
|
|
shagin писал(а): |
А я правильно понимаю постановку задачи?
Написать программу, которая выводит на экран свой исходный код |
Да! Только файла с главной программой.
_________________ 0x2B | ~0x2B = 0xFF
|
|
|
Alexander Shagin
|
Ср 16 Ноя 2005 13:15
shagin
|
|
|
На ум приходит только команда LIST из языка BASIC
(правда и файлов у нас вообще нет
10 LIST
|
|
|
freeman
|
Ср 16 Ноя 2005 14:09
freeman
|
|
|
shagin писал(а): | На ум приходит только команда LIST из языка BASIC
(правда и файлов у нас вообще нет
10 LIST |
Ладно хватит глумиться, задача была конечно шуторчная , я ее нашел на одном из форумов по программированию. Листинг был на C++
Код: |
#include <iostream>
int main() {
std::cout<<"#include <iostream> \n \
int main(){ \n \
std::cout<<\"...\"; \n \
return 1; \n \
} \n";
return 1;
}
|
На паскале это выглядит примерно так
Код: | uses crt
begin
WriteLn('uses crt begin и т.д')
end. |
Надеюсь юмор понятен .
_________________ 0x2B | ~0x2B = 0xFF
|
|
|
Alexey N. Sergeev
|
Ср 16 Ноя 2005 14:24
alexey
|
|
|
freeman писал(а): |
На паскале это выглядит примерно так
Код: | uses crt
begin
WriteLn('uses crt begin и т.д')
end. |
Надеюсь юмор понятен . |
Юмор понятен, но эта программа не выводит сама себя. Например, посчитай, сколько раз в программе встретится сочетание 'uses crt' и сколько раз оно встретится в распечатке ![Smile](images/smiles/icon_smile.gif)
|
|
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|