powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / работа с файлами fstream, а также устранение дубликатов при расчете минимального расстояни
8 сообщений из 8, страница 1 из 1
работа с файлами fstream, а также устранение дубликатов при расчете минимального расстояни
    #34899987
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!

Всем программистам привет! Respect! В общем столкнулся с проблемой следующего плана. Есть у меня элементарнейший класс комплексных чисел:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
class complex
{
public:
   double x, y;
public:
   complex();
   ..........
};

затем необходимо пользователю предложить ввести имя файла, например так:
Код: plaintext
Console :: writeline("Введите имя файла для хранения значения");

затем предложить ввести некое целое значение от 1 до 100 и записать эту цифру в только что созданный файл. Например ввод числа:
Код: plaintext
1.
Console :: writeline("Введите целое число от 1 до 100");
Console :: readln(count);
Затем необходимо открыть этот файл и считать записанное в файле значение допустим в переменную iter. Но я незнаю как используя библитеку fstream обработать данные действия.

как известно комплексное число представляет из себя z = a + b * i. Необходимо определить наименьшее расстояние между двумя точками на комплексной плоскости, где а и в меняются циклически от 1 до iter(то значение которое ввел пользователь). Это я сделал следующим образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
int main()
{
	int count =  0 ;				  // общее количество дублирующих точек(идут парами)


	int iter =  3 ;				  // необходимо считать из файла	
	double minMt_old =  1000 ;      // допущение, заранее большее
	complex value;				  // создаем объект класса complex	
	double minMt;				  // минимальное расстояние между двумя точками на комплексной плоскости

	double Xprev, Yprev;		  // запоминаем значения каждого из элемент - данных объекта	
	Xprev =  1000 ;				  // запоминаем предыдущие значения из элемент - данных объекта	
	Yprev =  1000 ;

	double result;				  // минимально возможно допустимое расстояние между двумя точками	
//=================================================================
// начинаем поиск минимально допустимого расстояние между комплесными точками
//=================================================================
	for ( int i =  1 ; i <= iter; i++)
	{
		for( int j =  1 ; j <= iter; j++ )
		{			
			value.x = i;
			value.y = j;
			for( int m =  1 ; m <= iter; m++)
				for( int n =  1 ; n <= iter; n++ )
				{
					if( i == m && j == n )
					{
						// оставлено на всякий чп
					}
					else
					{
						Xprev = m;
						Yprev = n;

						minMt = sqrt( (value.x - Xprev) * (value.x - Xprev) + (value.y - Yprev) * (value.y - Yprev) );
						if( minMt < minMt_old )
						{
							result = minMt;
						}
					}
				}
		}
	}
	Console :: WriteLine("Минимально возможное состояние равно: " + result);
	
	Console :: WriteLine();
	Console :: WriteLine("Между данными точками расстояние минимально");
	Xprev = Yprev =  1000 ;
	for( int i =  1 ; i <= iter; i++)
	{
		for( int j =  1 ; j <= iter; j++ )
		{

			Console :: WriteLine();
			value.x = i;
			value.y = j;

			for( int m =  1 ; m <= iter; m++)
			{
				for( int n =  1 ; n <= iter; n++ )
				{
					if( m == i && n == j )
					{

					}
					else
					{
						Xprev = m;
						Yprev = n;
						minMt = sqrt( (value.x - Xprev) * (value.x - Xprev) + (value.y - Yprev) * (value.y - Yprev) );
						if( minMt == result )
						{

							Console :: Write( " { " + Xprev  + " + " + Yprev + " * i  ;  ");
							Console :: Write( value.x + " + " + value.y + " * i } " );
							Console :: WriteLine();
							count++;
						}
					}
				}
			}
			
			//Xprev = value.x;
			//Yprev = value.y;
		}
	}



	/*complex x(3, 4);
	complex y(5,5);
	complex z;
	z = x + y;

	Console::WriteLine(x.abs());*/
	Console :: read
	Console :: WriteLine(count);
	Console::ReadKey();
    return  0 ;

но вся проблема в том, что я имею кучу дубликатов, т е например две пары комплексных чисел абсолютно идентичны
2 + 4i и 4 - 3i
и
4 - 3i и 2+4i.
Пока не совсем понятно, как можно избавиться от дубликатов в этих циклах, а также запись и чтение из файла при помощи fstream(как то в инете быстро ничего не смог найти). Подскажите как быть то?
...
Рейтинг: 0 / 0
работа с файлами fstream, а также устранение дубликатов при расчете минимального расстояни
    #34900030
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!
вроде кое что узнал про запись в файл:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
FILE *dateFile;
	char letter;
	dateFile = fopen("test.doc", "w");
	if( dateFile == NULL )
	{
		puts("Невозможно открыть указанный файл");		
	}

	do 
	{
		letter = getchar();
		fputs(letter, dateFile);
	}
	while(letter != '\r');
		fclose(dateFile);
но при компиляции выдается ошибка, мол:
Код: plaintext
Error	 2 	error C2664: 'fputs' : cannot convert parameter  1  from 'char' to 'const char *'	c:\Complex\Complex\Complex.cpp	 107 
. Подскажите как быть то?
...
Рейтинг: 0 / 0
работа с файлами fstream, а также устранение дубликатов при расчете минимального расстояни
    #34900044
65432100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть
fputs(dateFile,letter);
...
Рейтинг: 0 / 0
работа с файлами fstream, а также устранение дубликатов при расчете минимального расстояни
    #34900052
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!
авторМожет быть
fputs(dateFile,letter);
:) нет.
...
Рейтинг: 0 / 0
работа с файлами fstream, а также устранение дубликатов при расчете минимального расстояни
    #34900057
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fputs печатает строку а ты пихаешь символ. Надо пользовать fputc
...
Рейтинг: 0 / 0
работа с файлами fstream, а также устранение дубликатов при расчете минимального расстояни
    #34900080
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а зачем дважды перебирать точки?
Достаточно
for( int m = i+1; m <= iter; m++)
for( int n = j+1; n <= iter; n++ )
Ежели хочешь сделать свой вывод в поток
Надо определить опреаторы
ostream& operator<<(ostream& out, const Complex& complex);
istream& operator>>(istream& in, Complex& complex);
...
Рейтинг: 0 / 0
работа с файлами fstream, а также устранение дубликатов при расчете минимального расстояни
    #34900108
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!

