Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Л_практика

.doc
Скачиваний:
5
Добавлен:
15.06.2014
Размер:
87.04 Кб
Скачать

ОМСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

КАФЕДРА Информатики и вычислительной техники

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к лабораторным работам

по программированию на языке С.

ВЫПОЛНИЛ

студенты гр. В-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Угадал");

}