Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Pascal задачки. (http://www.tehnari.ru/f43/t31851/)

Neonn1k 09.01.2010 19:33

Pascal задачки.
 
У меня семестровые задачи по паскалю. Кто разбирается, выручайте. Сколько сможете напишите плиз. А то я тут с комиссией уже сдаю 11числа. До экзов не допускают даже.

1. Составить программу для решения проведённого ниже задания двумя способами:
а) используя команду выбора Case
б)используя команду If
Придумать и задать входные данные так, чтобы выбор состоял из 4-7 альтернатив. Ввести первую букву задания страны. вывести название континента.
2. построить таблицу в соответствии между мерами
САК=109Л=1.499страйка. нач. значение меры, шаг изменения этого значения и кол-во строк в таблице(10-15). Задать самостоятельно в режиме диалога. Оформить таблицу как можно лучше, применяя форматы вывода.
3. Протабулировать функцию y=|(cos(2 в кубе)+2sinx)/(5x-2Pi)| на отрезке от нуля до одного включая 0 и 1, с шагом h=0.9. Результаты вычислния вывести на экран в виде таблицы пар чисел х,у. Вычислить сумму и кол-во положительных значений функции у.
4.Ввести фамилию(Лысых), имя(Надежда) и отчество(Олеговна) как одно текстовое данное. Определить длину текста и кол-во букв "А" в нём. Выполнить дополнительно, изъять все буквы "А","О" из фамилии.
5. Пусть доход фирмы за К-тый год вычисляется по формуле у(индекс К)=100*(sin|(K*K-1.5)/(Pi-3.4*K)|+cos(2+K) В некоторых условных единицах, где К=1991,1992... 2001. Если у(индекс К)>0, то будем считать, что фирма в соотстветствующий(К-тый) год имела прибыль, а в случае у(индекс К)<0 - убытки. Вывети на экран таблицу: год, величина дохода. Выполнить дополнительно: вычислить сумму тех убытков, которые в границах у(индекс К)<-600 или 4у(индекс К)>-100 (в у.е.). Определить общий доход фирмы. Рассмотреть финансовую деятельность фирмы на протяжении 10лет. Вывести сообщения, если искомые данные отсутствуют, например, если прибылей или убытков фирма не имела.
6. Модернизировать решения любых 2-х заданий с 1-5, таким образом, чтобы ввод входных данныхи вывод полученных результатов осуществлялся через текстовый файл.

Vladimir_S 09.01.2010 20:22

Всё понял, кроме первого задания - тут ни бельмеса не пойму. Завтра постараюсь сделать.

AlexZir 09.01.2010 20:32

1 задание
Определим исходные данные:
Г (Германия) континент Европа
К (Китай) континент Азия
С (США) континент Северная Америка
В (Венесуэла) континент Южная Америка
Ю (ЮАР) континент Африка
Написание программы сводится к правильному построению логических цепочек. Алгоритм работы: вводим 1 символ названия страны, выбираем соответствие в списке, выводим название континента.
Листинг может быть примерно следующим:
Код:

program land;
var name: char;
begin
writeln('Input name land');
read(name);
case name of
'Г','г':writeln('Европа');
'К','к':writeln('Китай');
'С','с':writeln('Северная Америка');
'В','в':writeln('Южная Америка');
'Ю','ю':writeln('Африка');
else writeln('Такой страны в списке нет');
end;
readln;
end.

Для if..then алгоритм подобный, только для каждого символа заводится самостоятельная команда ветвления.

Vladimir_S 09.01.2010 20:34

Гениально... а я вот что-то смотрю, как баран, и не врубаюсь...

Vladimir_S 09.01.2010 22:22

Цитата:

2. построить таблицу в соответствии между мерами
САК=109Л=1.499страйка. нач. значение меры, шаг изменения этого значения и кол-во строк в таблице(10-15). Задать самостоятельно в режиме диалога. Оформить таблицу как можно лучше, применяя форматы вывода.
Код:

CONST
 Sack2Litre=109.0;
 Sack2Strike=1.499;
 Units:ARRAY[1..3] of STRING=('    Sack','    Litre','  Strike');

VAR
 Order:ARRAY[1..3] of BYTE;
 Unit1:BYTE;
 K2,K3,Min_Value,Max_Value,Step:Real;
 i:INTEGER;

BEGIN
 WriteLn('Enter the base unit:');
 WriteLn('1 - Sack');
 WriteLn('2 - Litre');
 WriteLn('3 - Strike');
 ReadLn(Unit1);
 CASE Unit1 of
 1: begin
    K2:=Sack2Litre;
    K3:=Sack2Strike;
    Order[1]:=1;
    Order[2]:=2;
    Order[3]:=3;
    end;
 2: begin
    K2:=1.0/Sack2Litre;
    K3:=Sack2Strike/Sack2Litre;
    Order[1]:=2;
    Order[2]:=1;
    Order[3]:=3;
    end;
 3: begin
    K2:=1.0/Sack2Strike;
    K3:=Sack2Litre/Sack2Strike;
    Order[1]:=3;
    Order[2]:=1;
    Order[3]:=2;
    end;
 END;
 Write('Enter the low value '); ReadLn(Min_Value);
 Write('Enter the high value '); ReadLn(Max_Value);
 Step:=(Max_Value-Min_Value)/10;
 WriteLn(Units[Order[1]],'    ',Units[Order[2]],'    ',Units[Order[3]]);
 For i:=0 to 10 do
  Writeln((Min_Value+Step*i):9:4,'    ',
          (Min_Value+Step*i)*K2:9:4,'    ',
          (Min_Value+Step*i)*K3:9:4);
 ReadLn;
END.


Vladimir_S 09.01.2010 22:33

Neonn1k, в задаче 3 проверьте аргумент косинуса. Это что, действительно там просто 8? Или может быть 2x³? Или (2x)³?

Neonn1k 09.01.2010 22:51

Цитата:

Сообщение от Vladimir_S (Сообщение 280263)
Neonn1k, в задаче 3 проверьте аргумент косинуса. Это что, действительно там просто 8? Или может быть 2x³? Или (2x)³?

да, да, да (2x)³. Я просто через мобилу пишу)))

Vladimir_S 09.01.2010 23:00

Цитата:

4.Ввести фамилию(Лысых), имя(Надежда) и отчество(Олеговна) как одно текстовое данное. Определить длину текста и кол-во букв "А" в нём. Выполнить дополнительно, изъять все буквы "А","О" из фамилии.
Код:

CONST
 Family:STRING='LysyhNadezdaOlegovna';
VAR
 Lng,Number_of_A,i:BYTE;
BEGIN
 WriteLn(Family);
 Lng:=Length(Family);
 WriteLn('Length= ',Lng);
 Number_of_A:=0;
 For i:=1 to Lng do
  If Family[i]='a' then Inc(Number_of_A);
 WriteLn('There are ',Number_of_A,' letters "a" in the string');
 For i:=1 to Lng do
  If (Family[i]<>'a') and (Family[i]<>'A')
  and (Family[i]<>'o') and (Family[i]<>'O')
  then Write(Family[i]);
 ReadLn;
END.

Вариант с текстовым файлом. Пусть строка LysyhNadezdaOlegovna записана в первой (и единственной) строке файла с именем fff, расположенного в корневом каталоге диска С: . Тогда:
Код:

VAR
 Family:STRING;
 Lng,Number_of_A,i:BYTE;
 f:TEXT;
BEGIN
 Assign(f,'C:\fff');
 ReSet(f);
 ReadLn(f, Family);
 Close(f);
 WriteLn(Family);
 Lng:=Length(Family);
 WriteLn('Length= ',Lng);
 Number_of_A:=0;
 For i:=1 to Lng do
  If Family[i]='a' then Inc(Number_of_A);
 WriteLn('There are ',Number_of_A,' letters "a" in the string');
 For i:=1 to Lng do
  If (Family[i]<>'a') and (Family[i]<>'A')
  and (Family[i]<>'o') and (Family[i]<>'O')
  then Write(Family[i]);
 ReadLn;
END.

Вы можете, разумеется, всюду заменить латиницу кириллицей, причем в этом случае надо не только поменять 'LysyhNadezdaOlegovna' на 'ЛысыхНадеждаОлеговна', но и всюду 'a', 'o', 'A', 'O' на соответствующие кириллические символы (у меня они все латинские).

Vladimir_S 10.01.2010 10:48

Цитата:

5. Пусть доход фирмы за К-тый год вычисляется по формуле у(индекс К)=100*(sin|(K*K-1.5)/(Pi-3.4*K)|+cos(2+K) В некоторых условных единицах, где К=1991,1992... 2001. Если у(индекс К)>0, то будем считать, что фирма в соотстветствующий(К-тый) год имела прибыль, а в случае у(индекс К)<0 - убытки. Вывети на экран таблицу: год, величина дохода. Выполнить дополнительно: вычислить сумму тех убытков, которые в границах у(индекс К)<-600 или 4у(индекс К)>-100 (в у.е.). Определить общий доход фирмы. Рассмотреть финансовую деятельность фирмы на протяжении 10лет. Вывести сообщения, если искомые данные отсутствуют, например, если прибылей или убытков фирма не имела.
Код:

VAR
 y:ARRAY[1991..2001] of REAL;
 k,General_Income:INTEGER;
BEGIN
 General_Income:=0;
 For k:=1991 to 2001 do
  begin
  y[k]:=100*(Sin(ABS((SQR(k)-1.5)/(Pi-3.4*k)))+Cos(2+k));
  WriteLn(k,ROUND(y[k]):15);
  General_Income:=General_Income+ROUND(y[k]);
  end;
 WriteLn('General_Income was ',General_Income);
 ReadLn;
END.

А вообще есть у меня подозрение, что формула набрана с ошибками (для начала, не хватает одной закрывающей скобки). Дело в том, что максимальный убыток составил -165, откуда тогда -600 в условии? И что означает 4у(индекс К)>-100, почему просто не написать у(индекс К)>-25? В общем, сверьте условие, тогда исправлю и дополню программу. А пока - что есть.

Vladimir_S 10.01.2010 12:42

Цитата:

3. Протабулировать функцию y=|(cos(2 в кубе)+2sinx)/(5x-2Pi)| на отрезке от нуля до одного включая 0 и 1, с шагом h=0.9. Результаты вычислния вывести на экран в виде таблицы пар чисел х,у. Вычислить сумму и кол-во положительных значений функции у.
Прежде всего - опять явный брех в условии. Как это от нуля до одного с шагом 0.9, включая 0 и 1? Ну никак такой шаг не стыкуется - ни по величине, ни по кратности. В программе он заменен на h=0.1. Это хоть как-то. Потом, функция стоит под знаком абсолютной величины, а значит отрицательных значений иметь не может - какой тогда смысл в вычленении положительных значений? Сверьте еще раз условие задачи. А пока так:
Код:

VAR
 x,y,h,Sum:REAL;
 i,Npos:INTEGER;
BEGIN
 h:=0.1;
 Sum:=0;
 Npos:=0;
 For i:=0 to 10 do
  begin
  x:=h*i;
  y:=ABS((SQR(Cos(x*2))*Cos(x*2)+Sin(x)*2)/(x*5-2*Pi));
  WriteLn(x:3:1,y:15:5);
  If y>0 then
    begin
    INC(Npos);
    Sum:=Sum+y;
    end;
  end;
 Writeln('There are ',Npos,' positive values.');
 Writeln('Their sum is',Sum:15:5);
 ReadLn;
END.



Часовой пояс GMT +4, время: 21:25.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.