3.2 Со статическим определением массива
/*Даны натуральное число N и вещественные числа a и b(a<b). Сформировать
матрицу X(N,N), элементами которой Являются вещественные случайные числа,
равномерно распределенные на отрезке [a,b].Найти в матрице строку с минимальным
элементом и поменять ее местами с первой строкой.
СК-01 Бакин А А 2005г. */
#include <stdlib.h> //функции обработки строк
#include <stdio.h> //Функции ввода - вывода для стандартных потоков
#include <ctype.h> //Функции и макросы проверки и преобразования символов
#include <conio.h> //Функции для работы с терминалом в текстовом режиме
#include <string.h>
const max1=10;
const max2=10000.0;
double number(double min, double max, int pnt); //функция ввода числа
void inX(int N,double a,double b,double X[][max1]);//формирование входного массива
void pr_mas(int N,double X[][max1], char* str); //печать выходного массива
void dec(int N,double X[][max1],int minrow); //Функция замены строки
int min_row(int N,double X[][max1]);//Функция опред. строки с мin элементом
void main() //главная функция
{
char ch;
double X[max1][max1]; //статический массив
int N,i,minrow;
double a, b;
do {
clrscr();
printf(" ЗАДАНИЕ № 1\n");
printf(" Даны натуральное число N и вещественные числа a и b(a<b). Сформировать\n");
printf("матрицу X(N,N), элементами которой Являются вещественные случайные числа,\n");
printf("равномерно распределенные на отрезке [a,b].Найти в матрице строку с минимальным\n");
printf("элементом и поменять ее местами с первой строкой.\n");
ch=0;
do {
printf("\nВведите размерность матрицы (N * N) от 2 до %d: ",max1);
N=number(2,max1,1); //вызов функции ввода количества элементов массива
}
while((N<2||N>10)&&N!=0x1B);
if(N!=0x1B) {
do {
printf("\nВведите значение a от -100 до 100 : ");
a=number(-100,100,0); //вызов функции ввода количества элементов массива
}
while(a>=max2 && a!=0x1B);
if(a!=0x1B) {
do {
printf("\nВведите значение b от %lg до 200 : ",a);
b=number(a+0.01,200,0); //вызов функции ввода числа
}
while(a>b&&b!=0x1B);
if(b!=0x1B) {
inX(N,a,b,X); //вызов функции формирования входного массива
char *str = "\nInput massive\n";
pr_mas(N,X,str);
minrow=min_row(N,X);
dec(N,X,minrow);
str = "Output massive\n";
pr_mas(N,X,str);
}}}
printf("\n\nПродолжить работу программы можно по нажатию клавиши 'Y'.\n");
ch=(char)toupper(getch());
}
while (ch=='Y');
printf("\n\nКонец работы программы");
}
void pr_mas(int N,double X[][max1], char *str)
{
int i,j;
printf("%s",str);
for (i=0;i<N;i++)
{
printf("\n");
for (j=0;j<N;j++)
{
printf("%7.3lg",X[i][j]);
}
}
}
void dec(int N,double X[][max1],int minrow)
{
int i;
double temp;
for (i=0;i<N;i++)
{
temp=X[minrow][i];
X[minrow][i]=X[0][i];
X[0][i]=temp;
}
}
int min_row(int N,double X[][max1])
{
double min,minrow=0;
int i,j;
min=X[0][0];
for (i=0;i<N;i++)
for (j=0;j<N;j++)
{
if (X[i][j]<min)
{
min=X[i][j];
minrow=i;
}
}
printf("\n\nЗначение min элемента массива: %7.3lg\n",min);
printf("Строка c min элементом: %lg\n" ,minrow+1);
return minrow;
}
void inX(int N,double a,double b,double X[][max1])
{
int i=0,j;
double c;
randomize();
do
{
j=0;
do //ввод эл-тов
{
c=rand();
c=(c*(b-a)/32767)+a;
X[i][j]=c;
j++;
}
while(j<N);
i++;
}
while(i<N);
}
//---------функция проверки вводимого действительного числа
double number(double min, double max, int pnt)
{
char str[40], ch;
double num;
int ind=0;
char *str2 = "E", *ptr;
int i,j,xs,ys,ee=0,et=0;
xs=wherex(); //Координаты курсора
ys=wherey();
gotoxy(xs,ys);
do
{
ch=(char)getch();
ch=(char)toupper(ch);// Чтение символа с клавиатуры и преобразование в прописной символ
if (ch==0x1B) {printf("Esc"); return 0x1B;} //Esc
if (ch>='0' && ch<='9'&& ind<10) //Если это цифры 0..9 то
{ str[ind]=ch;putch(str[ind]);ind++; } //Очередной символ в строку, увеличить счетчик символов
if ((ind!=0)&&(ch=='.')&&(et!=1)&&(pnt==0)) //Анализ на ввод точки
{ str[ind]=ch;putch(str[ind]);ind++;et=1; }
if (((ind!=0)&&((ch=='E')||(ch=='E')))&&(ee!=1))
{ str[ind]=ch;putch(str[ind]);ind++;ee=1; }
if (((ind==0)&&(ch=='-'))||((ch=='-')&&(str[ind-1]=='E'))) //Анализ на знак минуса
{ str[ind]=ch;putch(str[ind]);ind++; }
if (ch==8 && ind>=1 ) //Если нажата клавиша BACKSPACE
{
if ((str[ind-1]>='0' && str[ind-1]<='9')|| str[ind-1]=='-')
{
ind=--ind;
gotoxy(xs,ys); //отступ на один символ влево
str[ind]=0;str[ind+1]=' ';
for(j=0;j<=ind;j++)
{ putch(str[j]);}
putch(0x8);
}
if (str[ind-1]=='E')
{ind=--ind;gotoxy(xs,ys);str[ind]=0;ee=0;str[ind+1]=' ';
for(j=0;j<=ind;j++)
{ putch(str[j]);}putch(0x8); }
if (str[ind-1]=='.')
{ind=--ind;gotoxy(xs,ys);str[ind]=0;et=0;str[ind+1]=' ';
for(j=0;j<=ind;j++)
{putch(str[j]);}
putch(0x8); }
}
if(ch==13 && ind==0) ch=14;
if(ch==13) { // нажата клавиша ENTER
num=atof(str); //пpеобpазуем всю стpоку в число
if(num>=min&&num<=max) { //если число соответствует диапазону
return(num); } //то функция возвpащает числовое значение
ch=14; }
} while(ch!=13);
return(0);
}