Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2015, 11:29   #1
vova_makr
Пользователь
 
Регистрация: 25.09.2015
Сообщений: 42
По умолчанию Найти среднее арифметическое значения в файле

Задание:Дано файл в котором записаны значения элементов массива ... типа float
в следующем формате:
сначала в файле записано общее количество элементов в массиве
а дальше непосредственно сами значения массива типа float
записать в другой файл среднее арифметическое положительных чисел
(подходящих)
Вопос: Мне сумму и среднее искать уже в в 1 или в 2 (смотреть код) случаях?
Код:
void Ex()
{
    FILE* fileInput = fopen("D:\\file.txt", "r");
    float number;
    if (fileInput == nullptr)
        return;
    int* array = (int*)malloc((fscanf(fileInput, "%f", &number) * sizeof(int)));
    int index = 0;
    fseek(fileInput, 0, SEEK_SET);
    while (true)
    {
        if (fscanf(fileInput, "%d", &number) == EOF)
            break;
        else
        {
            if (number >= 0)
            {
                array[index] = number; //1
                ++index;
            }
        }
    }
    fclose(fileInput);
   
FILE* fileInput = fopen("D:\\My Family\\file.txt", "r");
    if (fileInput == nullptr)
        return;
    int count = 0;
    while (true)
    {
        int number;
        if (fscanf(fileInput, "%d", &number) == EOF)
            break;
        else
        {
            if (number >= 0)
                ++count;
        }
    }
    fclose(fileInput);
    FILE* fileOutput = fopen("D:\\My Family\\file1.txt", "w");
    if (fileOutput == nullptr)
        return;
    for (index = 0; index < count; ++index)
    {
        char str[10];
        sprintf(str, "%d ", array[index]);
        fputs(str, fileOutput);
    }
    fclose(fileOutput);
}
    FILE* fileOutput = fopen("D:\\file1.txt", "w");
    if (fileOutput == nullptr)
        return;
    for (index = 0; index < (fscanf(fileInput, "%f", &number)); ++index)
    {
        char str[10];
        sprintf(str, "%d ", array[index]); //2
        fputs(str, fileOutput);
    }
    fclose(fileOutput);
}
int main()
{
    Ex();
    return 0;
}
vova_makr вне форума Ответить с цитированием
Старый 06.10.2015, 11:40   #2
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

а зачем тебе массив?
считай кол-во элементов в N
введи сумму Sum = 0
в точке 1 убери массив и напиши Sum += number;
в файл 2 запиши Sum / N

кстати, кол-во же целое, поэтому не %f, a %d
--------
пардон, N нужно в точке 1 инкрементировать, а в начале оно 0

Последний раз редактировалось GreenWizard; 06.10.2015 в 11:42.
GreenWizard вне форума Ответить с цитированием
Старый 06.10.2015, 11:42   #3
vova_makr
Пользователь
 
Регистрация: 25.09.2015
Сообщений: 42
По умолчанию

Переделал:
Код:
void Ex()
{
	FILE* fileInput = fopen("D:\\file.txt", "r");
	float number;
	if (fileInput == nullptr)
		return;
	int* array = (int*)malloc((fscanf(fileInput, "%d", &number) * sizeof(int)));
	int index = 0;
	fseek(fileInput, 0, SEEK_SET);
	while (true)
	{
		if (fscanf(fileInput, "%d", &number) == EOF)
			break;
		else
		{
			if (number >= 0)
			{
				array[index] = number;
				++index;
			}
		}
	}
	fclose(fileInput);
	
	fileInput = fopen("D:\\file.txt", "r");
	if (fileInput == nullptr)
		return;

	int count = 0;
	while (true)
	{
		int number;
		if (fscanf(fileInput, "%d", &number) == EOF)
			break;
		else
		{
			if (number >= 0)
				++count;
		}
	}
	fclose(fileInput);

	FILE* fileOutput = fopen("D:\\file1.txt", "w");
	if (fileOutput == nullptr)
		return;
	int sum = 0;
	for (index = 0; index < count; ++index)
	{
		char str[10];
		sum = sum + array[index];
		int average = sum / count;
		sprintf(str, "%d ", average);
		fputs(str, fileOutput);
	}
	fclose(fileOutput);
}
int main()
{
	Ex();
	return 0;
}
vova_makr вне форума Ответить с цитированием
Старый 06.10.2015, 11:43   #4
vova_makr
Пользователь
 
Регистрация: 25.09.2015
Сообщений: 42
По умолчанию

Цитата:
Сообщение от GreenWizard Посмотреть сообщение
а зачем тебе массив?
считай кол-во элементов в N
введи сумму Sum = 0
в точке 1 убери массив и напиши Sum += number;
в файл 2 запиши Sum / N

кстати, кол-во же целое, поэтому не %f, a %d
--------
пардон, N нужно в точке 1 инкрементировать, а в начале оно 0
в задании ж написано что в масиве, поэтому и масив пишу
vova_makr вне форума Ответить с цитированием
Старый 06.10.2015, 11:48   #5
vova_makr
Пользователь
 
Регистрация: 25.09.2015
Сообщений: 42
По умолчанию

Цитата:
Сообщение от GreenWizard Посмотреть сообщение
а зачем тебе массив?
считай кол-во элементов в N
введи сумму Sum = 0
в точке 1 убери массив и напиши Sum += number;
в файл 2 запиши Sum / N

