- •Содержание
- •Глава 1. Описание языка c ......................................................................... 5
- •Глава 2. Описание языка fortran ....................................................... 38
- •Глава 3. Решение задач на языках c и fortran ................................ 70
- •Глава 1. Описание языка c
- •1.1. Структура c-программы
- •1.2. Скалярные типы данных и константы, строковые константы
- •1.3. Описание скалярных переменных. Директива #define
- •1.4. Операции. Выражения
- •1.5. Стандартные математические функции
- •1.6. Ввод-вывод
- •Int printf ( строка формата [ , список вывода ] )
- •Int scanf ( строка формата , список ввода )
- •1.7. Метки, оператор goto, условные конструкции, оператор break, функция exit
- •If ( логическое выражение ) оператор/блок [ else оператор/блок ]
- •1.8. Циклические конструкции
- •1.9. Указатели, адресная арифметика
- •1.10. Массивы
- •1.11. Функции
- •1.12. Классы памяти. Общие правила описания. Оператор typedef
- •1.13. Строковые переменные, ввод-вывод строк, стандартные функции обработки строк. Функции проверки символов
- •Int sprintf(char* s,char* формат [ , список вывода ] )
- •1.14. Макроопределения
- •1.15. Внешние файлы
- •Int fclose(file* указатель на файл )
- •Int feof(file* файл )
- •1.16. Структуры, объединения, битовые поля
- •1.17. Динамическое распределение памяти
- •1.18. Графика
- •Глава 2. Описание языка fortran
- •2.1. Структура fortran-программы
- •2.2. Типы данных. Константы
- •2.3. Описание переменных, правила умолчания, операторы
- •Implicit тип ( буквы ) , ...
- •2.4. Оператор присваивания. Операции
- •2.5. Стандартные математические функции
- •2.6. Ввод-вывод
- •2.7. Оператор соntinue. Операторы перехода. Условные операторы
- •If (логическое выражение)оператор
- •If (арифметическое выражение)метка1,метка2,метка3
- •2.8. Операторы цикла
- •2.9. Функции loc, locfar, locnear
- •2.10. Массивы
- •2.11. Подпрограммы subroutine, function и interface
- •Intrinsic список имен
- •2.12. Общие области, подпрограмма block data. Оператор equivalence
- •2.13. Символьные переменные
- •2.14. Операторные функции
- •2.15. Внешние файлы
- •2.16. Структуры
- •2.17. Динамические массивы
- •2.18. Графика
- •Глава 3. Решение задач на языках c и fortran
- •Задача 1. Вывод натурального числа
- •Задача 2. Сумма ряда
- •Задача 3. Медленная сортировка
- •Задача 4. Быстрая сортировка
- •Задача 5. Слова
- •Задача 6. График
- •Задача 7. Кубическое уравнение
- •Задача 8. Собственное число
- •Комментарии к задачам
Задача 3. Медленная сортировка
Ввести последовательность вещественных чисел длиной не более 100 чисел. Упорядочить последовательность по неубыванию, используя алгоритм сортировки выбором.
{ Решение задачи 3 на языке PASCAL }
CONST Nmax=100;
TYPE TArray=ARRAY[1..Nmax] OF Real;
VAR A : TArray; n,i,j,Imin : Byte; Min : Real;
BEGIN Write('Введите длину последовательности ');
Read(n);
IF (n=0)OR(n>Nmax) THEN BEGIN
WriteLn('Неверная длина'); Halt; END;
WriteLn('Введите последовательность');
FOR i:=1 TO n DO Read(A[i]);
FOR i:=1 TO n-1 DO BEGIN
Imin:=i; Min:=A[i];
FOR j:=i+1 TO n DO
IF A[j]<Min THEN BEGIN Min:=A[j]; Imin:=j; END;
IF Imin<>i THEN BEGIN A[Imin]:=A[i]; A[i]:=Min; END;
END;
WriteLn('Упорядоченная последовательность :');
FOR i:=1 TO n DO Write(A[i]:16); WriteLn;
END.
/* Решение задачи 3 на языке C */
#define NMAX 100
typedef double TArray[NMAX];
void main(void) {TArray a; char n,i,j,Imin; double Min;
printf("\nВведите длину последовательности "); scanf("%i",&n);
if(n<=0||n>NMAX){printf("\nНеверная длина"); exit(1);}
printf("\nВведите последовательность\n");
for(i=0;i<n;i++)scanf("%lg",a+i);
for(i=0;i<n-1;i++){
for(Imin=i,Min=a[i],j=i+1;j<n;j++)if(a[j]<Min){Min=a[j];Imin=j;}
if(Imin!=i){a[Imin]=a[i];a[i]=Min;}}
printf("\nУпорядоченная последовательность :\n");
for(i=0;i<n;i++)printf("%16lg",a[i]);}
C Решение задачи 3 на языке FORTRAN
PARAMETER(Nmax=100)
REAL*8 A(Nmax),Min
INTEGER*1 n,i,j,Imin
PRINT*,'Введите длину последовательности '
READ*,n
IF (n.LE.0.OR.n.GT.Nmax) STOP'Неверная длина'
PRINT*,'Введите последовательность'
READ*,(A(i),i=1,n)
DO 1 i=1,n-1
Imin=i
Min=A(i)
DO 2 j=i+1,n
IF(A(j).LT.Min) THEN
Min=A(j)
Imin=j
END IF
2 CONTINUE
IF(Imin.NE.i) THEN
A(Imin)=A(i)
A(i)=Min
END IF
1 CONTINUE
PRINT*,'Упорядоченная последовательность :'
PRINT 99,(a(i),i=1,n)
99 FORMAT(5G16.3)
END
Задача 4. Быстрая сортировка
Ввести натуральное число N, не превосходящее 10000. Получить N случайных натуральных чисел, не превосходящих 999. Упорядочить числа по неубыванию, используя алгоритм сортировки бинарными вставками.
{ Решение задачи 4 на языке PASCAL }
{$X+}
USES Crt;
CONST Nmax=10000; Range=1000;
TYPE TArray=ARRAY[1..Nmax] OF Word;
PROCEDURE Print(n:Word; VAR A:TArray);
VAR i : Word;
BEGIN i:=1;
WHILE i<=n DO BEGIN
Write(A[i]:4);
IF i MOD 480=0 THEN BEGIN
Write('Нажмите клавишу'); ReadKey; WriteLn; END;
Inc(i);
END;
IF i MOD 480<>0 THEN BEGIN
Write(#10,#13,'Нажмите клавишу'); ReadKey; WriteLn; END;
END;
PROCEDURE BinarySort(n:Word; VAR a:TArray);
VAR i,Nsort,as,bs,xs,Tmp : Word;
BEGIN Nsort:=1;
WHILE Nsort<n DO BEGIN
Tmp:=a[Nsort+1];
IF Tmp>=a[Nsort] THEN BEGIN Inc(Nsort); Continue; END;
IF Tmp<=a[1] THEN BEGIN
FOR i:=Nsort+1 DOWNTO 2 DO a[i]:=a[i-1];
a[1]:=Tmp; Inc(Nsort); Continue; END;
as:=1; bs:=Nsort; xs:=(as+bs)DIV 2;
WHILE (xs<>as)AND(xs<>bs) DO BEGIN
IF Tmp=a[xs] THEN BEGIN bs:=xs+1; Break; END;
IF Tmp<a[xs] THEN bs:=xs ELSE as:=xs;
xs:=(as+bs)DIV 2;
END;
FOR i:=Nsort+1 DOWNTO bs+1 DO a[i]:=a[i-1];
a[bs]:=Tmp; Inc(Nsort);
END;
END;
VAR A : TArray; n,i : Word;
BEGIN Write('Введите длину последовательности '); Read(n);
Randomize; FOR i:=1 TO n DO A[i]:=Random(Range);
Print(n,A);
WriteLn('Упорядоченная последовательность :');
BinarySort(n,A); Print(n,A);
END.
/* Решение задачи 4 на языке C */
#include<stdio.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>
#define NMAX 10000
#define RANGE 1000
void Print(unsigned n,unsigned a[]){ unsigned i;
i=1; while(i<=n){printf("%4u",a[i]);
if(!(i%480)){printf("Нажмите клавишу"); getch(); printf("\n");}i++;}
if(i%480){printf("\nНажмите клавишу"); getch(); printf("\n");}}
void BinarySort(unsigned n,unsigned a[]){ unsigned i,Nsort=0,as,bs,xs,Tmp;
while(++Nsort<n){Tmp=a[Nsort+1];
if(Tmp>=a[Nsort])continue;
if(Tmp<=a[1]){for(i=Nsort+1;i>=2;i--)a[i]=a[i-1];a[1]=Tmp;continue;}
as=1; bs=Nsort; xs=(as+bs)/2;
while(xs!=as&&xs!=bs){if(Tmp==a[xs]){bs=xs+1;break;}
if(Tmp<a[xs])bs=xs;else as=xs; xs=(as+bs)/2;}
for(i=Nsort+1;i>bs;i--)a[i]=a[i-1]; a[bs]=Tmp;}}
void main(void) { unsigned A[NMAX+1],n,i;
printf("\nВведите длину последовательности "); scanf("%i",&n);
randomize(); for(i=1;i<=n;i++)A[i]=random(RANGE);
Print(n,A); printf("Упорядоченная последовательность :\n");
BinarySort(n,A); Print(n,A);}
C Решение Задачи 4 на языке FORTRAN
SUBROUTINE $Print(n,A)
INTEGER*2 A(n)
nn=n/460
DO 1 i1=1,nn
PRINT 999,(A(i),i=(i1-1)*460+1,i1*460)
1 PAUSE'Нажмите ENTER'
IF(MOD(n,460).GT.0) THEN
PRINT 999,(A(i),i=nn*460+1,n)
PAUSE'Нажмите ENTER'
ENDIF
999 FORMAT(20I4)
END
SUBROUTINE BinarySort(n,a)
INTEGER*2 a(n),as,bs,xs,Tmp
Nsort=1
DO 99 WHILE(Nsort.LT.n)
Tmp=a(Nsort+1)
IF(Tmp-a(Nsort))1,99,99
1 IF(Tmp-a(1))2,2,3
2 DO 100 i=Nsort+1,2,-1
100 a(i)=a(i-1)
a(1)=Tmp
GOTO 99
3 as=1
bs=Nsort
xs=(as+bs)/2
DO WHILE(xs.NE.as.AND.xs.NE.bs)
IF (Tmp.EQ.a(xs)) THEN
bs=xs+1
EXIT
ENDIF
IF(Tmp.LT.a(xs)) THEN
bs=xs
ELSE
as=xs
ENDIF
xs=(as+bs)/2
END DO
DO 101 i=Nsort+1,bs+1,-1
101 a(i)=a(i-1)
a(bs)=Tmp
99 Nsort=Nsort+1
END
PARAMETER(Nmax=10000,Range=1000)
INTEGER*2 A(Nmax)
PRINT *,'Введите длину последовательности '
READ*,n
CALL GetTim(ih,im,is,is100)
CALL Seed(is*100)
DO 1 i=1,n
CALL Random(x)
1 A(i)=x*Range
CALL $Print(n,A)
PRINT*,'Упорядоченная последовательность :'
CALL BinarySort(n,A)
CALL $Print(n,A)
END
