Задачи аналитической геометрии. Лабораторная работа №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;
}