Страница 3 из 4 ПерваяПервая 1234 ПоследняяПоследняя
Показано с 31 по 45 из 59

Тема: Pascal. Решение задач

  1. #31
    Старожил
    Лучший фотограф. Весна 2011
      Детская фотография 2010. Второе место
    Аватар для smb.
    Регистрация
    11.02.2003
    Адрес
    Москва, ЮАО
    Сообщений
    1,228
    Спасибо
    я - 21; мне - 9
    уии, спасибо, заработало!))))
    мыслила вроде правильно, только несколько корявей.
    сейчас задачи с файлами начнутся, а там совсем кошмар >< в общем, скоро еще напишу)

  2. #32
    Старожил
    Лучший фотограф. Весна 2011
      Детская фотография 2010. Второе место
    Аватар для smb.
    Регистрация
    11.02.2003
    Адрес
    Москва, ЮАО
    Сообщений
    1,228
    Спасибо
    я - 21; мне - 9
    ну вот и опять я прошу помощи..)

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

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

  3. #33
    Участник
      Народный модератор раздела "Человек и Общество" 2008, Лучший модератор раздела "Человек и Общество" 2009
    Аватар для Jaratar
    Регистрация
    14.08.2006
    Адрес
    Россия
    Сообщений
    485
    Спасибо
    я - 49; мне - 55
    Привет, 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 нужно указать путь к модулям.

    Если нужно что-нибудь ещё, буду рад помочь. =)
    If there were no clouds, we should not enjoy the Sun

  4. #34
    Ting
    Гость

    Внимание HELP! Помогите решить задачку

    Натуральное число с "n" цифр является числом Амстронга , если сумма его цифр, возведенных в "n-ю'' степень, равняется самому числу( например, 153=1^3+5^3+3^3= 1+125+27) Написатьпрограмму. которая выводит все числа Амстронга, которые состоят из двух, трьох и четырех цифр.

  5. #35
    Почетный участник Аватар для Mice
    Регистрация
    25.08.2009
    Адрес
    Берлин
    Сообщений
    719
    Записей в блоге
    157
    Спасибо
    я - 213; мне - 137
    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.

    Пойдет?

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

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

  7. #37
    Виктор_89
    Гость
    Помогите решить

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

    =(

  8. #38
    Почетный участник Аватар для Mice
    Регистрация
    25.08.2009
    Адрес
    Берлин
    Сообщений
    719
    Записей в блоге
    157
    Спасибо
    я - 213; мне - 137
    Виктор_89
    Вектор в Паскале - это обычный одномерный массив, что ли?
    Или в Паскале есть какой-то такой тип?
    Еще раз повторюсь, что не уверена в работоспособности кода, т.к. нет возможности проверить. Но на первых несколько взглядов должно работать. Если есть ошибки, пишите, постараюсь разобраться.
    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[i] := random(2);
    Write (a[i], ' ');
    end;

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

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

    WriteLn('Преобразованный вещественный вектор: ');
    for i:=1 to n do
    WriteLn(x[i],' ' );
    ReadKey;
    End.

  9. Пользователь сказал cпасибо:


  10. #39
    Почетный участник Аватар для Mice
    Регистрация
    25.08.2009
    Адрес
    Берлин
    Сообщений
    719
    Записей в блоге
    157
    Спасибо
    я - 213; мне - 137
    Виктор_89
    В задаче про матрицу просто не поняла условия. Расшифруйте.

  11. #40
    Ting
    Гость

    Одобрение

    Цитата Сообщение от Mice Посмотреть сообщение
    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.

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

  12. #41
    Почетный участник Аватар для Mice
    Регистрация
    25.08.2009
    Адрес
    Берлин
    Сообщений
    719
    Записей в блоге
    157
    Спасибо
    я - 213; мне - 137
    Ting
    Незачто, обращайтесь рада, что после такого перерыва смогла что - то написать. Было бы интересно ,если бы вы сказали, что не работало?

  13. #42
    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.

    ОПИШИТЕ ПО ШАГОВО ЗАДАЧУ ПЛИЗ

  14. #43
    Почетный участник Аватар для Mice
    Регистрация
    25.08.2009
    Адрес
    Берлин
    Сообщений
    719
    Записей в блоге
    157
    Спасибо
    я - 213; мне - 137
    Ting
    Программа работает? Правильно работает? Или ты пытаешься найти ошибку?
    Если работает, тогда в чем проблема? Не можешь посмотреть, что означают отдельные операторы Паскаля? Здесь же все прозрачно. Скажи, что именно тебе не понятно.

  15. #44
    Ting
    Гость
    Всё работает правильно... Просто нужны коментарии к прграмме..

  16. #45
    Почетный участник Аватар для Mice
    Регистрация
    25.08.2009
    Адрес
    Берлин
    Сообщений
    719
    Записей в блоге
    157
    Спасибо
    я - 213; мне - 137
    Ting
    Коротко: в программе цикл по всем двух - трех - четырех - значным числам. Для каждого числа, в зависимости от того, сколько в нем цифр (определяется условиями if) выделяются все эти цифры (при помощи div и mod), затем... что там... складываем все цифры числа в соответствующей степени. Сравниваем с самим числом. Все.

    Если у тебя есть КОНКРЕТНЫЙ вопрос, т.е. ты пробовал разобраться в коде, но не понял, как работает какой - то конкретный кусочек, это другой вопрос.

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

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

    На будущее:
    учимся спрашивать

    учимся гуглить

    Не обижайся на резкость, иные программеры могут и резче ответить.

Страница 3 из 4 ПерваяПервая 1234 ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •