Задачи аналитической геометрии. Лабораторная работа №2

Формулировка задания
На плоскости задано множество точек. Определить, какой должна быть величина r, чтобы окружности радиуса r с центрами в заданных точках не пересекались.

Код программы
#include "stdafx.h"

#include <cstring>

#include <stdlib.h>

#include<stdio.h>

#include<math.h>

using namespace std;

struct point{double x;double y;};

point points[1000];

int Check()

{

int n=1;

while(n)

{

int s;

fflush(stdin);

if(scanf("%d",&s)!=1) {puts("Error.Repeat");}

else return s;

}

}

int _tmain(int argc, _TCHAR* argv[])

{

puts("How many points?");

int n=Check();

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

{

puts("X:");

points[i].x=Check();

puts("Y:");

points[i].y=Check();

}

/*ищем минимальное расстояние между двумя заданными точками

чтобы получить радиус, делим полученное минимальное расстояние пополам

и получаем значение радиуса

и округляем, для удобства, до трёх знаков после запятой*/

double min=sqrt(pow(points[1].x-points[2].x,2)+pow(points[1].y-points[2].y,2));

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

for(int j=i+1;j<n;j++)

{

double a=sqrt(pow(points[j].x-points[i].x,2)+pow(points[j].y-points[i].y,2));

if(a<min) min=a;

}

min=min/2;

min = floor(min*1000)/1000;

printf("%s%g\n","Radius found: ",min);

system("pause");

return 0;

}

Обработка матриц и массивов. Лабораторная работа №3

Формулировка задания
Заданы: матрица A порядка n и три вектора x1, x2, b размером n. Проверить, какой из векторов (x1; x2 ) является решением уравнения Ax=b (или ни один из них).

Код программы

#include "stdafx.h"

#include <cstring>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#include <windows.h>

using namespace std;

int matrix[20][20];

int x1[20];

int x2[20];

int b[20];

void gotoxy(int x, int y)

{

COORD coord;

coord.X = x;

coord.Y = y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);

}

int Check()

{

int n=1;

while(n)

{

int s;

fflush(stdin);

if(scanf("%d",&s)!=1) {puts("Error.Repeat");}

else return s;

}

}

//функция выдает 1 если х решение, 0 если нет.

//для этого мы пересножаем матрицу А с вектором х и сравниваем с вектором в

int decision(int matrix[20][20],int x[20],int b[20],int n)

{

int k=1;

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

{

int m=0;

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

{

m+=matrix[i][j]*x[j];

}

if((m!=b[i])||(k==0)) k=0;

}

if (k==1) return 1;

else return 0;

}

int _tmain(int argc, _TCHAR* argv[])

{

puts("Enter n");

int n=Check();

puts("Enter matrix");

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

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

matrix[i][j]=Check();

puts("Enter x1");

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

x1[i]=Check();

puts("Enter x2");

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

x2[i]=Check();

puts("Enter b");

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

b[i]=Check();

system("cls");

puts("Matrix");

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

{

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

printf("%d%s",matrix[i][j]," ");

puts("");

}

gotoxy(40,0);

puts("x1");

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

{

gotoxy(40,i+1);

printf("%d%s",x1[i]," ");

}

puts("");

gotoxy(50,0);

puts("x2");

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

{

gotoxy(50,i+1);

printf("%d%s",x2[i]," ");

}

puts("");

gotoxy(60,0);

puts("b");

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

{

gotoxy(60,i+1);

printf("%d%s",b[i]," ");

}

puts("");

puts("");

if(decision(matrix,x1,b,n)) puts("A*x1=b");

else puts("A*x1!=b");

if(decision(matrix,x2,b,n)) puts("A*x2=b");

else puts("A*x2!=b");

system("pause");

return 0;

}

Обработка символьной, строковой и текстовой информации. Лабораторная работа №4

Формулировка задания
Для каждого из слов заданного предложения указать, сколько раз оно встречается в предложении.

Код программы

#include "stdafx.h"

#include <stdio.h>

#include <iostream>

#include <string.h>

#include <cstring>

#include <stdlib.h>

#include <cstdlib>

#include <conio.h>

int _tmain(int argc, _TCHAR* argv[])

