Убедительная просьба ко всем, кто выкладывает исходники: 1. Обязательно пользуйтесь тэгом code (иначе очень трудно читать)
2. Старайтесь делать отступы
Если вы хотите чтобы вам помогли в написании программы, внятно излагайте задание!
Прежде чем задать вопрос, воспользуйтесь учебником
Возможно, что нужная вам программа уже написана, поэтому советую просмотреть список здесь и здесь Отредактировано куратором: Lord_of_Darkness. Дата: 07.07.2006 19:36
Member
Статус: Не в сети Регистрация: 05.07.2004 Откуда: г. Москва
Код:
uses crt; var mas: array[0..1000] of integer; mmax, mmin, msum, mcount, i : integer; begin clrscr; i:=0; while mas[i]<>0 then begin writeln('M[', i , ']= '); read(mas[i]); inc(i); end; mcount:=i-1; i:=0; msum:=0; mmax:=0; mmin:=mas[0]; while mas[i]<>0 then begin msum:=msum+mas[i]; if trunc(mas[i]/3)=0 then begin if mas[i]>mmax then mmax:=mas[i]; if mas[i]<mmin then mmin:=mas[i]; end; inc(i); end; writeln('Сумм: ',msum); writeln('Макс: ',mmax); writeln('Мин: ',mmin); writeln('Кол: ',mcount); readkey; end.
с trunc мог напутать - точно не помню, help-а близко нет.
Нужна функции, которая получает значение после запятой фун(1,56)=0,56 Отредактировано куратором: Lord_of_Darkness. Дата: 05.03.2006 15:18
_________________ "Не припадайте к статуям, нет правды в их ногах."
Куратор темы Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
Russia KamRat
Цитата:
думаю в строчку
значит вариант SergGreen не подходит? Просто сам посуди, как можно выделить отдельные числа из строки вида 756762530 ? Если сделать ввод так: 75 6 76 2 5 3 0 будет уже лучше, но в любом случае реализация разбора такой строки будет не очень легкой и не очень короткой.
ЗЫ на самом деле, судя по дальнейшим вычислениям, уровень программы настолько низок, что вариант с вводом в цикле должен вполне подойти.
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Последний раз редактировалось Lord_of_Darkness 10.03.2006 19:00, всего редактировалось 2 раз(а).
Member
Статус: Не в сети Регистрация: 10.03.2003 Откуда: Россия, Моск...
блин, сейчас надо уйти. С 21,00 до 22,00 здесь будет рабочая прога. Программа элементарная...
Добавлено спустя 3 часа, 20 минут, 1 секунду малец задержался, вот:
Код:
Program Over; Uses CRT; Var I,K,J,S,MIN,MAX : INTEGER; A,B : Array[1..20] Of INTEGER; Function Minimum(MIN,X : INTEGER) : INTEGER; Begin If X<Min Then Minimum:=X Else Minimum:=MIN; End; Function Maximum(MAX,X : INTEGER) : INTEGER; Begin If X>MAX Then Maximum:=X Else Maximum:=MAX; End; Begin Clrscr; Writeln('Vvedite massiv'); Writeln; For I:=1 To 20 Do Begin Write('A[',I,']='); Readln(A[I]); End; {poisk indeksa 0} For I:=1 To 20 Do Begin If A[I]=0 Then K:=I; {slaboe mesto} End; Writeln; Writeln('Nomer nulevogo K=',K); {videlenie elementov kratnih 3 v massiv B} J:=1; S:=0; For I:=1 To K-1 Do If A[I] Mod 3 = 0 Then Begin B[J]:=A[I]; J:=J+1; End Else; Writeln('Kratnie 3'); Writeln; MAX:=B[1]; MIN:=B[1]; {Vivod massiva B} For I:=1 To J-1 Do Begin Writeln('B[',I,']=',B[I]); S:=S+B[I]; MAX:=Maximum(MAX,B[I]); MIN:=Minimum(MIN,B[I]); End; Writeln; Writeln('Summa S=',S); Writeln('MIN=',MIN); Write('MAX=',MAX); Readln; End.
Добавлено спустя 5 минут, 40 секунд Число 20 взято от балды. Можно сделать, чтоб пользователь вводил (плохо помню, но если надо вспомню. Помню что что через пользовательский тип...).
"Слабое место" - смысл в том, что если будет 2 нуля, то определится последний, что не есть гуд. Можно ввести еще одну переменную и сделать из нее счетчки измения К. Если после цикла К равно единице, то все гуд. Или, что более вероятно, лучше использовать другой тип цикла, но, опять же... надо вспоминать.
Еще можно чуток подумать и, как мне кажется, сделать одну функцию вместо двух. Но может и не получится. Добавлено спустя 3 минуты, 4 секунды SergGreen Как сказал бы мой преподаватель: "Ты не интеллигентно пишешь".
Куратор темы Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
m2 надо просто сделать так:
Код:
repeat inc(i); ...... until A[i]=0;
число значащих элементов массива будет равно i-1, а массив сделать [1..100] или даже 1000, вдруг трудолюбивый юзер попадется (читай придирчивый препод SergGreen Я сразу не заметил, но это
Код:
while mas[i]<>0 then begin writeln('M[', i , ']= '); read(mas[i]); inc(i); end;
работать не будет, т.к. ты проверяешь каждый раз еще не заполненный элемент массива.
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Member
Статус: Не в сети Регистрация: 05.07.2004 Откуда: г. Москва
Lord_of_Darkness Согласен:) Надо, repeat...until использовать:)
А вот на счет trunk...ну я же написал, что не помню точно функцию:) и хелпа под рукой нет.
И на счет циклов, где-то читал, что по скорости все циклы равны, но - да, согласен, for использовать лучше...сам хотел поправить, но и так торопился. Решил что не суть важно:)
m2 Ну...понятие интеллигентности у всех разное - предпочитаю короткий а не академически правильный код. Я, например, не увидел смысла вводить лишние функции, тем более, что они применимы только для этой задачи. И выйгрыша не дают не в коде, не в скорости. Разве что написать общую, типа minmax, с переключающим параметром.
[/b]Russia KamRat[b]
Писал за 5 минут до ухода домой - звиняйте. Хотя такая простая ошибочка с while...обыдно:(
_________________ "Не припадайте к статуям, нет правды в их ногах."
Member
Статус: Не в сети Регистрация: 10.03.2003 Откуда: Россия, Моск...
SergGreen
Ни у кого нет программки для сортировки массивов (от наименьшего к наибильшему)? Массив рандомный, число элементов вводит пользователь. Алгоритм есть (два метода), но времени на реализацию нет. Как всегда дотянул до последнего.
Куратор темы Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
m2 у меня на ПС и сайте есть методом Шелла, правда на Delphi, но и в паскале работать будет. Добавлено спустя 1 минуту, 1 секунду А вообще методов много, в школах обычно используют метод пузырька и иже с ними
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Member
Статус: Не в сети Регистрация: 10.03.2003 Откуда: Россия, Моск...
А алгоритм таков, находим максимальный элемент, ставим на последнее место. Находи максимальный для -1 элементов и так далее... Сортировка обменом кажется называется Отредактировано куратором: Lord_of_Darkness. Дата: 05.03.2006 15:20
Куратор темы Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
неэффективно. попробуй так:
берем два рядом стоящих элемента и если 1-й больше 2-го - меняй их местами, иначе идем далее. Когда число перестановок за один проход будет равно 0, массив окажется отсортирован.
ЗЫ советую не изобретать колесо, а воспользоваться готовым алгоритмом.
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Member
Статус: Не в сети Регистрация: 10.03.2003 Откуда: Россия, Моск...
Lord_of_Darkness задание такое...начинаю делать, прогу выложу вечерком, может что-то посоветуете Добавлено спустя 1 час, 9 минут, 20 секунд Ну вот... не работает...Почему-то не N не меняется
Код:
Program Sort; Uses CRT; Var A,B : Array[1..20] Of INTEGER; I,MAX,MAX1,C,N,K : INTEGER; Function Maximum(MAX,X : INTEGER) : INTEGER; Begin If X>MAX Then Maximum:=X Else Maximum:=MAX; End; Begin K:=0; Clrscr; Writeln('Ishodnii massiv'); Writeln; {vvod,vivod massiva} For I:=1 To 20 Do Begin A[I]:=Random(99); Writeln('A[',I,']=',A[I]); End; MAX:=A[1]; Repeat {max} For I:=1 To 20-K Do MAX:=Maximum(MAX,A[I]); {nomer max} For I:=1 To 20-K Do If MAX=A[I] Then N:=I Else; {meniaem mestami} C:=A[20-K]; A[20-K]:=MAX; A[N]:=C; K:=K+1; Until K=20; { Writeln('N=',N); Writeln('MAX=',MAX);} Writeln; Writeln('Novii massiv'); Writeln; For I:=1 To 20 Do Writeln('A[',I,']=',A[I]); Writeln; Writeln('Programmu razrabotal Chuvstvin M.B; PT0502'); Readln End.
Добавлено спустя 23 минуты, 40 секунд Надо было строчку
MAX:=A[1];
поместить в цикл!
Возможно ли оптимизации? Эту прогу надо сделать по заданию модулем. Тобишь написать прогу, которая вызывает модуль... Никогда с модулями не работал...
Куратор темы Статус: Не в сети Регистрация: 03.01.2004 Откуда: Питер
m2 1. ИМХО будет гораздо лучше смотреться, если массив выводить в строку, разделяя пробелами, а не так как у тебя в столбец.
2. вместо своего repeat...until напиши так:
Код:
var I1: integer;
.......................
for k:=0 to 19 do begin MAX:=A[1]; I1:=1; for i:=2 to 20-k do if A[i]>MAX then begin MAX:=A[i]; I1:=i; end; A[I1]:=A[20-k]; A[20-k]:=MAX; end;
Вот, вроде ничего не напутал, прям сюда писал.
И нечего зря кучу циклов лишних плодить...
3. Чего тут оптимизировать то? Вот циклы лишние покромсай, как я написал.
4. модуль - очень просто
-делаешь свою прогу функцией (на входе массив объявляешь как var, т.е. function sort(var A: array [1..20] of integer); )
-создаешь pas файл unit такой-то; interface, uses и т.д. в справке все расписано подробно
-в своей проге напишешь uses мой_модуль;
все можещь использовать свою функцию.
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Два слова наз. близнецами, если одно из них получается из другого перестановкой букв. Например, пальто и палоть. Составить програграмму, которая ищет слова близнецы в данном предложении.
Пусть n человек встают вкруг и получают номера, считая по часовой стрелке, 1,2,..,n. Начиная с 1-ого, по часовой стрелке, отсчитывается k-ый по порядку чел(т.к. люди стоят в кругу, то за n-ым человеком стоит 1-ый). Этот k-ый человек выходит из круга, после чего, начиная со следующего, снова остчитывается k-ый чел. Процесс продолжается до тех пор, пока из всего круга не остаётся один чел. Написать программу, определяющую номер k-ого человека в первоначальном кругу.
var i, InputNum: integer; Numbers: array [1..3] of integer; res: string; begin clrscr; textcolor(2); write('Введите число [0..1000]: '); textcolor(white); readln(InputNum); textcolor(2); write('Введено число '); if (InputNum<0) or (InputNum>1000) then writeln('введенное число вне допустимого диапазона.') else if InputNum=0 then writeln('нуль') else if InputNum=1000 then writeln('тысяча') else begin Numbers[1]:=InputNum div 100; Numbers[2]:=(InputNum div 10) - Numbers[1]*10; Numbers[3]:=InputNum - (Numbers[1]*100 + Numbers[2]*10);
if Numbers[2]<>1 then res:=A[Numbers[1],1]+A[Numbers[2],2]+A[Numbers[3],3] else res:=A[Numbers[1],1]+B[Numbers[3]];
textcolor(white); write(res);
end;
readln; end.
прога ведь не сложная, только муторная малость, мог бы и сам написать...
_________________ Здесь так мало тех, с кем легко говорить,
Еще меньше тех, с кем не страшно молчать (c)
Последний раз редактировалось Lord_of_Darkness 03.05.2006 14:23, всего редактировалось 1 раз.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения