Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Zadachi_OOP_SPIOS_Assembler.doc
Скачиваний:
4
Добавлен:
28.10.2018
Размер:
314.37 Кб
Скачать

16.4 Представить многочлен в виде линейного списка. Написать прогу кот выполняет сложение многочленов

// будем считать что списки упорядочены по возрастанию степеней элементов многочленов

list* add(list *t1,list *t2)

{

list * new_list,*tek;

list *l1 = t1;

list *l2 = t2;

bool flg = false;

while((l1!=NULL)&&(l2!=NULL))

{//пока не кончится один из двух многочленов

if(l1->s!=l2->s)//если степени не равны

{

if(l1->s>l2->s)//если степень 1-го больше чем 2-го

{

while((l1->s!=l2->s)&&(l2!=NULL))//пока степени не выровняются

{

list *h = new list;//создаем 1-й элемент

h->k=l2->k;

h->s=l2->s;

h->next=NULL;

if(!flg)//если это первый элемент

{//создаем начало списка

flg = true;

new_list = h;

tek = h;

}else{//иначе добавляем в очередь

tek->next = h;

tek = h;

}

l2 = l2->next;//перходим к след эл-ту

}}else{//если степень 2-го больше чем 1-го

while((l1->s!=l2->s)&&(l1!=NULL)){ //пока степени не выровняются

list *h = new list;//созд новый эл-т очереди

h->k=l1->k;

h->s=l1->s;

h->next=NULL;

if(!flg) //если это первый элемент

{//создаем начало списка

flg = true;

new_list = h;

tek = h;

}else{//иначе добавляем в очереь

tek->next = h;

tek = h;

}

l1=l1->next; //перходим к след эл-ту

}}

}else{//если степени равны

list *temp = new list; //созд новый эл-т очереди

temp->k = l1->k+l2->k;//коэф складываем

temp->s = l1->s;

temp->next = NULL;

if(!flg) {

new_list = temp;

tek = temp;

flg = true;

}else

{

tek ->next = temp;

tek = temp;

}

}

l1=l1->next;

l2=l2->next;

}

//проверяем который многочлен не окончился и дописываем в конец резельтирующего многочлена

if((l1!=NULL)&&(l2==NULL))//незакончился 1-ый

while(l1!=NULL){

list *tt = new list;

tt->s = l1->s;

tt->k= l1->k;

tt->next= NULL;

tek->next = tt;

tek = tt;

l1=l1->next;

}else

if((l1==NULL)&&(l2!=NULL))//незакончился 2-ой

while(l2!=NULL){

list *tt = new list;

tt->s = l2->s;

tt->k= l2->k;

tt->next= NULL;

tek->next = tt;

tek = tt;

l2=l2->next;

}

return new_list;

}

17.4 Написать процедуру, которая осуществляет сложение целых чисел произвольной длины(двухсвязный список)

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <io.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

struct list { // стр-ра, ссылающаяся сама на себя

int info;

list *prev;

list *next;

list() { prev=NULL; next=0; info=0; }

};

void insert_post(list **, list **, list**, int);

void printList(list *);

int countItems(list *);

list *first1=0; // голова 1-го списка

list *last1=0; // хвост 1-го списка

list *first2=0; // голова 2-го списка

list *last2=0; // хвост 2-го списка

void main( void )

{

char digit[10], num1[100], num2[100];

unsigned int i;

list *p1, *p2;

printf("Enter first whole number:\n");

scanf("%s", num1);

printf("\nEnter second whole number:\n");

scanf("%s", num2);

for(i=0; i<strlen(num1); i++) {

p1=last1;

sprintf(digit, "%c", num1[i]);

insert_post(&p1, &first1, &last1, atoi(digit));

}

printList(first1);

for(i=0; i<strlen(num2); i++) {

p2=last2;

sprintf(digit, "%c", num2[i]);

insert_post(&p2, &first2, &last2, atoi(digit));

}

printList(first2);

int cnt1 = countItems(first1);

int cnt2 = countItems(first2);

int rem=0, tmp;

p1 = last1;

p2 = last2;

if(cnt1>=cnt2) {

while(p2!=NULL) {

tmp = p1->info + p2->info + rem;

if(tmp>=10) { tmp -= 10; rem = 1; }

else rem = 0;

p1->info = tmp;

p1 = p1->prev;

p2 = p2->prev;

}

if(rem) p1->info += 1;

printList(first1);

}

else {

while(p1!=NULL) {

tmp = p1->info + p2->info + rem;

if(tmp>=10) { tmp -= 10; rem = 1; }

else rem = 0;

p2->info = tmp;

p1 = p1->prev;

p2 = p2->prev;

}

if(rem) p2->info += 1;

printList(first2);

}

}

/* Вставка элемента после текущего */

void insert_post(list **q, list **first, list **last, int value)

{

list *p = new list;

if ((*q) != 0)

{

p->next = (*q)->next;

p->prev = *q;

}

p->info = value;

if ((*q) == 0)

{

*first = p;

*last = p;

}

else

{

if ((*q)->next == 0) *last = p;

else (*q)->next->prev = p;

(*q)->next = p;

}

}

/* count items in the list */

int countItems(list *q)

{

int cnt=0;

while(q!=NULL) {

cnt++;

q = q->next;

}

return cnt;

}

/* Print the list */

void printList(list *q)

{

if (q == 0) printf("List is empty.\n\n");

else {

printf("The list is:\n");

while (q != 0) {

printf("%d-> ", q->info);

q = q->next;

}

printf("NULL\n\n");

}

}

ООП

18.4 Перегрузка операции << и >>(вставка и извлечение) для класса “Точка трехмерного пространства”

#include <iostream.h>

#include <string.h> // Для работы со строковыми функциями.

//Определение класса (пользовательского типа):

struct string

{

int length;

char line[80];

};

// Прототип операции-функции для перегрузки операции <<:

ostream& operator << (ostream& out, string str);

void main()

{

string st; // Объект st класса string.

strcpy(st.line,"Содержимое строки.");

st.length = strlen(st.line);

cout << st;

}

ostream& // Тип возвращаемого значения.

operator << (ostream& out, string str)

{

out << "\n Длина строки: " << str.length;

out << "\n Значение строки: " << str.line;

return out;

}

=============================================

//OOР10_1.СРР - перегрузка операции ввода >>.

#include <iostream.h>

struct point // Точка трехмерного евклидова пространства.

{

float x;

float y;

float z;

};

istream& // Тип возвращаемого значения.

operator >> (istream& in, point& d)

{

cout <<"\n Введите три координаты точки: " << "\nx = ";

in >> d.x;

cout << "y = "; in >> d.y;

cout << "z = "; in >> d.z;

return in;

} void main() { point D; cin >> D; }

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]