кстати, кол-во же целое, поэтому не %f, a %d
--------
пардон, N нужно в точке 1 инкрементировать, а в начале оно 0
Переделал как Вы сказали но где то ошибка есть (((
Код:
void Ex()
{
	FILE* fileInput = fopen("D:\\My Family\\file5.txt", "r");
	float number;
	if (fileInput == nullptr)
		return;
	int* array = (int*)malloc((fscanf(fileInput, "%d", &number) * sizeof(int)));
	int index = 0;
	fseek(fileInput, 0, SEEK_SET);
	while (true)
	{
		if (fscanf(fileInput, "%d", &number) == EOF)
			break;
		else
		{
			int sum = 0;
			if (number >= 0)
			{
				array[index] = number;
				sum = sum + array[index];
				++index;
			}
		}
	}
	fclose(fileInput);
	
	fileInput = fopen("D:\\My Family\\file5.txt", "r");
	if (fileInput == nullptr)
		return;

	int count = 0;
	while (true)
	{
		int number;
		if (fscanf(fileInput, "%d", &number) == EOF)
			break;
		else
		{
			if (number >= 0)
				++count;
		}
	}
	fclose(fileInput);

	FILE* fileOutput = fopen("D:\\My Family\\file6.txt", "w");
	if (fileOutput == nullptr)
		return;
	int sum = 0;
	for (index = 0; index < count; ++index)
	{
		char str[10];
		int average = sum / count;
		sprintf(str, "%d ", average);
		fputs(str, fileOutput);
	}
	fclose(fileOutput);
}
int main()
{
	Ex();
	return 0;
}
vova_makr вне форума Ответить с цитированием
Старый 06.10.2015, 11:54   #6
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Код:
    FILE* fileInput = fopen("D:\\file.txt", "r");
    if (fileInput == nullptr)        return;
	
    float number, sum = 0;
    int count = 0, total, current = 0;
    fscanf(fileInput, "%d", &total);
    fseek(fileInput, 0, SEEK_SET);
    while ((fscanf(fileInput, "%f", &number) != EOF) && (current < total)){ // чтение + проверка
        current++;
        if (number >= 0){
            sum += number;
            ++count;
        }
    }
    fclose(fileInput);
    sum = (count > 0) ? (sum / count) : 0; // среднее арифм. с проверкой на деление на 0
как-то так проверка нужна т. к. файл может быть хоть на 4Гб, а в начале может стоять "2" и нужно будет всего 2 эл. считать

Последний раз редактировалось GreenWizard; 06.10.2015 в 11:56.
GreenWizard вне форума Ответить с цитированием
Старый 06.10.2015, 12:08   #7
vova_makr
Пользователь
 
Регистрация: 25.09.2015
Сообщений: 42
По умолчанию

Цитата:
Сообщение от GreenWizard Посмотреть сообщение
Код:
    FILE* fileInput = 
    sum = (count > 0) ? (sum / count) : 0; // среднее арифм. с проверкой на деление на 0
как-то так проверка нужна т. к. файл может быть хоть на 4Гб, а в начале может стоять "2" и нужно будет всего 2 эл. считать
А как мне тогда записать в другой файл ср. ариф.? С Этими провекрами. А как переисать это через if а то я плохо знаю Тернарний умовний оператор

Последний раз редактировалось vova_makr; 06.10.2015 в 12:12.
vova_makr вне форума Ответить с цитированием
Старый 06.10.2015, 12:18   #8
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Цитата:
Сообщение от vova_makr Посмотреть сообщение
А как мне тогда записать в другой файл ср. ариф.? С Этими провекрами. А как переисать это через if а то я плохо знаю Тернарний умовний оператор
не понимаешь? - учи!
как записать? - ну хз-хз, если ты во всю используешь файла, но не можешь записать одну крохотную переменную в файл, то медицина тут бессильна.
-----------------------
Код:
    FILE* fileOutput = fopen("D:\\file2.txt", "w");
    if (fileOutput == nullptr) return;
    fprintf(fileOutput, "%f", sum);
    fclose(fileOutput);
вот что тут такого сложного?

Последний раз редактировалось GreenWizard; 06.10.2015 в 12:22.
GreenWizard вне форума Ответить с цитированием
Старый 06.10.2015, 12:22   #9
vova_makr
Пользователь
 
Регистрация: 25.09.2015
Сообщений: 42
По умолчанию

Цитата:
Сообщение от GreenWizard Посмотреть сообщение
не понимаешь? - учи!
как записать? - ну хз-хз, если ты во всю используешь файла, но не можешь записать одну крохотную переменную в файл, то медицина тут бессильна.
стоп стоп. Я знаю как записать переменую!! Я написал что вы используете Тернарний умовний оператор и я не вижу смысла проверять на деления на 0. И причем тут медецина???
vova_makr вне форума Ответить с цитированием
Старый 06.10.2015, 12:27   #10
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Цитата:
Сообщение от vova_makr Посмотреть сообщение
стоп стоп. Я знаю как записать переменую!! Я написал что вы используете Тернарний умовний оператор и я не вижу смысла проверять на деления на 0. И причем тут медецина???
файл содержит - -4, -5, -6...... сколько положительных чисел? - 0! 0/0 = ошибка

Код:
if(count > 0) sum /= count;
GreenWizard вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввести файл . Найти среднее арифметическое среди значений элементов файла, принадлежащих интервалу [-5; 5]. Если среднее положител kostyan199731 Паскаль, Turbo Pascal, PascalABC.NET 0 18.03.2015 21:53
Найти среднее арифметическое С++ Otar4ik Помощь студентам 2 27.04.2014 15:04
Найти среднее арифметическое их квадратов и среднее арифметическое их модулей. (Турбо паскаль) erte Помощь студентам 1 30.10.2012 13:08
Найти среднее арифметическое An90 Помощь студентам 4 16.10.2012 10:33
С++ Найти среднее арифметическое положительных и среднее арифметическое отрицательных чисел, минимальное по модулю число. Юрик 530 Помощь студентам 4 03.12.2011 16:26