Форум программистов, компьютерный форум CyberForum.ru

Последовательная арифметика в файлах - C++

Восстановить пароль Регистрация
 
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
28.05.2010, 21:09     Последовательная арифметика в файлах #1
Помогите пожалуйста ещё с одной задачкой на файлы:

Дан файл вещественных чисел. Заменить в файле каждый элемент, кроме начального и конечного, на его среднее арифметическое с предыдущим и последующим элементом.

Как создать файл, перенести начальный и конечный элемент я приблизительно знаю, а как быть со средним арифметическим я не знаю. Пожалуйста, помогите записать этот кусочек.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2010, 21:09     Последовательная арифметика в файлах
Посмотрите здесь:

Арифметика в C C++
Арифметика C++
C++ Арифметика.
Последовательная запись массива в .gz архив C++
C++ последовательная обработка символов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
28.05.2010, 21:19     Последовательная арифметика в файлах #2
Ограничения к длине дробной части есть?
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
28.05.2010, 21:26  [ТС]     Последовательная арифметика в файлах #3
в условии не указано... Пусть будет просто float.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
28.05.2010, 21:32     Последовательная арифметика в файлах #4
Хотя в принципе без разницы. Можно опять же открыть файл на чтение, считать числа в массив, закрыть файл, открыть снова на запись с перезаписью ("w"), а потом выполнить подобное
C
1
2
3
4
5
6
7
for (i = 0; i < size; i++)
{
   if (i == 0 || i == size -1)
      fprintf(file, "%f ", num[i]);
   else
      fprintf(file, "%f ", (num[i-1]*num[i]*num[i+1])/3.0);
}
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
29.05.2010, 10:46  [ТС]     Последовательная арифметика в файлах #5
Завтра попробую, может что-то и выйдет.

Добавлено через 1 час 22 минуты
Вот, пытался слепить на сонную голову, чуть чуть переделал кусок будды, и ваш добавил. В общем хотел, чтобы была запись 1го и последнего элемента (делаю скан файла и вношу), а потом делаю вашу сортировку. На вид грязно и совсем некрасиво, к тому же не работает, но, пожалуйста, помогите исправить, ведь это уже прогресс и лучше, чем ничего.
C
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
#include <stdio.h>
#include <stdlib.h>
 
 
int main(int argc, char* argv[])
{
   int size = 0, buf, i;
   int *num, numbers[2], pos;
   char *file_name = "test.txt";
   FILE *file;
 
   if ((file = fopen(file_name, "r+")) == NULL )
   {
      perror("fopen");
      exit(EXIT_FAILURE);
   }
 
 
   while (fscanf(file, "%i", &buf) != EOF)
      size++;
   fseek(file, 0, SEEK_SET);
   clearerr(file);
   if (size == 0)
   {
      printf("File %s is empty\n", file_name);
      exit(EXIT_SUCCESS);
   }
 
   num = (int*)calloc(size, sizeof(int));
 
   i = 0;
   while (fscanf(file, "%i", &num[i]) != EOF)
      i++;
   fseek(file, 0, SEEK_SET);
   clearerr(file);
 
     if ( fscanf(file, "%d %d", numbers) != 2 ){
                perror("fscanf");
                if ( fclose(file) )
                        perror("fclose");
                exit(1);
        }
        fprintf("%d ", *numbers);
        pos = 0;
        while ( fscanf(file, "%d", &numbers[pos]) == 1 )
                pos ^= 1;
        if ( ferror(file) ){
                fprintf(stderr, "Can't read from file!\n");
                if ( fclose(file) )
                        perror("fclose");
                exit(1);
        }
        fclose(file);
       
        pos ^= 1;
        fprintf("%d\n", numbers[pos]);
 
        for (i = 0; i < size; i++)
{
   if (i == 0 || i == size -1)
      fprintf(file, "%f ", num[i]);
   else
      fprintf(file, "%f ", (num[i-1]*num[i]*num[i+1])/3.0);
}
}
Буду очень признателен за исправленный, желательно этот вариант, чтобы я разобрался где у меня ошибки...
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
29.05.2010, 11:06     Последовательная арифметика в файлах #6
1) Раз файл вещественных чисел, то *num должен иметь тип float или double.
2) Входные и выходные числа могут различаться по количеству символов, если входные данные получатся больше по объему - ничего страшного, в противном случае в файле останется хвост со старым содержимым. Поэтому после чтения файла, нужно его закрыть, и открыть по новой с режимом "w", который затрет сарое содержимое файла.
3) Что ты хотел сделать 37-56 строками?
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
29.05.2010, 11:24  [ТС]     Последовательная арифметика в файлах #7
3) Я хотел внести в файл первый и последний элемент. А как можно сделать проще это?

