Л_практика
.docОМСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КАФЕДРА Информатики и вычислительной техники
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к лабораторным работам
по программированию на языке С.
ВЫПОЛНИЛ
студенты гр. В-221
Шмаков А.А.
РУКОВОДИТЕЛЬ
Дорошенко М.С.
Омск 2003.
Лабораторная работа №1.
Тема: ПРОГРАММИРОВАНИЕ СЛОЖНЫХ АЛГОРИТМОВ С ИСПОЛЬЗОАНИЕМ НЕСКОЛЬИХ ФУНКЦИЙ.
ЗАДАНИЕ АРГУМЕНТОВ ФУНКЦИИ В ВИДЕ МАССИВОВ.
Задание:
9. Преобразовать 3 матрицы в одномерные массив, упорядочить и произвести обратное преобразование. Найти наибольшее и наименьшее значения в каждой из матриц.
Текст программы:
#include <conio.h>
#include <iostream.h>
#include <stdio.h>
//Главная функция
int glav( int mas[4][4]);
int matr1 [4][4]={{0,-4,3,2},{4,-4,54,7},{5,-5,4,-54},{-4,7,-7,0}};
int matr2 [4][4]={{4,-7,4,9},{0,-5,-2,-99},{34,3,0,7},{43,-54,-4,0}};
int matr3 [4][4]={{32,-4,5,-6},{0,-5,7,8},{98,54,3,43},{-54,43,9,5}};
int main()
{
clrscr();
cout<<"Matrix 1:\n";
glav(matr1);
cout<<"\n\n";
cout<<"Matrix 2:\n";
glav(matr2);
cout<<"\n\n";
cout<<"Matrix 3:\n";
glav(matr3);
getchar();
return 0;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int glav(int mas[4][4])
{
//Вывод матриы
for (int i=0; i < 4; i++)
{for (int j=0; j < 4; j++)
cout << mas[i][j]<<" ";
cout<<"\n";
}
cout<<"\n";
//преобразование в одномерный массив
int a=0;
int mas_odn[16];
for (int i=0; i < 4; i++)
for (int j=0; j < 4; j++)
{
mas_odn[a]=mas[i][j];
a++;
}
for (int i=0; i < 16; i++)
cout<<mas_odn[i]<<" ";
cout<<"\n";
//Упорядочивание массива
for (int i=0; i<15; i++)
{
int imin=i;
for (int j=i+1; j<16; j++)
if (mas_odn[j] < mas_odn[imin]) imin = j;
int c=mas_odn[i];
mas_odn[i]=mas_odn[imin];
mas_odn[imin]=c;
}
for (int i=0; i<16; i++)
cout << mas_odn[i]<<" ";
cout<<"\n";
//Обратное преобразование
a=0;
for ( int i=0; i < 4; i++)
{cout<<"\n";
for (int j=0; j < 4; j++)
{
mas[i][j]=mas_odn[a];
a++;
cout << mas[i][j]<<" ";
}
}
//Наибольшее и наименьшее значение в каждой из матриц
cout<<"\n\n max: "<<mas_odn[15];
cout<<"\n min: "<<mas_odn[0];
return 0;
}
Лабораторная работа №2.
Тема: Обработка символьных и строковых данных.
Задание:
9. Вычислить длину совпадающих частей строк S1 и S2, S1 и S3.
Текст программы:
#include <stdio.h>
#include <string.h>
main()
{
int str1len,str2len,str3len,i=0,count1 = 0,count2 = 0;
char *str1[100],*str2[100],*str3[100];
printf("S1: ");
gets(str1);
printf("S2: ");
gets(str2);
printf("S3: ");
gets(str3);
str1len = strlen(str1);
str2len = strlen(str2);
str3len = strlen(str3);
if(str1len < str2len) str2len = str1len;
while(i<str2len)
{
if(str1[i] != str2[i]) break;
count1++;
i++;
}
i = 0;
if(str1len < str3len) str3len = str1len;
while(i<str3len)
{
if(str1[i] != str3[i]) break;
count2++;
i++;
}
printf("S1 coBnagaeT c S2: %d\n", count1);
printf("S1 coBnagaeT c S3: %d\n", count2);
getchar();
}
Лабораторная работа №3.
Тема: РАБОТА С ФАЙЛАМИ, ВВОД-ВЫВОД В ЯЗЫКЕ С++.
Задание:
9. В текстовом файле S1 записана последовательность из N*K чисел. Написать программу, формирующую в файле S2 матрицу из N строк по K элементов.
Текст программы:
#include <stdio.h>
#include <fstream.h>
#include <stdlib.h>
#include <conio.h>
void main()
{
int k, n;
int i, j;
clrscr();
printf("Input N: ");
scanf("%d", &n);
printf("Input K: ");
scanf("%d", &k);
ofstream out;
out.open("S1.txt");
for (i=0; i<(n*k); i++)
{
j=rand()%100;
out<<j<<' ';
}
out.close();
int a[20][20];
ifstream in;
in.open("S1.txt");
for (i=0; i<n; i++)
{
for (j=0; j<k; j++)
{
in>>a[i][j];
}
}
in.close();
out.open("S2.txt");
for (i=0; i<n; i++)
{
for (j=0; j<k; j++)
{
out<<a[i][j]<<' ';
}
out<<'\n';
}
out.close();
}
Лабораторная работа №4.
Тема: Структурированные типы данных. Структуры.
Задание:
9. Сформировать список граждан, в котором указать фамилию, имя,
отчество; адрес, профессию. Организовать в программе выборку и подсчет
граждан с одинаковой профессией.
Текст программы:
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
{
struct ListOfPeople
{
char surname[20];
char firstname[20];
char secondname[20];
char addres[30];
char profession[20];
} List[20];
int kolvo;
char srch[20];
int i, counter=0;
clrscr();
printf("Input number of peple: ");
scanf("%d", &kolvo);
for (i=0; i<kolvo; i++)
{
printf("Input Surname of men %d: ", (i+1));
scanf("%s", &List[i].surname);
printf("Input First Name of men %d: ", (i+1));
scanf("%s", &List[i].firstname);
printf("Input Second Name of men %d: ", (i+1));
scanf("%s", &List[i].secondname);
printf("Input Addres of men %d: ", (i+1));
scanf("%s", &List[i].addres);
printf("Input Profession of men %d: ", (i+1));
scanf("%s", &List[i].profession);
printf("\n");
}
printf("What profession to search: ");
scanf("%s", &srch);
printf("\n");
for (i=0; i<kolvo; i++)
{
if ((strlen(List[i].profession)==strlen(srch)) &&
(strstr(List[i].profession, srch)!=0))
{
printf("-- %s %s %s (%s)\n", List[i].surname, List[i].firstname,
List[i].secondname, List[i].addres);
counter++;
}
}
printf("----------------------------------------- %d\n\n", counter);
getchar();
}
Лабораторная работа №5.
Тема: Графика.
Задание:
9. Построить график астроиды: X=B cos^3 T, Y= B sin^3 T, O<=T<=2П. Значения В и шага угла Т подобрать экспериментально.
Текст программы:
#include"iostream.h"
#include"graphics.hpp"
#include"dos.h"
#include"stdlib.h"
#include"conio.h"
#include"math.h"
int main(void)
{
int gdriver = DETECT,gmode,errorcode;
int x,y;
int B = 2;
int T;
int StepT = 0.5;
initgraph(&gdriver,&gmode,"");
setbkcolor(1);
setcolor(15);
outtextxy(340,200," астроида (схематичски)");
setcolor(12);
line((getmaxx()/2)-5,0,(getmaxx()/2)-5,getmaxy());
line(0,getmaxy()/2,getmaxx(),getmaxy()/2);
for (T=0;T<=2*3.1415926;T+=StepT)
{
x=B*cos(T)*cos(T)*cos(T);
y=B*sin(T)*sin(T)*sin(T);
putpixel(x,y,10);
}
getch();
closegraph();
}
Лабораторная работа №6.
Тема: Классы, объекты. Функции-члены класса в языке С++.
Задание:
9. Создайте класс IntegerSet (множество целых). Каждый объект класса
может вмещать целые в диапазоне от 0 до 100. Множество представлено
внутренне как массив из нулей и единиц. Элемент массива a[i] равен
1, если целое i находится в множестве. Элемент массива a[j] равен 0,
если целое j не находится в множестве. Конструктор по умолчанию ини-
циализирует множество как пустое, т.е. множество, чье представление
в виде массива содержит только нули. Напишите функции-элементы для
типичных операций над множествами. Например, функцию-элемент unionO-
fIntegerSet, которая создает третье множество, являющееся теорети-
ко-множественным объединением двух существующих (т.е. элемент масси-
ва третьего множества устанавливается равным в 1, если этот элемент
равен 1 хотя бы в одном или обоих существующих множествах, и элемент
массива третьего множества устанавливается равным 0, если этот эле-
мент равен 0 в обоих существующих множествах). Например, функ-
цию-элемент intersectionOfIntegerSets, которая создает третье мно-
жество, являющееся теоретико-множественным пересечением двух сущест-
вующих наборов (т.е. элемент массива третьего множества устанавлива-
ется равным в 0, если этот элемент равен 0 в одном или обоих сущест-
вующих множествах, и элемент массива третьего множества устанавлива-
ется равным 1, если этот элемент равен 1 в обоих существующих).
Текст программы:
#include <iostream.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
char ch;
class IntegerSet{ //описание класса отр
public:
int array[101];
IntegerSet(){memset(array,0,sizeof(array));}
AddValue(int val){array[val] = 1;}
RemoveValue(int val){array[val] = 0;}
void unionOfIntegerSet(IntegerSet *SetToUnion,IntegerSet *ResultSet);
void intersectionOfIntegerSets(IntegerSet *SetToIntersect,IntegerSet *ResultSet);
};
void IntegerSet::unionOfIntegerSet(IntegerSet *SetToUnion,IntegerSet *ResultSet)
{
for(int i = 0;i<101;i++)
{
ResultSet->array[i] = array[i]|SetToUnion->array[i];
}
}
void IntegerSet::intersectionOfIntegerSets(IntegerSet *SetToIntersect,IntegerSet *ResultSet)
{
for(int i = 0;i<101;i++)
{
ResultSet->array[i] = array[i]&SetToIntersect->array[i];
}
}
int main() //Основная программа
{
IntegerSet Set1,Set2,Set3;
srand( (unsigned)time( NULL ) );
for(int i = 0;i<20;i++)
{
Set1.AddValue(rand()%100);
Set2.AddValue(rand()%100);
}
Set1.unionOfIntegerSet(&Set2,&Set3);
//в сет3 результат объединения
Set2.intersectionOfIntegerSets(&Set1,&Set3);
//в сет3 результат пересечения
return 0;}
Лабораторная работа №7.
Тема: конструкторы и деструкторы.
Задание:
9. Создайте класс prompt. Введите в него конструктор, который выводит на
экран приглашение (строку) и затем позволяет ввести набранные вами целые.
Класс должен выделить память под строки с длинами равными введенным вами це-
лым и случайным образом заполнить их (строки). Функция-член opa() должна
сформировать новую строку и заполнить ее поочередно символами 1 и 2 строк.
Текст программы:
#include <iostream.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>
class prompt{
unsigned len1,len2;
public:
char *str1,*str2;
prompt();
~prompt();
char * opa(void);
};
prompt::prompt()
{
int i;
srand( (unsigned)time( NULL ) );
clrscr();
printf("ЇаЁЈ« 襨Ґ :)");
scanf("%d", &len1);
scanf("%d", &len2);
str1 = new char[len1+1];
for(i = 0;i<len1;i++)
{
str1[i] = rand()%256;
}
str1[i] = 0;
str2 = new char[len2+1];
for(i = 0;i<len2;i++)
{
str2[i] = rand()%256;
}
str2[i] = 0;
}
prompt::~prompt()
{
delete str1;
delete str2;
}
char * prompt::opa()
{
int min,i;
bool flag;
if(len1>len2) {min = len2;flag = true;}
else {min = len1;flag = false;}
char *resstr = new char[len1+len2+1];
for(int i = 0;i<min*2;i++)
if(i%2) resstr[i] = str1[(i-i%2)/2];
else resstr[i] = str2[i/2];
for(i = min*2;i<len1+len2;i++)
if(flag) resstr[i] = str1[i-min];
else resstr[i] = str2[i-min];
resstr[i] = 0;
return resstr;
}
int main() //Основня программа
{
prompt pr;
char *newstr = pr.opa();
printf(pr.str1);
printf("\n");
printf(pr.str2);
printf("\n");
printf(newstr);
delete newstr;
return 0;
}
Лабораторная работа №8.
Тема: ЭЛЕМЕНТЫ С++ И ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ.
НАСЛЕДОВАНИЕ В С++.
Задание:
9.Создать класс-родитель телефон и его класс-наследник адрес (вывести,
изменить).
Текст программы:
//Описание классов
class Phone
{ protected:
char phonenumber[20]; //ФИО
public: Phone(char n[]);
public: void show(void); //Ф-ция: вывод информации
};
class Address: public Phone
{
char street[50]; //улица
char home[10]; //дом
public: Address(char x[20],char n[50],char s[10]);
public: void show(void);
};
//--------привычная часть программы------------------------
#include<stdio.h>
#include<conio.h>
#include<string.h>
//реализация классов
//--------------class Phone----------------------------------
Phone::Phone(char n[20])
{ strcpy(phonenumber,n);
}
void Phone::show(void) //функция вывода информации
{ gotoxy(10,4);printf("Phone number : %s",phonenumber);
}
//-----------------class Address--------------(наследник Phone)
Address::Address(char x[20],char n[50],char s[10])
:Phone(x) //используем клаcc Phone
{
strcpy(street,n); //и добавляем кучу членов-subject-ов :)))
strcpy(home,s);
}
void Address::show(void)
{ Phone::show();
gotoxy(10,6);printf("Street : %s",street);
gotoxy(10,8);printf("Home : %s",home);
}
//----------------основная программа------------------------
void main()
{ Phone *ph;
Address *ad;
clrscr();
gotoxy(26,1);
cprintf("Телефон :");
ph=new Phone("911");
ph->show();
delete ph;
gotoxy(25,24);
cprintf("Нажмите же что нибудь !");
getch();
clrscr();
gotoxy(25,1);
cprintf("Адрес :");
ad=new Address("222222","х.з.","10");
ad->show();
delete ad;
gotoxy(25,24);
cprintf("Press any key to exit or any other key to continue... :)");
getch();
}
Лабораторная работа №9.
Тема : Наследование.
Задание:
Разработать программу простого наследования, в которой были бы при-
ведены примеры возможностей доступа между base class и derive class
при режиме доступа protected.
Текст программы:
#include<stdio.h>
#include<conio.h>
#include<string.h>
//Описание классов
class Phone
{ protected:
char phonenumber[20]; //ФИО
public: Phone(char n[]);
public: void show(void); //Ф-ция: вывод информации
};
class Address: public Phone
{
private:
char street[50]; //улица
protected:
char home[10]; //дом
public: Address(char x[20],char n[50],char s[10]);
public: void show(void);
ChangeAdress(char x[20],char n[50],char s[10]);
};
class FullAddress:protected Address
{
public:
char zip[10];
FullAddress(char x[20],char n[50],char s[10],z[10]);
}
//реализация классов
//--------------class Phone----------------------------------
Phone::Phone(char n[20])
{ strcpy(phonenumber,n);
}
void Phone::show(void) //функция вывода информации
{ gotoxy(10,4);printf("Phone number : %s",phonenumber);
}
//-----------------class Address--------------(наследник Phone)
Address::Address(char x[20],char n[50],char s[10])
:Phone(x) //используем клаcc Phone
{
strcpy(street,n); //и добавляем кучу членов-subject-ов :)))
strcpy(home,s);
}
void Address::show(void)
{ Student::show();
gotoxy(10,6);printf("Street : %s",street);
gotoxy(10,8);printf("Home : %s",home);
}
Address::ChangeAdress(char x[20],char n[50],char s[10])
{
strcpy(phonenumber,x);
strcpy(street,n);
strcpy(home,s);
}
FullAddress::FullAddress(char x[20],char n[50],char s[10],z[10])
:Address(x,n,s)
{
strcpy(zip,z);
}
//----------------основная программа------------------------
void main()
{ Phone *ph;
Address *ad;
clrscr();
gotoxy(26,1);
cprintf("Телефон :");
ph=new Phone("911");
ph->show();
delete ph;
gotoxy(25,24);
cprintf("Нажмите же что нибудь !");
getch();
clrscr();
gotoxy(25,1);
cprintf("Адрес :");
ad=new Address("222222","х.з.","10");
ad->show();
delete ad;
gotoxy(25,24);
cprintf("Press any key to exit or any other key to continue... :)");
getch();
}
Лабораторная работа №10.
Тема: ЭЛЕМЕНТЫ С++ И ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ(ООП).
ПОЛИМОРФИЗМ. ПЕРЕГРУЗКА ОПЕРАЦИЙ И ФУНКЦИЙ В С++.
Задание:
9.Время задается в формате час/минута/секунда. Реализовать следующие опера-
ции(учесть переход через 24 часа):
а)сложение двух моментов времени(операция +);
б)определение времени дня по заданному количеству пройденных секунд(опера-
ция /);
Кроме того, членом класса сделать функцию с именем printf() для вывода
конечного времени.
Текст программы:
//Описание классов
class Time
{ public:
int hour;
int min;
int sec;
public: Time(int h,int m,int s);
public: void printf(void); //Ф-ция: вывод информации
};
#include<stdio.h>
#include<conio.h>
#include<string.h>
//реализация классов
//--------------class Phone----------------------------------
Time::Time(int h,int m,int s)
{
hour = h;min = m;sec = s;
}
void Time::printf(void) //функция вывода информации
{
clrscr();
::printf("Time %2d/%2d/%2d",hour,min,sec);
}
Time operator + (Time a,Time b) //перегрузка операции +
{static Time res(0,0,0);
res.hour = a.hour+b.hour;
res.min = a.min+b.min;
res.sec = a.sec+b.sec;
res.min += (res.sec - res.sec%60)/60;
res.sec=res.sec%60;
res.hour += (res.min - res.min%60)/60;
res.min=res.min%60;
res.hour=res.hour%24;
return res;}
Time operator / (Time a,int b) //перегрузка операции /
{static Time res(0,0,0);int i;
res.hour = a.hour;
res.min = a.min;
res.sec = a.sec+b;
res.min += (res.sec - res.sec%60)/60;
res.sec=res.sec%60;
res.hour += (res.min - res.min%60)/60;
res.min=res.min%60;
res.hour=res.hour%24;
return res;}
//----------------основная программа------------------------
void main()
{
static Time a(12,35,30),b(5,30,50),c(0,0,0);
a.printf();
getch();
b.printf();
getch();
c = a+b;
c.printf();
getch();
c = a/10000;
c.printf();
getch();
}
Лабораторная работа №11.
Тема: ЭЛЕМЕНТЫ C++ И ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ(ООП).
ДРУЖЕСТВЕННЫЕ ФУНКЦИИ.
Задание:
9. Реализовать игру "угадай число" для чисел от 0 до 10. Суть игры заключается в том, что машина загадывает число, а пользователь или сама машина (на выбор из меню) угадывают это число анализируя ответы ("больше" или "меньше") машины.
Текст программы:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include <stdlib.h>
#include <time.h>
//Описание классов
class Numb
{ private:
int number;
public:
Numb(int n):number(n){};
friend bool compare(Numb *,int);
};
bool compare(Numb *n,int i)
{
if(n->number > i) printf("больше\n");
if(n->number < i) printf("меньше\n");
return n->number == i;
}
//реализация классов
//----------------основная программа------------------------
void main()
{
int answer;
srand( (unsigned)time( NULL ) );
Numb a(rand()%11);
clrscr();
do
{
printf("угадывай ");
scanf("%d", &answer);
}
while(!compare(&a,answer));
printf("\nУгадал");
}