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

35.4 Вычислить значение арифметического выражения, преобразовав его в постфиксную форму. Предусмотреть со скобками и без скобок.(со стеком)

#include <stdio.h>

#include <string.h>

#include <conio.h>

// максимальное количество элементов в стеках

const int max_stack_len = 10000;

char stack_op[max_stack_len]; // Стек операций

char stack_nm[max_stack_len]; // Стек операндов

int stack_op_top = 0; // Переменная, указывающая на вершину стека операций

int stack_nm_top = 0; // Переменная, указывающая на вершину стека операндов

// Проверка содержимого вершины стека операций

char top_op() {

if (stack_op_top != 0) return (stack_op[stack_op_top-1]);

return (0);

}

// добавление значения в стек операций

void push_op(char value) {

stack_op[stack_op_top] = value; stack_op_top++;

}

// снятие элемента с вершины стека операций

char pop_op() {

stack_op_top--; return stack_op[stack_op_top];

}

// проверка на пустоту стека операций

int empty_op() {

if (stack_op_top == 0) return 1;

return 0;

}

// Проверка содержимого вершины стека операндов

char top_nm() {

if (stack_nm_top != 0)return (stack_nm[stack_nm_top-1]);

return (0);

}

// добавление значения в стек операндов

void push_nm(char value) {

stack_nm[stack_nm_top] = value; stack_nm_top++;

}

// снятие элемента с вершины стека операндов

char pop_nm() {

stack_nm_top--;

return stack_nm[stack_nm_top];

}

// проверка на пустоту стека операндов

int empty_nm() {

if (stack_nm_top == 0) return 1;

return 0;

}

// выделение числа из строки. вход: str - исходная строка, i - номер элемента, начиная скоторого необходимо выделить число, ф-я возвращает выделенное из строки число и новое значение индекса i

float get_digits(char *str, int &i)

{

float k=0.0, d=0.0;

while(str[i]!=0 && ((str[i]>='0' && str[i]<='9') || str[i]=='.')) {

if(str[i]=='.') d = 1;

else {k *= 10.0; k += str[i]-'0'; d *= 10;}

i++;

}

if(d==0) d=1; return(k/d);

}

// вычисление находящихся в стеке данных. выход: результаты вычислений накапливаются в стеке операндов

int count() {

char op;

int flag=1;

float v1,v2;

while(!empty_op() && top_op() != '(') {

op = pop_op();

if(op=='+') {

v2 = pop_nm();

v1 = pop_nm();

push_nm(v1+v2);

}

if(op=='-') {

v2 = pop_nm(); v1 = pop_nm(); push_nm(v1-v2);

}

if(op=='*') {

v2 = pop_nm(); v1 = pop_nm(); push_nm(v1*v2);

}

if(op=='/') {

v2 = pop_nm();

v1 = pop_nm();

if(v2==0.0) { flag=0; break; }

push_nm(v1/v2);

}

}

return(flag);

}

void main() {

char str[256]; int flag=1; float v;

printf("Введите выражение: "); scanf("%s", str);

for (int i=0; i<strlen(str); i++) {

if (str[i] >= '0' && str[i] <= '9') push_nm(get_digits(str,i));

if (str[i] == '(') push_op(str[i]);

if (str[i] == '*' || str[i] == '/') push_op(str[i]);

if (str[i] == '+' || str[i] == '-') {

if (count()==0) { flag=0; break; }

push_op(str[i]);

}

if (str[i] == ')') {

if (count()==0) { flag=0; break; }

// если на стеке операций не находится соответствующая

// открывающаяся скобка, то скобки неправильно расставлены

if (empty_op()) { flag=0; break; }

pop_op();

}

}

if(count()==0) flag=0;

//если остались невычисленные операции, то в выражении есть ошибка

if(!empty_op()) flag = 0;

//если в стеке операндов нет ответа, то в выражении есть ошибка

if(empty_nm()) flag = 0; else v = pop_nm();

// если после снятия ответа со стека операндов в нем ещё остались значения, то выражение содержит ошибку

if(!empty_nm()) flag=0;

if(flag) printf("%f\n", v);

else printf("Ошибка в выражении");

}

42.4 Скласти мовою С++ програму з використанням функції, що заповнює елементи матриці розміром mxn послідовно значеннями цілих чисел 0,1,2,3... Для форматування матриці в основній програмі використовувати динамічний масив, тому що розміри матриці зазделегіть не відомі.

#include <iostream.h>

#include <process.h> //Для exit().

int **single_matr(int n, int m)

{

//Вспомогательный указатель на матрицу.

int **p;

//Массив указателей на строки - одномерные массивы.

p= new int *[n];

if (p==NULL)

{

cout << "Не создан динамический массив!";

exit(1);

}

int mmm=0;

for (int i=0;i<n;i++)

{ //Формирование строки элементов типа int.

p[i]=new int [m];

if (p[i]==NULL)

{

cout << " Не создан динамический массив!";

exit(1);

}

//Заполнение текущей строки.

for (int j=0;j<m;j++)

{

p[i][j]=mmm;

mmm++;

}

}

return p;

}

void main()

{

int n, m;

cout << "\nЗадайте порядок матрицы: ";

cin >> n;

cout << "\nЗадайте порядок матрицы: ";

cin >> m;

int **matr; //Указатель для формируемой матрицы.

matr = single_matr(n, m);

for (int i=0;i<n;i++)

{

cout << "\nстрока " << (i+1) << ": ";

for (int j=0;j<n;j++)

cout << "\t" << matr[i][j];

}

for (i=0;i<n;i++) //Очистка памяти.

delete matr[i];

delete [] matr;

}

43.4) Программа приближенного вычисления уравнения x=2cos(x) с заданной точность e.

#include <iostream.h>

#include <math.h>

// Решение уравнения x=2cos(x) с заданной точностью e

// Метод решения: метод касательных Ньютона.

// для этого найдем производную:

// x=2cos(x) ..... 1=-2sin(x)

// используем формулу Xn = Xn-1 - F(Xn-1)/F'(Xn-1);

int main ()

{

double e;

double xn=0, xo, dx=0.001;

cout << "Введите точность e=";

cin >> e;

do

{

xo = xn;

xn = xo - (2.0*cos(xo)-xo)/(-2.0*sin(xo)-1.0);

xo += dx;

} while ( fabs(xo - xn)>e ) ;

cout << "ответ: корень 1 = " << xn << "\n";

cout << " корень 2 = " << -1.0 * xn << "\n";

return 0;

}

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