• Уважаемый посетитель!!!
    Если Вы уже являетесь зарегистрированным участником проекта "миХей.ру - дискусcионный клуб",
    пожалуйста, восстановите свой пароль самостоятельно, либо свяжитесь с администратором через Телеграм.

Pascal. Решение задач

  • Автор темы Автор темы Jaratar
  • Дата начала Дата начала
Модуль:
Код:
unit Matrix;
{интерфейсная часть: объявление всех типов, констант, переменных и подпрограмм}
Interface
Type mas=array[1..10,1..10]of integer;
Procedure FindMax(a:mas; var imax,jmax:integer);
Procedure FindMin(a:mas; var imin,jmin:integer);
Procedure AddMas(a,b:mas; Var c: mas);
procedure AddStr(a: mas);
{исполняемая часть}
IMPLEMENTATION

Procedure FindMax;
Var i,j: integer;
Begin
imax:=1; jmax:=1;
for i:=1 to 10 do
for j:=1 to 10 do
if a[i,j]>a[imax,jmax] then
begin
imax:=i;
jmax:=j;
end;
End;
Procedure FindMin;
{почти тоже самое что и в FindMax}

Procedure AddMas;
Var i,j:integer;
Begin
for i:=1 to 10 do
For j:=1 to 10 do
c[i,j]:=a[i,j]+b[i,j];
End;

Procedure AddStr;
Var i,j,sum: integer;
Begin
sum:=0;
for i:=1 to 10 do
begin
for j:= 1 to 10 do 
sum:=sum+a[i,j];
writeln('Summa ',i,'-toj stroki ravna ',sum);
sum:=0; 
end;
End;

Begin
end.
Cохранить файл под именем matrix.tpu. Этот файл нужно скомпилировать (Alt+F9). Все. Теперь процедуры модуля ты можешь использовать в твоей программе.
Н-р:
program p1;
uses Matrix;
Var a,b,c:mas; i,j:integer;
Begin
randomize;
for i:=1 to 10 do
for j:=1 to 10 do
begin
a[i,j]:=random(20);
write(a[i,j],' ');
if j=10 then writeln;
end;
addstr(a);
End.

А по поводу первой задачи. Выложи, пожалуйста, ход тволих мыслей, а мы постораемся помочь. Хотя все-рано 17 мая уже давно позади.
 
РыЖаЯ СоНя
Спасибо! Я зачет сдала. Но мне все равно нужно это сделать, потому что не пойму одну тему - не пойму другую и т.д. пошло поехало. Не хочу так.
По поводу динамических структур, я думаю, можно ли там использовать литерный тип? нужен ли он вообще?
 
Pascal - Динамические структуры и файлы

Еще раз прошу вашей помощи.
Две задачи. Помогите пожалуйста.У меня по поводу первой совсем никаких мыслей.
А вот со второй никак не могу понять как сравнить эти отпечатки и вывести фамилии? ведь фамилии никак не обозначены? они не вводятся из другой программы. Они в этом текстовом файле просто есть. Как сделать так чтобы Паскаль их "увидел".
1.Дан список случайных целых чисел. Переверните список т.е. расставьте все числа в обратном порядке. Подсчитайте средне арифметическое его элементов. Создайте два новых списка в одном из которых запишите все элементы > 5, в другой все остальные элементы исходного списка.(всего в списке 15 чисел)

2.Текстовый файл содержит данные по отпечаткам пальцев известных преступников. Разработать программу, которая печатает информацию обо всех преступниках, чьи отпечатки совпадают с отпечатками найденными на месте преступления. Отпечаток пальцев, найденный на месте преступления вводится с клавиатуры. Отпечаток пальцев может быть представлен кодом из 36 символов и 12 вещественных чисел, полученных в результате измерений отпечаткаю Отпечатки пальцев считаются идентичными, если 35 из 36 символов совпадают и множества действительных чисел совпадают. Два действительных числа считаются "равными", если разница между ними составляет не более 5% от большего числа. Два множества измерений считаются совпадающими, если не менее 9 из 12 пар "равны".

