НАВИГАЦИЯ
   Главная
  Программы для ПК [36]
  Программы для ПК-2 [3]
  Скрипты для WEB [8]
  Исходники на C, VC++, С++ Builder [12]
  Исходники на Basic [2]
  Исходники на Pascal [2]
  Исходники для микроконтроллеров [5]
  Электроника для дома [34]
  Электроника для аквариума [1]
  Электроника для автомобиля [11]
  Справочник [4]
  Разное [7]
  Проект "Умный дом"
  Файлы, библиотеки

  FAQ
  Рассылка новостей сайта

  Ссылки
  Сообщение автору

 
 
 
  Реальные знакомства по Украине, СНГ и за рубеж на любой вкус и цвет. Рассылка анкет. Помощь     Rambler's Top100  
Задача: Написать программу, которую составляли бы несколько функций, которые: 1. Из данных файла разчитывали точки n на координатной плоскости; 2. Находят пары точек между которыми самое большое и самое малое растояние; 3. Подсчитывают средний квадрат расстояний; 4. Все результаты выводятся на экран и результаты файла., xy1
Просмотров: 1423Дата изменения: 18.03.2007г.


/*
Написать программу, которую составляли бы несколько функций, которые:
1. Из данных файла разчитывали точки n на координатной плоскости;
2. Находят пары точек между которыми самое большое и самое малое растояние;
3. Подсчитывают средний квадрат расстояний;
4. Все результаты выводятся на экран и результаты файла.
*/
//---------------------------------------------------------------------------

#pragma hdrstop

#include <conio.h>
#include <string.h>
#include <math.h>
#include <values.h>
#include <iostream>
using namespace std;

#define MAX_X 40  // половина ширины экрана
#define MAX_Y 12  // половина длины экрана
#define MAX_LEN_STR 100  // максимальная длина буфера чтения

//---------------------------------------------------------------------------
// прототипы функций
void  OutData(int k, int *X, int *Y);
void  OutGraf(int k, int *X, int *Y);
void  OutMaxMin(int k, int *X, int *Y);
int   getLen(int x1, int x2);

//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
  bool err = false; // наличие ошибок
  int k, i;
  int *X, *Y;
  FILE *f;
  char s, *buf;
  if(argc!=2){
    cout << "Zapusk: xy1.exe ImjaFaila" << endl; cin.get(); return -1;
  }
  if((f=fopen(argv[1],"r"))==NULL){
    cout << "Oshibka otkrytija faila \"" << argv[1] << "\"" << endl; cin.get(); return -1;
  }
  buf = new char[MAX_LEN_STR]; // выделим память
  for(k=0;!feof(f); k++) // подсчитываем кол-во строк в файле
    if(fgets(buf,MAX_LEN_STR,f)==NULL) break;
  X = new int[k]; // выделим память
  Y = new int[k]; // выделим память
  fseek(f,0,0); // на начало файла
  for(i=0; i<k; i++){ // заполняем массивы координатами
    fgets(buf,MAX_LEN_STR,f);
    sscanf(buf,"%d %d", &X[i],&Y[i]);
    if(X[i]>MAX_X){
      cout << "Osibka v stroke " << i+1 << ". Chislo > " << MAX_X << endl;
      cin.get(); err=true; break;
    }
    if(Y[i]>MAX_Y){
      cout << "Osibka v stroke " << i+1 << ". Chislo > " << MAX_Y << endl;
      cin.get(); err=true; break;
    }
  }
  fclose(f);

  if(err==false) {
    for(s=' ';s!='0';){
      clrscr();
      cout << "KOMANDA:" << endl;
      cout << "0 - Exit" << endl;
      cout << "1 - Data" << endl;
      cout << "5 - Grafik" << endl;
      cout << "8 - Max-Min" << endl;
      switch(s){
        case '1':
          clrscr(); OutData(k,X,Y); break;
        case '5':
          clrscr(); OutGraf(k,X,Y); break;
        case '8':
          clrscr(); OutMaxMin(k,X,Y); break;
      }
      s = cin.get(); cin.get();
    }
  }
  delete []Y; // освободим память
  delete []X; // освободим память
  delete []buf; // освободим память
  return 0;
}
//---------------------------------------------------------------------------

// Вывод считанного файла
void  OutData(int k, int *X, int *Y)
{
  int a;
  char *b = new char[100];
  cout << "Npp    X    Y" << endl;
  for(a=0;a<k;a++){
    sprintf(b,"%3d%5d%5d",a+1,X[a],Y[a]);
    cout << b << endl;
  }
  delete []b;
}
//---------------------------------------------------------------------------
// выводит график
void  OutGraf(int k, int *X, int *Y)
{
  int i, xx,yy;
  clrscr();
  for(i=0;i<MAX_Y*2;i++){ // рисуем ось Y
    gotoxy(MAX_X,i+1); cout << "|";
  }
  for(i=0;i<MAX_X*2;i++){ // рисуем ось X
    gotoxy(i+1,MAX_Y); cout << "-";
  }
  for(i=0; i<k; i++){ // выводим данные
    if(X[i]>0) xx = X[i]+MAX_X; // добавляем смещение относительно оси Y
    else       xx = MAX_X + X[i];
    if(Y[i]>0) yy = MAX_Y - Y[i]; // добавляем смещение относительно оси X
    else       yy = MAX_Y + Y[i];
    gotoxy(xx,yy); cout << "*";
  }
  gotoxy(MAX_X*2,MAX_Y*2); // смещаем курсор, чтобы не мешал
}
//---------------------------------------------------------------------------
void  OutMaxMin(int k, int *X, int *Y)
{
  int i,j,tMax1,tMax2,tMin1,tMin2,xx,yy;
  long r,max,min;
  tMax1,tMax2,tMin1,tMin2=0;
  r=max=0;
  min=MAXLONG;  // максимальна величина числа
  printf("T1[x,y] : T2[x,y]  Rasst.\r\n");
  for(i=0;i<k-1;i++){
    for(j=i+1;j<k;j++){
      xx = getLen(X[i],X[j]);
      yy = getLen(Y[i],Y[j]);
      r = sqrt(xx*xx + yy*yy); // находим расстояние
      printf("%3d,%3d : %3d,%3d  L = %u\r\n", X[i],Y[i],X[j],Y[j],r);
      if(r>max)   { max = r; tMax1 = i; tMax2 = j; }
      if(min > r) { min = r; tMin1 = i; tMin2 = j; }
    }
  }
  printf("Max[%d,%d][%d,%u] = %d\r\n",X[tMax1],Y[tMax1],X[tMax2],Y[tMax2],max);
  printf("Min[%d,%d][%d,%u] = %d\r\n",X[tMin1],Y[tMin1],X[tMin2],Y[tMin2],min);
}
//---------------------------------------------------------------------------
//возвращает "правильное" расстояние между точками на одной оси
int getLen(int x1, int x2)
{
  if(x1>0 && x2>=0){
    if(x1>x2) return x1 - x2;
    return x2 - x1;
  }
  if(x1<=0 && x2>0) return (x1*(-1) + x2);
  if(x1>0 && x2<0) return (x1 + x2*(-1));
// оба отрицательные
  if(x1 > x2) return (x1*(-1) + x2);
  return (x1 + x2*(-1));
}
//---------------------------------------------------------------------------


 


Подпишитесь на рассылку новостей сайта!
Использование материалов возможно только при разрешении автора и с обязательным указанием ссылки на сайт vovka.sv19.com
Programmed by Vladimir Sharapov © 2004-2017 http://vovka.sv19.com