в общем с файлом более менее разобрался, только одна проблема осталась: я считываю из файла в строковую переменную, а в итоге это необходимо преобразовать в целое число, т е есть '142', а необходимо 142:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
#include "stdafx.h"
#include<stdio.h>
#include<conio.h>

int _tmain(int argc, _TCHAR* argv[])
{
	// Создаем новый или перезаписываем существующий и заносим туда некое строковое значение
	FILE *fp;      // указатель на файл

	char letter;   
	int res;       // целое число, в которое необходимо преобразовать строку

	puts("VVedite tseloe chislo ot 1 do 100. Dlya vihoda nasgmite 'E' ");
	if((fp = fopen("MYFILE.doc","w"))==NULL)
		{
			puts("Nevozmosgno otkrit' file");
		}
	letter = ' ';
	while( letter != 'E')
	{
			letter=getchar();
			if( letter == 'E')
				break;
			fputc(letter, fp);
	}

	fclose(fp);

	// считываем в переменную значение, содержащееся в файле
	char name[4];        // т к максимально может быть только 100(три знака, да и то очень редко)

	if ((fp = fopen("MYFILE.doc", "r")) == NULL)
		{
			puts("Nevozmosgno otkrit' file");
		}

	fgets(name,  4 , fp);
	fclose(fp);	
	//res = int(name);  // здесь глючит

	//puts(string(res));
	
	getch();            // задержка программы

	return  0 ;
}
т е name содержит нужные данные, но как строка, как ее можно попробовать преобразовать в целое, заодно и проверить, если не получиться, значит пользователь ввел некорректные данные. Подскажите как быть то?
...
Рейтинг: 0 / 0
работа с файлами fstream, а также устранение дубликатов при расчете минимального расстояни
    #34900116
Фотография FasterHarder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
I started in 1983, in 2007 i still on a case!

вроде нашел:)
Код: plaintext
1.
#include <stdlib.h>
res = atof(name)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / работа с файлами fstream, а также устранение дубликатов при расчете минимального расстояни
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]