Начало я так понял надо исправить на :

C
1
2
3
4
5
6
7
8
9
10
if ( ( file = fopen(file_name, "r") ) == NULL )
   {
      perror("fopen file");
      exit(EXIT_FAILURE);
   }
   if ( ( file = fopen(file_name, "w") ) == NULL )
   {
      perror("fopen file_name");
      exit(EXIT_FAILURE);
   }
Или перед закрытием и открытием для записи его сначала нужно просканировать?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
29.05.2010, 11:27     Последовательная арифметика в файлах #8
А зачем? Условие задания этого не требует.
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
29.05.2010, 11:29  [ТС]     Последовательная арифметика в файлах #9
А ваш цикл пропускает первый и последний элемент???
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
29.05.2010, 11:31     Последовательная арифметика в файлах #10
Нет, не пропускает, он записывает первый и последний элемент без изменений.

Добавлено через 53 секунды
Цитата Сообщение от Bloodykeeper Посмотреть сообщение
Или перед закрытием и открытием для записи его сначала нужно просканировать?
Именно.
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
29.05.2010, 11:49  [ТС]     Последовательная арифметика в файлах #11
Переделал вот так, но где-то что-то лишнее или не правильное, так как результат выдаёт не тот.

C
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
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char* argv[])
{
   int size = 0, buf, i;
   int *num;
   char *file_name = "test.txt";
   FILE *file;
 
   if ((file = fopen(file_name, "r")) == NULL )
   {
      perror("fopen");
      exit(EXIT_FAILURE);
   }
 
   while (fscanf(file, "%i", &buf) != EOF)
      size++;
   fseek(file, 0, SEEK_SET);
   clearerr(file);
   if (size == 0)
   {
      printf("File %s is empty\n", file_name);
      exit(EXIT_SUCCESS);
   }
 
   num = (int*)calloc(size, sizeof(int));
 
   i = 0;
   while (fscanf(file, "%i", &num[i]) != EOF)
      i++;
   fseek(file, 0, SEEK_SET);
 
   fclose(file);
 
   if ((file = fopen(file_name, "w")) == NULL )
   {
      perror("fopen");
      exit(EXIT_FAILURE);
   }
 
   for (i = 0; i < size; i++)
{
   if (i == 0 || i == size -1)
      fprintf(file, "%f ", num[i]);
   else
      fprintf(file, "%f ", (num[i-1]*num[i]*num[i+1])/3.0);
}
    fclose(file);
}

kazak, помогите найти и исправить ошибку.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2010, 11:52     Последовательная арифметика в файлах
Еще ссылки по теме:

Разработать программу «переворота» строки. Способ: последовательная перестановка элементов - первый с последним, второй с предпоследним и т.д. C++
Последовательная обработка символов C++
C++ Системное программирование. Последовательная обработка файлов с использованием отображения в память

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
29.05.2010, 11:52     Последовательная арифметика в файлах #12
Цитата Сообщение от kazak Посмотреть сообщение
1) Раз файл вещественных чисел, то *num должен иметь тип float или double.
И buf тоже, и считывать файл надо со спецификатором %f.
Yandex
Объявления
29.05.2010, 11:52     Последовательная арифметика в файлах
Ответ Создать тему
Опции темы

Текущее время: 21:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru