![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
3 kilos |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вобщем первоначальная задача была такова - ввести 7 чисел и получить по ним гистограмму. Программу я написал, вот её код
Код program lab7; uses crt, graph; var j,k,err,x,y,y1,i,a:integer; begin i:=detect; initgraph(i,j,'d:\bp\bgi'); err:=graphresult; if err <> grOK then writeln(grapherrormsg(Err)) else begin writeln('draiver:',getdrivername,'regim:',getModename(k)); setcolor(15); x:=150; i:=0; y1:=400; outtext('vvedite 7 4isel A v %'); outtextXY(110,455,'Diagramma vvedennyh zna4enii'); rectangle(100,150,500,450); repeat y:=400; readln(a); setfillstyle(i+1,i+1); For k:=1 to a*2 do begin delay(500); y:=y-1; bar3d(x-30,y,x,y1,10,true); end; x:=x+50; i:=i+1; until i>7; closegraph; end; readln; end. Но тут преподователь поставил мне новую задачу - пронормировать гистограмму. Зачем он это попросил? Отвечаю - программа не универсальна, т.е. если я введу например 1000, то соответствующий столбец гистограммы полезет куда-то вверх за экран. В чем заключается нормирование: 1 - Мы вводим 7 чисел, после которого находится максимальное число. 2 - Независимо какие остальные числа мы ввели, надо найти процентное соотношение этих чисел к самому максимальному числу. (т.е если максимальное число 300, то 30 - это 0.1 часть от 300) 3 - По этой процентной зависимости программа строит универсальную гистограмму. Т.Е. максимальному числу всегда будет соответствовать одна и та же высота столбца, а там уже как введем. Вот тут и нужна мне ваша помощь, т.к. я так понял тут надо иметь дело с массивом( а с массивами я плохова-то дружу), но деревянным способом сравнивать 7 чисел - это кошмар. Еще я понял, программку наверное придется конкретно изменить ![]() П.С. Процедуры естественно только приветствуются, иначе тут никак. Сообщение отредактировано: 3 kilos - 4.03.2006 11:18 |
![]() ![]() |
klem4 |
![]()
Сообщение
#2
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
Храни 7 чисел в массиве, далее находи номер максимального элемента, далее сортируй массив по процентному отношения относительно наибольшего элемента и выводи гастаграмму, высота каждой точки кторой будет равна процентномуотношению относиельно максимального ...
-------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
3 kilos |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Храни 7 чисел в массиве, далее находи номер максимального элемента, далее сортируй массив по процентному отношения относительно наибольшего элемента и выводи гастаграмму, высота каждой точки кторой будет равна процентномуотношению относиельно максимального ... Это я понимаю, что я прошу, так это код, ибо с массивами я плохо дружу ![]() Сообщение отредактировано: 3 kilos - 4.03.2006 11:22 |
klem4 |
![]()
Сообщение
#4
|
![]() Perl. Just code it! ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: ![]() ![]() ![]() |
У нас тут не принято решать задачу полностью ... что тебе не ясно в реализации ? Не умеешь работать с массивами ? У нас есть замечательный FAQ, в нем же найдешь и методы сортировок.
-------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
3 kilos |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
У нас тут не принято решать задачу полностью ... что тебе не ясно в реализации ? Не умеешь работать с массивами ? У нас есть замечательный FAQ, в нем же найдешь и методы сортировок. Я понимаю что не принято, но может найдется человек, который до вторника не поленится и напишет. Просто инфа отнимает очень много времени, а делов до вторника масса. |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
А может ты до вторника воспользуешься поиском и введешь в него слово "гистограмму"? Я, между прочим, выкладывал уже такое на форум...
|
3 kilos |
![]()
Сообщение
#7
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
|
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
ИМЕННО для твоего случая и не будет - для него надо заново открыть чистый лист и написать С НУЛЯ всю программу. А несколько строк (ввод массива) можешь и подправить до вторника ... Дай ссылки на 3 топика, которые ты нашел...
|
3 kilos |
![]()
Сообщение
#9
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
ИМЕННО для твоего случая и не будет - для него надо заново открыть чистый лист и написать С НУЛЯ всю программу. А несколько строк (ввод массива) можешь и подправить до вторника ... Дай ссылки на 3 топика, которые ты нашел... Попробовал твою программу http://forum.pascalnet.ru/index.php?s=&sh...indpost&p=56448 Все бы хорошо, но при вводе чисел больше 100 гистограмма слетает. Да и та программа очень сложная по сравнению с моей. Сообщение отредактировано: 3 kilos - 4.03.2006 12:28 |
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Значит что-то не то изменял... Эта гистограмма ДОЛЖНА работать спокойно при значениях элемента массива до 5000 (это минимум, в принципе допустимо и до 30 тысяч)...
Вот тут тоже (ограничения - только касаюшиеся типа Integer): Работа с каталогами и файлами + Здесь: Файлы и графика ... Еще примеры привести? Что, ВСЕ ЭТО не работает? А не кажется ли тебе, что это... Странновато? Все тестировали - все было в порядке, вдруг пришел ты, и перестало работать ![]() P.S. А насчет сложности - ты меня извини, но у тебя и масштабирования нет... Добавляешь функциональность - добавляется сложность, что ж ты хотел... |
3 kilos |
![]()
Сообщение
#11
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Написал 2 процедуры для нахождения процентного соотношения введенных чисел относительно максимального.
Код PROGRAM M1; USES crt; TYPE mas=array[1..7] of real; VAR a:mas; max:real; Procedure vvod_max(var a:mas; var max:real); Var i:byte; num:byte; Begin max:=0; for i:=1 to 7 do begin writeln('vvedite ',i,' element massiva !'); readln(a[i]); if a[i]>max then max:=a[i] end End; Procedure proc(var a:mas; max:real); Var i:byte; Begin ClrScr; writeln('Protsentnoe sootnoshenie 4isel massiva :'); for i:=1 to 7 do begin a[i]:=a[i]/max; writeln(i,' - ',a[i]:2:2) end; readln End; BEGIN ClrScr; vvod_max(a,max); proc(a,max) END. Помогите хоть теперь состыковать полученные данные с высотой столбца диаграммы. Ну пожалуйста. Сообщение отредактировано: 3 kilos - 4.03.2006 20:54 |
3 kilos |
![]()
Сообщение
#12
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вот что интересно, процентное соотношение - десятичное число. Гистограмма не может строиться по десятичным значениям, значит надо использовать округление ? Но при вводе очень больших и очень малых чисел одновременно округление может дать 0 - гистограммы вообще не будет кроме столбца с максимальным числом. Как тут быть?
Сообщение отредактировано: 3 kilos - 5.03.2006 16:25 |
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
uses crt; Так устроит? Цитата Но при вводе очень больших и очень малых чисел одновременно округление может дать 0 - гистограммы вообще не будет кроме столбца с максимальным числом А ты попробуй в Excel ввести ОЧЕНЬ большие и ОЧЕНЬ маленькие числа, и по ним составить гистограмму...Я смотрю, ты не совсем понимаешь смысл этого слова: "гистограмма"... Это СООТНОШЕНИЕ между элементами массива, следовательно если ты ввел <1, 1, 1, 2, 3, 4, 5>, то все покажется нормально, а вот в случае <1, 1, 1, 2, 30000, 4, 5> ОТНОШЕНИЕ максимального числа к остальным настолько велико, что остальными приходится пренебречь, и отображать только максимальное. Уж так получилось, что экран монитора имеет конечную разрешающую способность... |
3 kilos |
![]()
Сообщение
#14
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
volvo
Преподаватель у нас просто с юмором. Сам еще просто наперед не мог представить, какие проблемы могут возникнуть. Я просто у него даже переспросил: - А если я введу 1 и 1000000 то что будет? - Ну 1 будет очень маленький кубик Хех. Пардон, но либо я не понял как твоя программа работает, либо чот не так считается. По какому принципу у тебя считается процентное соотношение? Ввел следующие числа: 10 9 8 7 6 5 4 Получил данные: 1 - 23.00 2 - 20.70 3 - 18.40 4 - 16.10 5 - 13.80 6 - 11.50 7 - 9.20 Хотя по идее должно быть 1 - 1 2 - 0.9 3 - 0.8 4 - 0.7 5 - 0.6 6 - 0.5 7 - 0.4 Убрал умножение * max_height: процентное соотношение в порядке, но гистограмма вообще не та. Сообщение отредактировано: 3 kilos - 5.03.2006 17:00 |
volvo |
![]()
Сообщение
#15
|
Гость ![]() |
Цитата По какому принципу у тебя считается процентное соотношение? У меня там НЕ процентное соотношение считается, а сразу ВЫСОТА соответствующей колонки (чтоб 2 раза не считать)... Для этого и умножается на max_height.Если же ты умножение убрал, то у тебя будут все колонки одинаковые - единичные. Ибо по определению процентное соотношение не может быть больше 1 |
3 kilos |
![]()
Сообщение
#16
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вот собсна товарисчи вам и окончательный вариант программы. Все как видите красиво, может кому пригодится. Тему можно закрывать, всем спасибо за участие, ждите еще вопросов =))
Код PROGRAM M1; USES crt,graph; TYPE mas=array[1..7] of real; VAR a:mas; max:real; Procedure vvod_max(var a:mas; var max:real); Var i:byte; num:byte; Begin max:=0; for i:=1 to 7 do begin writeln('Vvedite ',i,' 4iclo'); readln(a[i]); if a[i]>max then max:=a[i] end End; Procedure proc(var a:mas; max:real); Var i:byte; Begin ClrScr; writeln('Vvedennie 4isla:'); for i:=1 to 7 do begin writeln(a[i]:2:0); end; writeln('Procentnoe sootnoshenie 4isel otnositelno maksimalnogo:'); for i:=1 to 7 do begin a[i]:=(a[i]/max)*100; writeln(i,' - ',a[i]:5:2,'%') end; readln End; Procedure graf(a:mas); var j,k,err,x,y,y1,i:integer; Begin i:=detect; initgraph(i,j,'d:\bp\bgi'); err:=graphresult; if err <> grOK then writeln(grapherrormsg(Err)) else begin writeln('driver:',getdrivername,'regim:',getModename(k)); setcolor(15); x:=150; i:=0; y1:=400; outtextXY(110,455,'Gistogramma vvedennih zna4enii'); rectangle(100,150,500,450); repeat y:=400; setfillstyle(i+1,i+1); For k:=1 to trunc(a[i+1])*2 do begin delay(1000); y:=y-1; bar3d(x-30,y,x,y1,10,true); end; x:=x+50; i:=i+1; until i>6; readln; closegraph; end; End; BEGIN ClrScr; vvod_max(a,max); proc(a,max); graf(a) END. |
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 18:08 |