{

setlocale(LC_ALL, "");

char string[201];

fflush(stdin);

puts("Введите предложение, содержащее не более 200 символов.Символами конца предложеня являются .!?, после них предложение не считывается. Символы , ; () : "" разделители");

gets(string);

string[200]='\0';

strlwr(string);

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

char *str= strtok(string, ".!?");

char **a;

a = (char **)calloc(20, sizeof(char *));

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

a[i] = (char *)calloc(20, sizeof(char));

int n=0;

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

str = strtok(str, " ,.:;()-\"");

a[n]=str;

n++;

while (str != NULL)

{

a[n]=str;

str = strtok (NULL, " ,.:;()-\"");

n++;

}

puts("Слова и их количество в предложении");

//считаю сколько встрчается каждае слово

int d[40];//для этого создаю массив, в котором для повторяющихся слов значение соответствующей ячейки массива меняю на 0

for(int i=0;i<n;i++) d[i]=1;

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

{

int f=1;

if(d[i]==1)

{

for(int j=i+1;j<n;j++)

if(strcmp(a[i],a[j])==0) { f++;d[j]=0;}

if(i!=0)

printf("%s%s%d",a[i]," ",f);

else printf("%s%s%d",a[i]," ",f-1);

puts("");

}

}

system("pause");

return 0;

}

Рекурсия.

5.1 Лабораторная работа №5.1

Формулировка задания
Описать функцию min(x) для определения минимального элемента вектора x, введя вспомогательную рекурсивную функцию min1(k), находящую минимум среди последних элементов вектора x, начиная с k-го.

Код программы

#include "stdafx.h"

#include <iostream>

int *a;

int n;

int Check()

{

int n=1;

while(n)

{

int s;

fflush(stdin);

if(scanf("%d",&s)!=1) {puts("Error.Repeat");}

else return s;

}

return 0;

}

int min1(int k)

{

if(k<n) return min(a[k],min1(k+1));

else return a[n-1];

}

int min(int *a)

{

return min1(0);

}

int _tmain(int argc, _TCHAR* argv[])

{

setlocale(LC_ALL, "");

puts("Введите длину вектора");

n=Check();

a = (int *)calloc(n, sizeof(int ));

puts("Введите вектор");

for(int i=0;i<n;i++) a[i]=Check();

printf("Минимум: %d\n",min(a));

free(a);

system("pause");

return 0;

}

5.2 Лабораторная работа №5.2

Формулировка задания
Лабиринт может быть задан матрицей соединений, в котором для каждой пары комнат указано, соединены ли они коридором. Дана матрица соединений лабиринта из n комнат и номера комнат (i, j) (1<=i<=n, 1<=j<=n). Построить путь из комнаты с номером i в комнату с номером j.

Код программы

#include "stdafx.h"

#include <iostream>

int edges[100][100];

int mark[100];

int prior[100];

int finish;

int start;

int n;

void DFS(int v, int from)//обход в глубину

{

if (mark[v] != 0) // Если мы здесь уже были, то тут больше делать нечего

{

return;

}

mark[v] = 1; // Помечаем, что мы здесь были

prior[v] = from; // Запоминаем, откуда пришли

if (v == finish) // Проверяем, конец ли

return;

for (int i = 0; i < n; i++) // Для каждого ребра

{

if(edges[v][i]==1)

DFS(i, v); // Запускаемся из соседа

}

}

int Check()

{

while(1)

{

int s;

fflush(stdin);

if(scanf("%d",&s)!=1) {puts("Введите число!");}

else return s;

}

return 0;

}

int Checkm()

{

while(1)

{

int s;

fflush(stdin);

if(scanf("%d",&s)!=1) {puts("Введите число!");}

else if((s==0)||(s==1)) return s;

else puts("0 или 1! Повторите");

}

return 0;

}

int _tmain(int argc, _TCHAR* argv[])

{

setlocale(LC_ALL, "");

puts("Введите количество комнат");

n=Check();

puts("Введите матрицу соединений (1-соединено,0-нет)");

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

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

{

printf("%s%d%s%d%s\n","Комнаты: ",i+1,"-",j+1,":");

edges[i][j]=Checkm();

}

puts("Введите первую комнату");

int in;

int k=1;

while(k)

{

fflush(stdin);

if(scanf("%d",&in)!=1) {puts("Введите число!");}

else if((in>=0)&&(in<=n)) k=0;

else puts("Число не превышающее количество комнат!");

}

in--;

puts("Введите вторую комнату");

int jn;

k=1;

while(k)

{

fflush(stdin);

if(scanf("%d",&jn)!=1) {puts("Введите число!");}

else if((jn>=0)&&(jn<=n)) k=0;

else puts("Число не превышающее количество комнат!");

}

jn--;

finish=jn;

start=in;

for(int i=0;i<n;i++) mark[i]=0;

for(int i=0;i<n;i++) prior[i]=0;

DFS(start,-1);

int ans[100];

int i=0;

for (int v = finish; v != start; v = prior[v]) // Проходим по пути из конца в начало

{

ans[i]=v; // Запоминаем вершину

i++;

}

ans[i]=start;

system("cls");

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

{

for(int j=0;j<n;j++) printf("%d ",edges[i][j]);

puts("");

}

puts("Путь");

for(i;i>=0;i--)// Переворачиваем путь

printf("%d ",ans[i]+1);

puts("");

system("pause");

return 0;

}

Наши рекомендации