Страница 2 из 4 ПерваяПервая 1234 ПоследняяПоследняя
Показано с 16 по 30 из 59

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

  1. #16
    Группа удаления Аватар для Erenion
    Регистрация
    31.01.2006
    Адрес
    Москва
    Сообщений
    278
    Спасибо
    я - 0; мне - 0
    Очень давно юзал паскаль, уже мало помню структуру, но все же:

    close (f); перед закрытием цикла. Естестна, ты открываешь файл, цикл проходит одну итерацию и он закрывается в конце. А на следующей итерации файл не открыт))

    Поставь close (f); после цикла, а не внутри..
    Freon heart, fayence mind

  2. #17
    Постоялец Аватар для Velgelmina
    Регистрация
    14.05.2007
    Сообщений
    82
    Спасибо
    я - 19; мне - 3
    а Вы не могли исправить в этой теме? в смысле неправильный текст программы исправить на правильный?
    просто я исправила сейчас в Pascale он все равно выдает file not opened.

  3. #18
    Старожил
    Легенда miXei.ru
      "Юбилейный реальщик"

    Регистрация
    16.12.2000
    Сообщений
    345
    Спасибо
    я - 0; мне - 0
    Ох.
    У вас много ошибок.

    Вот правильные сорцы.
    Первая программа:
    Код:
    Program fail;
    uses crt;
    type student=record
    index:string;
    fam:string;
    ysp:array[1..3] of integer;
    end;
    var f:file of student;
    a:student;
    i:byte;
    j:byte;
    begin
    clrscr;
    assign (f,'d:\student.txt');
    rewrite (f);
    for i:=1 to 3 do begin
    writeln ('vvedite familiy');
    readln (a.fam);
    writeln ('vvedite gruppy');
    readln (a.index);
    writeln ('vvedite ocenki po trem ekzamenam:');
    for j:=1 to 3 do
       readln (a.ysp[j]);
    
    write (f,a);
    end;
    close(f);
    end.
    Вторая программа:

    Код:
    Program fail2;
    uses crt;
    type student=record
    index:string;
    fam:string;
    ysp:array [1..3] of integer;
    end;
    var f:file of student;
    a:student;sr:real;
    S:integer;
    m:integer;
    begin
    clrscr;
    
    assign(f,'d:\student.txt');
    reset(f);
    
    writeln('familii neuspevayushih:');
    
    m:=0;
    S:=0;
    while not eof(f) do begin read (f,a);
    if (a.ysp[1] <= 3) or (a.ysp[2] <= 3) or (a.ysp[3] <= 3) then writeln (a.fam);
    m:=m+3;
    S:=S + a.ysp[1] + a.ysp[2] + a.ysp[3];
    sr:=S/m;
    end;
    writeln;
    writeln ('srednii ball=',sr:3:1);
    close(f);
    readln;
    end.

    Давайте по порядку?

    Первое. Типы данных должны быть одинаковые в обоих программах. А у вас -- разные.

    Код:
    type student=record
    index:string;
    fam:string;
    ysp:array[1..3] of integer;
    end;
    Код:
    type student=record
    fam:string;
    index:string;
    ysp:array [1..3] of integer;
    end;
    Чуете разницу? Нельзя переставлять местами переменные. Порядок -- важен. Ибо то, что у вас в первой программе было фамилией, во второй программе стало названием группы. Ну и название группы стало фамилией.


    Далее.
    Ошибка на цикл вылетала потому, что вы закрывали файл в цикле. А надо после окончания ВСЕЙ работы.

    Еще одна важная вещь -- у вас неправильно написана первая программа :-)

    Код:
    for j:=1 to 3 do begin
    readln (a.ysp[j]);
    write (f,a);
    end;
    Этот вот кусок считывает оценки.
    Но! Зачем! Он! Пишет в файл ВСЮ "запись" о студенте? У вас получается три записи!
    Запись "записи"(record) в файл надо производить в КОНЦЕ каждого цикла!



    Вернемся ко второй программе.
    Переменные нужно обнулять.
    У вас в цикле идет накопление суммы:
    Код:
    m:=m+3;
    S:=S + a.ysp[1] + a.ysp[2] + a.ysp[3];
    Перед циклом необходимо обнулить переменные:
    Код:
    m:=0;
    S:=0;
    Зачем? А затем, что в m и S могут изначально находиться страшные цифры, отличные от нуля. Естественно, это приведет к ошибке.


    Далее.
    Код:
    if a.ysp[i]=3 then write (a.fam);
    Что вы хотели сказать этой строчкой? i у вас даже не определена.
    Вы считали ПОЛНОСТЬЮ запись.
    Вам надо проверить, не является ли ХОТЯ БЫ одна из трех оценок меньше или равной трем.
    Это делается так:

    Код:
    if (a.ysp[1] <= 3) or (a.ysp[2] <= 3) or (a.ysp[3] <= 3)

    Далее.
    Код:
    m:=m+1;
    S:=S+i;
    Что вы хотели этим сказать? У вас же по каждому студенту три оценки! Надо их все в общую сумму складывать. И считать их как три :-)

    Т.е.:
    Код:
    m:=m+3;
    S:=S + a.ysp[1] + a.ysp[2] + a.ysp[3];

    Ну и опять же.
    ВЫВОД результатов надо делать ПОСЛЕ цикла. А не в его теле. Посмотрите, где стоит end; для цикла у меня и у вас.

    И на последок.
    Код:
    writeln ('srednii ball=',sr:3:1);
    Эта волшебная конструкция (:3:1) означает, что под число с плавающей запятой будет выделено три клеточки. Из них одна клеточка -- под десятичную часть.


    Удачи!
    [ Blog ] [ Twitter ] [ icq 44650436 ] [ jabber/GTalk/email denyamsk@denyamsk.ru ] [ skype denya.msk ]

  4. #19
    Постоялец Аватар для Velgelmina
    Регистрация
    14.05.2007
    Сообщений
    82
    Спасибо
    я - 19; мне - 3
    Спасибо огромное! и отдельное, за указанные ошибки!
    если Вам не трудно, то не могли бы написать код решения еще двух задач.
    1.Динамические структуры данных:
    -Описание процедуры или функции, которая удаляет из списка L за каждым вхождением элемента E один элемент, если такой есть и он отличен от E.
    2.Модуль:
    -нахождение максимального элемента матрицы
    -нахождение минимального элемента матрицы
    -сложение двух матриц
    -нахождение суммы элементов каждой строки данной матрицы.
    и по этому модулю решить задачу:
    -сложить две матрицы
    -напечатать в общем виде
    -найти максимальный и минимальный элемент, а также вычислить сумму элементов каждой строки.

    заранее Вам благодарна.
    (я понимаю, что это большая просьба, но вы мне ОЧЕНЬ поможете, если ответите)

  5. #20
    Старожил
    Легенда miXei.ru
      "Юбилейный реальщик"

    Регистрация
    16.12.2000
    Сообщений
    345
    Спасибо
    я - 0; мне - 0
    Все же попробуйте написать сами.
    И назовите крайние сроки :-)

    Сейчас совсем нету времени...
    [ Blog ] [ Twitter ] [ icq 44650436 ] [ jabber/GTalk/email denyamsk@denyamsk.ru ] [ skype denya.msk ]

  6. #21
    Команда "И.М.Х.О."
    "Лучший новогодний анимированный логотип miXei.ru"
      Реальный Декабрист
    Аватар для РыЖаЯ СоНя
    Регистрация
    30.01.2003
    Адрес
    Г.Новосибирск
    Сообщений
    761
    Спасибо
    я - 0; мне - 3
    Модуль:
    Код:
    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 мая уже давно позади.
    Презервативы "Морозко","Румяные щечки"-ваша защита от сына и дочки!
    Мои картинки

  7. #22
    Постоялец Аватар для Velgelmina
    Регистрация
    14.05.2007
    Сообщений
    82
    Спасибо
    я - 19; мне - 3
    РыЖаЯ СоНя
    Спасибо! Я зачет сдала. Но мне все равно нужно это сделать, потому что не пойму одну тему - не пойму другую и т.д. пошло поехало. Не хочу так.
    По поводу динамических структур, я думаю, можно ли там использовать литерный тип? нужен ли он вообще?

  8. #23
    Постоялец Аватар для Velgelmina
    Регистрация
    14.05.2007
    Сообщений
    82
    Спасибо
    я - 19; мне - 3

    Стрела Pascal - Динамические структуры и файлы

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

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

    Заранее большое спасибо!!

  9. #24
    rkm
    Гость

    Работа с файлом в Turbo Pascal

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

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

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

    Но в данном случае можно обойтись без этого - главное следить, чтобы функция вызывалась только тогда, когда она уже описана выше по тексту (для некоторых компиляторов это принципиально важно).
    If there were no clouds, we should not enjoy the Sun

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

  13. #28
    Участник
      Народный модератор раздела "Человек и Общество" 2008, Лучший модератор раздела "Человек и Общество" 2009
    Аватар для Jaratar
    Регистрация
    14.08.2006
    Адрес
    Россия
    Сообщений
    485
    Спасибо
    я - 49; мне - 55
    smb.

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

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

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

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

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

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

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

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

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

    Ты тогда подтверди, а я, если успею, к завтрашнему дню постараюсь сделать.
    If there were no clouds, we should not enjoy the Sun

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

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

  15. #30
    Участник
      Народный модератор раздела "Человек и Общество" 2008, Лучший модератор раздела "Человек и Общество" 2009
    Аватар для Jaratar
    Регистрация
    14.08.2006
    Адрес
    Россия
    Сообщений
    485
    Спасибо
    я - 49; мне - 55
    Аа... Теперь понятно. =) Извини, просто я не сразу понял, применительно к чему надо считать погрешность.

    Значит, здесь просто будет цикл 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)

    Извини, что иногда получается отвечать не сразу. И не вольнуйся, ты совсем не напрягаешь. =) Наоборот, весьма-весьма рад поучаствовать.
    If there were no clouds, we should not enjoy the Sun

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

Ваши права

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