Заранее большое спасибо!!
 
Работа с файлом в Turbo Pascal

Не могу написать прогу. Помогите. Даны названия N различных обществ (N заданное число), фигуристы которых участвовали в соревновании. О каждом фигуристе известно: фамилия, название общества и 10 оценок за его выступление. Требуется для каждого спортивного общества определить фигуриста, показавшего наивысший результат, считая его единственным. Баллы, полученные фигуристом, подсчитываются следующим образом: максимальная и минимальная оценки отбрасываются, а из остальных формируется средняя. При вводе данных обеспечить уникальность наименований обществ и обязательную принадлежность фигуриста к одному из них.
 
очень надеюсь на вашу помощь..
1) написать программу, содержащую функцию расчета одного слагаемого (с этим я справались) и процедуру расчета всей суммы целиком (с этим как раз проблемы).
никак не могу в эти процедуры въехать.. без них все так просто бы написалось)
a256a6d68263.jpg
 
smb.

Привет! Прости, пожалуйста, что заметил только сегодня.

Cмотри, как у меня получился один из вариантов решения подобной задачи. Надеюсь, что нигде не ошибся. Но ты всё равно попробуй проверить на примере, подставив какие-нибудь значения.

Код:
program Summa;
var
   X : Real; {соответствует значению x в сумме}
   N: Integer; {количество элементов в сумме}

function Fact (N : Integer) : Integer; {рекурсивная функция, 
которая возвращает значение факториала}

begin
     Fact := 1;
     if N = 0 then exit {факториал 0! = 1}
     else Fact := N * Fact(N - 1);
end;

function Elem(X : Real; N : Integer) : Real; {функция возвращает 
значение любого из элементов, для которого заданны номер и x}

var
   J : Integer;
   P : Real;  {числитель}
begin
     P := 1;
     for J:=1 to N*2 do     {реализация x^(2*i) с помощью цикла}
         P := P*X;
     Elem := P/Fact(N); {делим числитель на факториал n!}
end;

procedure Summ (X : Real; N : Integer); {процедура, которая выводит 
на экран сумму элементов}

var
   S : Real;  {значение суммы}
   I : Integer; {счётчик цикла - соответствует номеру элемента, т.е. i}
begin
     S := 0;
     for I := 1 to N do
         S := S + Elem(X, I);   {используем в процедуре уже 
написанную выше функцию для поиска значения элемента}

     WriteLn(S); {выводим на экран}
end;

begin   {основная программы}
     WriteLn('Input X:');
     ReadLn(X);
     WriteLn('Input N:');
     ReadLn(N);
     Summ(X, N);  {вызов процедуры}
end.

В данной программе реализованны две функции и одна процедура. Функции могут возвращать значения, а процедуры нет. "Вернуть значение" - означает то, что после этого функции подобно переменной будет присвоенно какое-то значение. Так, например, первой функции Fact присваивается значение факториала её параметра. Процедура же таким свойством не обладает, а просто выполняет какую-то последовательность действий.

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



Чтобы решить данную задачу по поиску суммы элементов, нам надо уметь, во-первых, находить значения факториала, а во-вторых, уметь находить значение любого элемента. Тогда можно легко написать процедуру нахождения самой суммы, которая будет суммировать элементы, используя обычный цикл и выводить значение на экран.

Таким образом...

1) Первая функция Fact находит значения факториала вводимого числа. Тут использован метод рекурсии. В принципе, можно обойтись без неё и использовать простой цикл.

2) Вторая функция Elem, находит значение элемента (важно отметить, что для этого она использует написанную выше функцию Fact). Параметр X - это x, параметр N - номер элемента.

3) Процедура Summ находит сумму заданного числа элементов. В ней в свою очередь используется функция Elem. Значения всех элементов поочереодно суммируются в переменную S с помощью цикла. Параметр X - это X, параметр N - колличество элементов.

В принципе, эти функции и процедуры можно бы было сделать вложенными. Например, сделать функцию Fact подпрограммой функции Elem. Только там тогда придётся следить за правильностью имён параметров.

Но в данном случае можно обойтись без этого - главное следить, чтобы функция вызывалась только тогда, когда она уже описана выше по тексту (для некоторых компиляторов это принципиально важно).
 
Спасибо большое, я сама уже вроде написала, получилось крайне похоже на твое решение)
еще чуть понаглею, а процедуру расчета погрешности как записать?)
 
smb.

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

Если просто надо сделать процедуру отдельно от этой программы, то там особо сложного нет. Абсолютная погрешность - это модуль разницы между реальным значением числа и его округлённым значением. Т.е. если реальное значение x - 1.11, а его округлённое значение - 1.1, то погрешность составляет 0.01. Относительной погрешность же будет отношение абсолютной погрешности к точному значению числа, в данном случае 0.01/1.11.

А если надо найти погрешность конкретно в решении предыдущей задачи, то это будет сложнее. Там погрешность будет возникать из-за того, что вещественные числа в компьютере представляются лишь с определённой степенью точности из-за ограничения разрядной сетки.

Возникать она будет в той задаче в трёх случаях:

1) при возведении в степень x, когда x - дробное число с большим числом знаков. При возведении в степень разрядов может не хватить.

2) при делении числителя на факториал, если в результате получается бесконечная дробь или дробь с большим числом знаков.

3) При нахождении суммы - её погрешность будет суммироваться из погрешностей всех элементов.

Надо написать процедуру нахождения погрешности именно для той задачи, которую ты задала раньше?

Если так, то там будет относительно сложное решение, особенно, если погрешность считать на всех этапах вычислений. Там придётся смотреть, помещается ли всё значение числа в разрядную сетку. И на основе этого вычислять погрешность.

Ты тогда подтверди, а я, если успею, к завтрашнему дню постараюсь сделать.
 
вообще, изначально задание выглядело так:
e1f9ae62a6c7.jpg
, просто подумала, Вы объясните на том примере и я его применю к данному))
задание:
создать функцию одного компонента и всего ряда целиком (с этим разобралась).
задать данную погрешность вычисления ряда (тут начались проблемы =)). вычислить ряд с заданной погрешностью и аргументом.

сумма должна считаться пока заданная погрешность не будет равна реальной. а реальная погрешность это abs(element(n)-element(n-1)), вроде как.
на этом этапе я погрязла в циклах и окончательно запуталась =(
спасибо что помогаете, надеюсь, не очень напрягаю)
 
Аа... Теперь понятно. =) Извини, просто я не сразу понял, применительно к чему надо считать погрешность.

Значит, здесь просто будет цикл while-do (либо repeat-until), который подсчитывает сумму элементов, до тех пор, пока значение элемента больше погрешности, которая в свою очередь вводится как один из параметров. Значение элемента очень удобно находить, как ты указала (находить модуль разности между двумя элементами). То есть это задача на нахождение суммы сходящегося рядя при допустимом значении погрешности.

Вот как тогда будет выглядеть функция суммы:

Код:
function Summ (X, Mist : Real) :Real;
var
   S : Real;
   I : Integer;
begin
     S := 0;
     I := 1;
     while abs(Elem(X, I) - Elem(X,I-1)) > Mist do
	begin
        S := S + Elem(X, I);
	I := I + 1;
	end;
     Summ := S;
end;

Все остальные части программы точно такие же, только при вводе данных надо внести изменения, так как вводим не N элементов, а погрешность (Mist)

Извини, что иногда получается отвечать не сразу. И не вольнуйся, ты совсем не напрягаешь. =) Наоборот, весьма-весьма рад поучаствовать.
 
уии, спасибо, заработало!))))
мыслила вроде правильно, только несколько корявей.
сейчас задачи с файлами начнутся, а там совсем кошмар >< в общем, скоро еще напишу)
 
ну вот и опять я прошу помощи..)

создать модуль для работы с типом TMType=Longint
процедуры и ф-ции осуществляют:
открытие файла и заполнение случайным образом
считывание из файла в переменную данного типа
нахождение в файле позиции с нужными данными
закрытие файла

тупить начинаю прямо с начала... заполнять "случайным образом" видимо надо с помощью ф-ции random, но ведь она берет числа из типа word, а он уже, чем longint.. и вообще с нуля начинается, а нужно ведь и отрицательные.
вообще там еще был вариант с типом Char, это вообще меня убило)
считывание-закрытие-открытие вроде несложно.
 
Привет, smb. Вот, смотри, какой модуль получился. Давай тогда сначала отдельно про функцию Random в типах Char и LongInt.

В типах Char функция Random делается довольно просто. Там применяется функция Chr, которая вместро числа подставляет соответствующий символ по таблице. Например Chr(80) будет равно 'P', Chr(84) будет равно 'T'. Есть также функция Ord, которая, наоборот, вместо символов подставляет соответствующие числа.

Код:
{функция не имеет параметров и просто возвращае один из 256 символов}
function RandChar : Char; 
var
     A : Byte;
begin
     A := Random(256); {A - случайное число от 0 до 255}
     RandChar := Chr(A); 
end;

Насчёт типа LongInt. Ты верно заметила, что функция Random позволяет выбрать только числа, которые соответствуют типу Word.

В этом случае можно поступить следующим образом:
1) Сделать первое случайное число в пределах типа Word.
2) Сделать второе случайное число в пределах типа Word.
Оба числа будут в пределах от 0 до 65535 (или от 0000 до FFFF в 16-ой системе счисления).
3) Первое число умножить на 65536 (или на 10000 в шестнадцатеричной системе). Получится что-то вроде 450B 0000 (последние четыре цифры обязательно будут нулями, так как умножили на круглое число).
4) Прибавить к нему второе неумноженное. В результате получится число от 0000 0000 до FFFF FFFF - т.е. как раз соответствующее типу LongInt.

Получится, что мы собрали случайное число LongInt из двух случайных чисел Word, переведя цифры одного из них в более старшие разряды и приплюсовав к нему другое.

Вычисления в программе удобнее производить в шестнадцатеричном формате. Для этого перед числами ставится знак $.

Код:
{функция не имеет параметров и просто возвращает случайное число
в диапазоне типа LongInt}
function RandLongInt : LongInt;
var
   A, B : LongInt;
begin
     A := (Random($FFFF) + Random($2)) * $10000;
     B := (Random($FFFF) + Random($2));
     RandLongInt := A + B
end;

Важно отметить, что в функции Random можно ставить число не больше 65535 и в результате самое большое число, которое может получиться - это 65534, т.е. на единицу меньше. Поэтому чтобы перекрыть весть диапазон от 0000 до FFFF нужно ещё рандомно прибавлять либо 0 либо 1 (т.е. прибавлять к числу
Random($2) ).

Об отрицательных числах волноваться не надо, так как в памяти компьютера целые числа такого типа представляются таким образом, что знак определяется первой (слева) цифрой числа. Если большее или равно 8, то число отрицательной. Таким образом, например, 95A3 0010 - отрицательное, а 200A 0002 - положительное. Поэтому в данном случае числа будут и положительными, и отрицательными.

Теперь сам модуль. Он получился примерно таким.

Код:
unit Files;

interface
type
        TMType = Longint;

        procedure OpenAndFill(var F : Text); {открыти и заполнение}

        procedure ReadFromFile(var F : Text; var V : TMType; P : Integer); 
        {считывание в переменную V из позиции P}

        function FindInFile (var F : Text; V : TMType) : Integer; 
        {поиск данных соответствующих значению переменной V}

        procedure CloseFile (var F : Text); {закрытие файла}

implementation

{Описание процедур и функций}

procedure OpenAndFill(var F : Text);

        function RandLongInt : LongInt; {вложенная функция для случайных чисел LongInt}
		var
   		A, B : LongInt;
		begin
     		A := (Random($FFFF) + Random($2)) * $10000;
     		B := (Random($FFFF) + Random($2));
     		RandLongInt := A + B
	end;

var
   I, L : Integer;
begin
     L := Random(41) + 10; {число данных в файле случайное - от 10 до 50}
     Rewrite(F); {открываем файл для записи}
     for I := 1 to L do
     begin
         Write(F, RandLongInt); {записываем случайное число}
         Writeln(F); {новая строка}
     end;
end;

procedure ReadFromFile(var F : Text; var V : TMType; P : Integer);
var
   I : Integer;
begin
     I := 1;
     Reset(F); {открываем файл для чтения}
     While(EOF(F) = False) and (I < P) do {спускаемся до нужной позиции или до конца файла}
         begin
         Readln(F);
	 I := I + 1;
         end;
     Read(F, V); {записываем данные из позиции P в переменную V}
end;

function FindInFile(var F : Text; V : TMType) : Integer;
var
   A : TMType;
   I : Integer;
   B : Boolean; {показывает, если данные найденнны}
begin
     I := 1;
     B := False;
     Reset(F);
     While(EOF(F) = False) do {пока не дошли до конца файла}
         begin
         Read(F, A);
	 if A = V then {если данные соответствуют значению переменной V, прекратить поиск}
         begin
              B := True;
              break;
         end;
	 I := I + 1;
	 Readln(F);
         end;
     if B = True then FindInFile := I {вернуть функции значение номера строки}
     else FindInFile := 0;
end;

procedure CloseFile (var F : Text);
begin
     Close(F); {закрытие файла}
end;

begin
     Randomize; {в этом модуле есть функция Randomize, в самой программе её писать будет не 
                      нужно}
end.

Это текст программы с примером использования процедур и функций модуля.

Код:
program Prog;
uses Files;
var
   V : TMType;
   F : Text;
begin
    Assign(F, 'C:\Pascal\textfile.txt');
    OpenAndFill(F);
    ReadFromFile(F, V, 10);
    Writeln(V);
    WriteLn(FindInFile(F,V)); 
    CloseFile(F);
end.

Наверняка ты знаешь, но на всякий случай напомню, что имя сохраняемого файла модуля должно совпадать с именем модуля в начеле, в нашем случае Files. Он сохранится в файл Files.tbu. При использовании модуля в среде разработки Pascal в меня Options->Directories нужно указать путь к модулям.

Если нужно что-нибудь ещё, буду рад помочь. =)
 
HELP! Помогите решить задачку

Натуральное число с "n" цифр является числом Амстронга , если сумма его цифр, возведенных в "n-ю'' степень, равняется самому числу( например, 153=1^3+5^3+3^3= 1+125+27) Написатьпрограмму. которая выводит все числа Амстронга, которые состоят из двух, трьох и четырех цифр.:surprise:
 
Ting
Уже очень давно перешла на сишку, а про Паскаль почти забыла. Но, поскольку других вариантов решения все - равно никто не предложил, напишу вам свой. Я не знаю, какие средства программирования вам можно использовать, а какие нет, поэтому написала без использования функций. Должно работать, если нигде не ошиблась, возможности проверить у меня нет. Чуть что - пишите.

Program Armstrong;
Uses crt;
Var i, a, c1, c2, c3, c4, sumc:integer;
Begin
ClrScr;
for i:=10 to 9999 do
begin
a:=i;

if (a < 100) then
begin
c2 := a mod 10;
a := a div 10;
c1 := a;
sumc = c1*c1 + c2*c2;
if (sumc = i) then WriteLn(i, " -число Армстронга ");
end;

if ( a < 1000) then
begin
c3 := a mod 10;
a := a div 10;
c2 := a mod 10;
a := a div 10;
c1 := a;

sumc = c1*c1*c1 + c2*c2*c2 + c3*c3*c3;
if (sumc = i) then WriteLn(i, " -число Армстронга ");
end;
if ( a < 10000) then
begin
c4 := a mod 10;
a := a div 10;
c3 := a mod 10;
a := a div 10;
c2 := a mod 10;
a := a div 10;
c1 := a;

sumc = c1*c1*c1*c1 + c2*c2*c2*c2 + c3*c3*c3*c3 + c4*c4*c4*c4;
if (sumc = i) then WriteLn(i, " -число Армстронга ");
end;
end;
ReadKey;
End.

Пойдет?
 
Заданы логический вектор a={a1,a2,...,An,} и вещественный вектор x={X1,X2,...,Xn}. Преобразовать вектор х по правилу: если ai имеет значение TRUE, то Xi возвести в куб и поделить на 10, в противном случае изменить знак Xj на противоположный.

кто знает, как решать? плииз...очень нужно!!!!!
 
Помогите решить

Даны целые числа а1,...,а4 и целочисленная матрица А(4х4). Заменить нулями в матрице элементы с четной суммой индексов, равные a1,...,a4.

=(
 
Виктор_89
Вектор в Паскале - это обычный одномерный массив, что ли?
Или в Паскале есть какой-то такой тип? :surprise:
Еще раз повторюсь, что не уверена в работоспособности кода, т.к. нет возможности проверить. Но на первых несколько взглядов должно работать. Если есть ошибки, пишите, постараюсь разобраться.
Program Vect;
Uses crt;
Const max = 100;
Var
a:array[1..max] of boolean;
x:array[1..max] of real;
n,i:byte;

Begin
ClrScr;
randomize;
n:=0;
repeat

WriteLn ('Введите размер массива');
ReadLn (n);
n:=n+1;
until (n > max);

WriteLn ('Логический массив(исходный): ');
for i:=1 to n do
begin
a := random(2);
Write (a, ' ');
end;

WriteLn;
WriteLn ('Исходный вещественный массив: ');
for i:=1 to n do
begin
x := random (21) - 42;
WriteLn (x, ' ');
end;

WriteLn;
for i:=1 to n do
begin
if a == true then
begin
x:= x*x*x;
x := x.0/10;
end
else
x:= -1 * x;
end;

WriteLn('Преобразованный вещественный вектор: ');
for i:=1 to n do
WriteLn(x,' ' );
ReadKey;
End.
 
Виктор_89
В задаче про матрицу просто не поняла условия. Расшифруйте.
 
Ting
Уже очень давно перешла на сишку, а про Паскаль почти забыла. Но, поскольку других вариантов решения все - равно никто не предложил, напишу вам свой. Я не знаю, какие средства программирования вам можно использовать, а какие нет, поэтому написала без использования функций. Должно работать, если нигде не ошиблась, возможности проверить у меня нет. Чуть что - пишите.

Program Armstrong;
Uses crt;
Var i, a, c1, c2, c3, c4, sumc:integer;
Begin
ClrScr;
for i:=10 to 9999 do
begin
a:=i;

if (a < 100) then
begin
c2 := a mod 10;
a := a div 10;
c1 := a;
sumc = c1*c1 + c2*c2;
if (sumc = i) then WriteLn(i, " -число Армстронга ");
end;

if ( a < 1000) then
begin
c3 := a mod 10;
a := a div 10;
c2 := a mod 10;
a := a div 10;
c1 := a;

sumc = c1*c1*c1 + c2*c2*c2 + c3*c3*c3;
if (sumc = i) then WriteLn(i, " -число Армстронга ");
end;
if ( a < 10000) then
begin
c4 := a mod 10;
a := a div 10;
c3 := a mod 10;
a := a div 10;
c2 := a mod 10;
a := a div 10;
c1 := a;

sumc = c1*c1*c1*c1 + c2*c2*c2*c2 + c3*c3*c3*c3 + c4*c4*c4*c4;
if (sumc = i) then WriteLn(i, " -число Армстронга ");
end;
end;
ReadKey;
End.

Пойдет?

ДАААААААА!!!!!!!! Спасибо ОГРОМНОЕ:jump: P.S. Пришлось внести незначительные коррекции:cool:, но в целом СУПЕР..Неожидал,что кто-то поможет:rolleyes:...
 
Назад
Сверху