- •Программирование на языке высокого уровня си
- •Часть II
- •Содержание
- •Работа 1. Пользовательские функции в си
- •I. Теоретический раздел работы
- •1. Функции
- •1.1. Аргументы функций
- •1.2.Функции, возвращающие значения.
- •1.3. Функция main ()
- •2. Рекурсия.
- •II. Экспериментальный раздел работы
- •III. Задания для самостоятельной работы
- •Работа 2. Структурированный тип данных массив
- •I. Теоретический раздел работы
- •1.1. Структурированный тип данных массив
- •1.2. Передача массива в качестве параметра
- •1.3. Многомерные массивы
- •II. Экспериментальный раздел
- •III. Задания для самостоятельной работы.
- •Работа 3. Символьный и строковый типы данных
- •1.1. Символьный тип данных
- •Работа 4. Структуры
- •I. Теоретический раздел работы
- •1.1. Структура
- •1.2. Объединение
- •1.3. Переименование типов
- •II. Экспериментальный раздел работы
- •III. Задания для самостоятельной работы
- •Работа 5. Работа с файлами
- •I. Теоретический раздел работы
- •1.1.Введение
- •1.1. Потоковый ввод-вывод
- •1.2. Открытие и закрытие потока
- •1.3. Стандартные файлы и функции для работы с ними.
- •1.4. Форматированный ввод-вывод
- •1.5. Прямой доступ к файлам
- •II. Экспериментальный раздел работы.
- •III. Задания для самостоятельной работы
- •Список литературы
- •Учебное издание
- •Часть II
II. Экспериментальный раздел
Пример 1. Составим процедуры ввода и вывода данных. Пусть покупается n разных товаров. Известна цена ci и количество mi каждого товара. Требуется вычислить общую стоимость приобретенного товара.
#include <iostream.h>;
#include <conio.h>;
#include <math.h>;
#include <STDLIB.H>;
#include <string.h>;
const NomEl = 100;
double* c1;
int* k1;
int Data(double* &c, int* &k);
void Print(double* c, int* k,int n);
void Sum(double* c,int* k,int n, double& s1, int& s2);
/*Основная программа*/
void main(void)
{ int s2; double s1; int n;
n = Data(c1,k1);
Print(c1,k1,n);
Sum(c1,k1,n,s1,s2);
cout<<endl<<"Itogo:"<<s1<<" "<<s2;
getch();
}
/*подпрограмма ввода массива */
int Data(double* &c, int* &k)
{ char text1[60]=" вводите последовательно цену и количество товара";
char text2[60]="Отрицательное значение одной из этих величин – конец покупок!";
int i;
cout<<endl<<text1<<endl<<text2; i=0;
c = new double[NomEl];
k = new int[NomEl];
do { i++;
cout<<endl<<"cena=?"; cin>>c[i];
cout<<"kolichestvo=?"; cin>>k[i];
} while ((c[i]>0.0)&&(k[i]>0));
return i-1;
}
/*подпрограмма вывода массива */
void Print(double* c, int* k,int n)
{
char txt1[20]="----------------";
char txt2[20]=" N cena kol-vo";
int i;
cout<<txt1<<endl<<txt2<<endl<<txt1<<endl;
for (i=1; i<=n; i++)
{
cout<<endl<<i<<" "<<c[i]<<" "<<k[i]<<endl;
}
cout<<txt1;
};
/* подпрограмма суммирования данных*/
void Sum(double* c,int* k,int n, double& s1, int& s2)
{ int i;
s1=0.0; s2=0;
for (i=1; i<=n;)
{
s1=s1+c[i]*k[i]; s2=s2+k[i];i++;
}
};
Теперь дополним нашу программу процедурами вставки и удаления элементов в массиве. Для осуществления вставки числа z1 в массив z[i] после номера k необходимо:
первые k элементов сохранить без изменения;
все элементы массива, начиная с (k+1) – сдвинуть вправо;
на место элемента (k+1) записать число z1.
/* подпрограмма вставки элемента*/
void Insert(int k,int m1,double z1, double* z, int* m, int &n)
{int i;
for (i=n; i>=k+1; i--)
{ z[i+1]=z[i]; m[i+1]=m[i];}
z[k+1]=z1; m[k+1]=m1; n=n+1;
};
Здесь k – номер элемента, после которого необходимо вставить числа:
m1 – количество товара, которое добавляется и
z1- его цена.
Аналогично составим процедуру удаления элемента с номером k из массива, при этом все элементы, начиная с номера k, необходимо сдвинуть влево.
/* подпрограмма удаления элемента*/
void Delete(int k, double* z, int* m, int &n)
{ int i;
n=n-1;
for (i=k; i<=n;i++)
{
z[i]=z[i+1]; m[i]=m[i+1];
}
};
Тогда в основной программе, после завершения процедур, осуществляющих формирование массивов цены с[i] , количества k[i] и суммы купленного товара, можно организовать небольшой диалог для удаления или добавления определенного количества товаров, чтобы уложиться в определенную, наперед указанную, сумму.
#include <iostream.h>;
#include <conio.h>;
#include <math.h>;
#include <STDLIB.H>;
#include <string.h>;
const NomEl = 100;
double* c1;
int* k1;
int Data(double* &c, int* &k);
void Print(double* c, int* k,int n);
void Sum(double* c,int* k,int n, double& s1, int& s2);
void Insert(int k,int m1,double z1, double* z, int* m, int &n);
void Delete(int k, double* z, int* m, int &n);
/*Основная программа*/
void main(void)
{ int s2; double s1,ci; int n,j,mi;
n = Data(c1,k1);
Print(c1,k1,n);
Sum(c1,k1,n,s1,s2);
cout<<endl<<" Итого:"<<s1<<" "<<s2<<endl;
cout<<endl<<" Добавить покупки после номера j="; cin>>j;
cout<<"цена =?"; cin>>ci;
cout<<"количество=?"; cin>>mi;
Insert(j,mi,ci,c1,k1,n);
Print(c1,k1,n);
Sum(c1,k1,n,s1,s2);
cout<<endl<<" Итого:"<<s1<<" "<<s2<<endl;
cout<<endl<<"Какую строку удалить =?",j; cin>>j;
Delete(j,c1,k1,n);
Print(c1,k1,n);
Sum(c1,k1,n,s1,s2);
cout<<endl<<" Итого:"<<s1<<" "<<s2<<endl;
getch();
}
Заметим, что также можно организовать и процедуру обмена элементами в массиве.
void Swap(double a,b);
{ double z;
z=a; a=b; b=z
};
И, при необходимости, вызывать ее в основной программе: Swap(c[k1],c[k2]);
Пример 2. Составим программу транспонирования матриц, вычисления произведения двух квадратных матриц
и преобразования двухмерной матрицы в одномерную. Пусть элементы исходных матриц a и b задаются с помощью датчика случайных чисел.
Program Example_102;
#include <iostream.h>;
#include <conio.h>;
#include <math.h>;
#include <STDLIB.H>;
typedef int matr[5,5];
typedef int vectr[25];
void Data(matr t);
void Print(matr t);
void Tp(matr t);
/*Основная программа*/
void main(void)
{
randomize();
matr a,b,c;
vectr d;
cout<<"massiv a";
Data(a);
Print(a);
Tp(a);
Print(a);
cout<<"massiv b"; Data(b); Print(b);
Tp(b);
Print(b);
Dv(a,b,c);
cout<<"massiv c";
Print(c);
Tr(c,d);
getch();
}
/*подпрограмма ввода массива */
void Data(matr t)
{ int i,j;
for (i=1; i<=5; i++)
for (j=1; j<=5; j++)
t[i,j]=random(21)-10;
};
/*подпрограмма вывода массива */
void Print(matr t)
{int i,j;
cout<<"\n";
for (i=1; i<=5; i++)
{
for (j=1; j<=5; j++)
cout<<t[i,j]<<" ";
cout<<"\n";
}
}
/*подпрограмма транспонирования матрицы */
void Tp(matr t)
{
int i,j,n,p;
n=5;
for (i=1; i<=n-1; i++)
for (j=i+1; j<=n; j++)
{
p=t[i,j];
t[i,j]=t[j,i];
t[j,i]=p;
}
// return t;
};
/* подпрограмма преобразования двумерной матрицы в одномерную*/
void Tr(matr x ;vectr z)
{
int i,j,n,k;
n=5;
for (i=1; i<= n; i++)
{
for (j=1; j<= n; j++)
{
k=(i-1)*n+j; z[k]=x[i,j] ; cin>>z[k];
};
getch();
}
};
/*подпрограмма переyмножения двух матриц*/
void Dv(matr x,y, z)
{int i,j,k;
for (i=1; i<=nn; i++)
for (j=1; j<=nn; j++)
{ s=0;
for (k=1; k<= nn; k++)
s=s+x[i,k]*y[k,j] ; z[i,j]=s
}
geth()
}
Проведите отладку и тестирование программы. Дополните её процедурами вычисления определителей и обращения матриц.
Пример 3. Разработаем программу решения системы из трех линейных уравнений методом Крамера.
#include <iostream.h>;
#include <conio.h>;
#include <math.h>;
#include <STDLIB.H>;
typedef double vectr[n];
typedef double matr[n,n+1];
void Data(matr a);
void Print(matr a);
void Swap(double a,b);
double Det(matr a);
/*вычисление определителя*/
double Turn(int k);
void Solve_Kram(matr a; double x);
/* подпрограмма, реализующая метод Крамера
/*Основная программа*/
void main(void)
{ int I; matr a; vectr z; int n=3;
Data(a); Print(a); Solve_Kram(a,z);
for (I=1; I<= n; I++) cout<<[“<<=’<<j];
getch();
}.
void Data(matr a)
........................
void Print(matr a)
........................
void Swap(double a,b)
........................
double Det(matr a)
double Turn(int k)
{ double s=0.0; int k1,k2,k3,k4;
k1=2-k; k2=2; k3=2+k;
for (I=1;I<= n;i++)
{
s=s + a[1,k1]*a[2,k2]*a[3,k3];
k4=k1; k1=k2; k2=k3; k3=k4
};
return(s);
};
{
return(Turn(1)-Turn(-1))
};
void Solve_Kram(matr a; double x)
{ double d; int I,j;
d=Det(a);
if (abs(d) < 1.0e-6 ); { cout>>’Error’; Exit };
for (j=1; j<=n; j++)
{
for (I=1; I<=n; I++) {Swap(a[I,j],a[I,j+1]);}
x[j]=Det(a)/d;
for (I=1; I<=n; I++) Swap(a[I,n+1],a[I,j])
};
}.
Разобравшись с приведенным текстом программ, проведите их отладку и тестирование. Поэкспериментировав с программой, проведите её улучшения по части сервиса и т.д.