Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Не работает программа на Turbo Pascal  (Прочитано 41874 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
v.korleone
Помогающий

ua
Offline Offline

« Ответ #30 : 15-10-2010 06:40 » 

Нет, нет, нет! Усложнять ничего не будем, здесь хоть бы с этим разобраться Улыбаюсь
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #31 : 15-10-2010 06:57 » 

И можно после каждого ввода вызывать процедуру распечатки состояния множества, чтобы убедиться, что вводимые литеры действительно в него попадают (или не попадают). Может, кое-что прояснится.
Записан

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

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
v.korleone
Помогающий

ua
Offline Offline

« Ответ #32 : 17-10-2010 06:48 » 

По совету Dale сделал, проверку состояния множества на попадание в него вводимых литер:
Код:
Program L;

Uses Crt;

const
q=8;
MinRangeval = 'a';
            MaxRangeval = 'z';

type
Range = MinRangeval..MaxRangeval;
Rangeitem = char;


var
SetA,SetB,SetComplement,SetUnion,SetIntersection: Set of Range;
            i,j,x,k: Rangeitem;
            e,r: integer;
...
BEGIN

ClrScr;

SetA := [];
for e := 1 to q do
begin
ClrScr;
Write('Vvedite ', e, '-y element mnojestva A: ');
readln(x);
SetA := SetA + [x];
                        {Proverka mnojestva}
                                for i := Minrangeval to Maxrangeval do
             if i in SetA then
write(i,' ');
           Writeln('');
           end;
...
            Writeln('Elementi mnojestva A: ');
for i := Minrangeval to Maxrangeval do
if i in SetA then
write(i,' ');
Writeln('');


Я извиняюсь, что не сделал процедурой, но суть написанного думаю понятна. После проверки оказалось, что все равно идет ввод или вывод (пишу вывод потому как думаю, что может неправильно написал цикл вывода) элементов множества состоящего из одного символа.
Начал задумываться  Здесь была моя ладья... о разных индексах (е и i) в этих двух циклах. Когда был численный тип, тип переменной i был одинаковым для 2-х циклов и составлял для ввода множества 8, а для вывода множества 20. Т.е. можно было ввести 8 элементов множества, величина которых была в диапазоне 1..20. Сейчас у нас разные типы индексов: е:integer и i:RangItem (по сути char), что и составляет проблему.   
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #33 : 17-10-2010 15:05 » 

Цитата
Начал задумываться   о разных индексах (е и i) в этих двух циклах. Когда был численный тип, тип переменной i был одинаковым для 2-х циклов и составлял для ввода множества 8, а для вывода множества 20. Т.е. можно было ввести 8 элементов множества, величина которых была в диапазоне 1..20. Сейчас у нас разные типы индексов: е:integer и i:RangItem (по сути char), что и составляет проблему.   
Прочитал несколько раз. Ни хрена не понял...

Посмотрел код -  не понял что такое Проверка множества. Зачем именно в этом месте?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #34 : 17-10-2010 15:21 » 

Начал задумываться  Здесь была моя ладья... о разных индексах (е и i) в этих двух циклах. Когда был численный тип, тип переменной i был одинаковым для 2-х циклов и составлял для ввода множества 8, а для вывода множества 20. Т.е. можно было ввести 8 элементов множества, величина которых была в диапазоне 1..20. Сейчас у нас разные типы индексов: е:integer и i:RangItem (по сути char), что и составляет  проблему.

Проблема создана искусственно. Зачем писать программу, которая позволяет работать лишь с множествами из 8 элементов? Ведь именно отсюда и появляется целочисленный индекс.

Выше Sla предложил хорошую идею: вводить не заданное число элементов множества, а произвольное. Пока вводимые значения лежат в заданном диапазоне ('a'..'z'), мы добавляем их к нашему множеству. Если условие не выполняется (например, ввели '0' или пустую строку), ввод множества завершается и программа идет дальше. Одновременно и просто, и универсально: можно выяснить экспериментально, а как ведут себя множества с различным числом элементов? с одним элементом? пустые множества? и т.д.

Конечно, это уже мало похоже на первоначальную программу. Но раз уж взялись доводить до ума, сначала приведем ее в порядок, а потом заставим работать. Если это вообще понадобится, ведь правильно написанные программы в отладке не нуждаются.
Записан

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

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
v.korleone
Помогающий

ua
Offline Offline

« Ответ #35 : 18-10-2010 05:30 » 

Sla, постом выше Dale предложил
Цитата
И можно после каждого ввода вызывать процедуру распечатки состояния множества, чтобы убедиться, что вводимые литеры действительно в него попадают (или не попадают). Может, кое-что прояснится.
что я и сделал, только не процедурой, а обыкновенным циклом.
Dale, идея то хорошая, но я не знаю как зациклить это дело. Я так понял, что for здесь не прокатит, думаю нужно использовать while. А как написать условие? Как написать, что пока вводимый элемент х лежит в диапазоне a..z то продолжать ввод? 
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #36 : 18-10-2010 05:57 » 

Dale, идея то хорошая, но я не знаю как зациклить это дело. Я так понял, что for здесь не прокатит, думаю нужно использовать while. А как написать условие? Как написать, что пока вводимый элемент х лежит в диапазоне a..z то продолжать ввод?

Специально для подобных случаев в Паскале предусмотрен цикл с постусловием:

Код:
repeat
  ReadLn(c);
  if ((c >= MinRangeVal) and (c <= MaxRangeVal)) then
    SetA := SetA + [c];
until ((c < MinRangeVal) or (c > MaxRangeVal));

Вводим литеры до тех пор, пока не обнаружим литеру вне нашего допустимого диапазона. Если литера допустима, добавляем ее в множество.

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

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

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
v.korleone
Помогающий

ua
Offline Offline

« Ответ #37 : 18-10-2010 14:15 » 

Dale, большое спасибо! Есть проблема. Написал так:
Код:
Program L;
Uses Crt;

const q=8;
      MinRangeval = 'a';
      MaxRangeval = 'z';

type  Range = MinRangeval..MaxRangeval;
type  Rangeitem = char;

var   SetA,SetB,SetComplement,SetUnion,SetIntersection:set of Range;
      i,j,x,k:Rangeitem;
      e,r:integer;

BEGIN
     ClrScr;

     SetA:=[];
     Writeln('Vvedite element mnojestva A: ');
     repeat
        readln(x);
        if ((x >= MinRangeval) and (x <= MaxRangeval)) then
           SetA := SetA + [x];
           Writeln(x);
     until ((x < MinRangeval) or (x > MaxRangeval));
...
Вставил
Цитата
Writeln(x);
чтобы проверить что мы вводим. В итоге, я ввожу допустим 2 символа, а печатается один символ. Или я не правильно вывожу литеры в этом случае? Тогда как правильно?
P.S. Процедура предложенная Sla для вывода элементов множеств (А и В) тоже выводит один символ.
« Последнее редактирование: 18-10-2010 14:32 от v.korleone » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #38 : 18-10-2010 14:30 » 

Код:
count=0;
     repeat
        Write('Vvedite element mnojestva A: ');
        readln(x);
        if ((x >= MinRangeval) and (x <= MaxRangeval)) then
           begin SetA := SetA + [x]; count = count+1;
     until ((x < MinRangeval) or (x > MaxRangeval));
Writeln('Всего было введено:',count,' элементов множества');
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
v.korleone
Помогающий

ua
Offline Offline

« Ответ #39 : 18-10-2010 14:41 » 

Sla, что-то я не пойму последний код. Я вижу Вы меня не понимаете. Приведу отображение проги, на момент моего последнего вопроса:
Vvedite element mnojestva A:
qw
q
er
e
ty
t
т.е. я ввожу qw, а проверяю и получается, что записалось только q. Или отображается только q а не qw. Предложеный Вами код считает количество итераций, но не символов.
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #40 : 18-10-2010 14:45 » 

Все правильно!!!
Readln считывает из консоли до конца строки, но так как просят один символ, то и вводится один символ!!!
поэтому твой qw  и превращается в ОДИН!

Чтобы закончить ввод элементов множества, тебе необходимо ввести элемент, который НЕ ВХОДИТ в  заявленный тобой диапазон символов(литер), Например, А


Добавлено через 1 минуту и 40 секунд:
v.korleone, ты же хочешь ввода символов из строки
Это можно, конечно, сделать.
Но!!!! на данном этапе вводи элементы множества по одному.
« Последнее редактирование: 18-10-2010 14:46 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
v.korleone
Помогающий

ua
Offline Offline

« Ответ #41 : 18-10-2010 14:50 » 

Ок. Как попросить Улыбаюсь чтобы вывел все символы? Мне нужно ввести qw и чтобы оно вывело мне qw. Должно быть так:
Vvedite element mnojestva A:
qw
qw
er
er
ty
ty
Вывод символов после ввода, на данном этапе это проверка, что все введено правильно. В конечном варианте программы, вывод элементов множества будет, сделан после ввода всех элементов множеств А и В.
« Последнее редактирование: 18-10-2010 14:53 от v.korleone » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #42 : 18-10-2010 14:58 » 

у тебя должно быть так
Vvedite element mnojestva A:
q
w
e
r
t
y
A

После проверки:
Элементы множества А
eqrtwy
Если не ошибся в алфавите
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
v.korleone
Помогающий

ua
Offline Offline

« Ответ #43 : 18-10-2010 15:04 » 

Тогда Вы не поняли, что мне нужно Жаль Мне нужно:
Vvedite element mnojestva A:
qwe
rty
uio
asd
A
Vvedite element mnojestva B:
qwe
uio
vbn
xdf
B
A+B: qwe rty uio asd vbn xdf
A*B: qwe uio
A-B: rty asd
Как это сделать?
« Последнее редактирование: 18-10-2010 15:05 от v.korleone » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #44 : 18-10-2010 15:08 » 

Это точно, что мы тебя не поняли

Тебе нужно множество не символов, а строк
Set of String;

НО!!!!

Цитата
Множество — это структурированный тип данных, представляющий собой набор взаимосвязанных по какому-либо признаку или группе признаков объектов, которые можно рассматривать как единое целое. Каждый объект в множестве называется элементом множества.

Все элементы множества должны принадлежать одному из порядковых типов, содержащему не более 256 значений. Этот тип называется базовым типом множества. Базовый тип задается диапазоном или перечислением.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
v.korleone
Помогающий

ua
Offline Offline

« Ответ #45 : 18-10-2010 15:15 » 

Жаль Это что же выходит, теперь практически все с нуля? Пока написал, такое:
Код:
Program L;
Uses Crt;

const q=8;
      
var   SetA,SetB,SetComplement,SetUnion,SetIntersection:set of String;{При set of Sting - начинает ругаться. Также ругается
если написать type Range = string и потом написать set of Range}
        i,j: integer;
        StrEl:string;

BEGIN
     ClrScr;

     SetA:=[];
     for i:=1 to q do
     begin
     ClrScr;
     Writeln('Vvedite ',i,'-y element mnojestva A: ');
     Readln(StrEl);
     SetA:=SetA+[StrEl];{Эта запись не работает. Как сделать, чтобы можно было добавлять записи стринг в множество?}
     end;
Помогите! До завтра нужно написать!
« Последнее редактирование: 18-10-2010 16:05 от v.korleone » Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #46 : 18-10-2010 18:52 » new

v.korleone,
1. Ты изначально поставил неверную задачу.
1а Соответственно увел нас в другую сторону.
2. С таким знанием (подходом), увы, до завтра никак не успеем.
3. Предлагаю
3а. Просишь еще неделю.
3б дописываешь То что МЫ тебя просим, для закрепеления материала.
3в. Сам (с нашей помощью или без нее) на основе полученных знаний Выполняешь Задание.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
v.korleone
Помогающий

ua
Offline Offline

« Ответ #47 : 18-10-2010 19:50 » 

По моему понятно было описано
Цитата
Теперь новая задача, нужно чтобы можно было вводить вместо 8 числовых значений, 8 символьных значений, по 8 символов (a-z) в каждом сообщении.
Я потом еще сам удивился почему работаем с char, а не string  Здесь была моя ладья... Ладно, бывает. Может действительно, мне следовало описать конкретнее.
Ок. Жду вашей помощи по string.
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #48 : 18-10-2010 19:58 » 

Давай закончим функционал с простым множеством

1. Ввод
2. Вывод
3. Операции с множествами.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
v.korleone
Помогающий

ua
Offline Offline

« Ответ #49 : 18-10-2010 20:03 » 

Sla, не много не понял сообщения  А черт его знает...
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #50 : 18-10-2010 20:07 » 

Мы не закончили учиться работать с простым множеством.

Не умеем вводить элементы, не умеем выводить.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #51 : 18-10-2010 20:11 » 

Жду вашей помощи по string.

Предлагаю следующий план действий.

1.
Давай закончим функционал с простым множеством
- без всякого сомнения. Не разобравшись с простым, бесполезно браться за сложное.

2. Разобравшись с п.1, учим программу:
  • нумеровать вводимые строки;
  • находить строку по номеру;
  • находить номер для заданной строки.

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

Постарался изложить максимально кратко. Надеюсь, понятно?
Записан

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

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines