Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Natalia_R
0 / 0 / 0
Регистрация: 29.10.2014
Сообщений: 33
1

Выводит неверное значение элемента массива типа double

11.11.2014, 09:33. Просмотров 450. Ответов 2
Метки нет (Все метки)

Есть текстовый файл типа:
INLINE : 233 XLINE : 202 668417,50000 565878,00000 995,87421
Нужно отсортировать его по значению XLINE и результат сортировки сохранить в новом файле.
В исходном точки на запятые поменяла.
Но в результате все равно выдает:
INLINE : 233 0 : 202 668418 565878 995.874
(почемy то округляет 668417,5 до 668418??? Да и последнее значение .... Смотрю значение массива massiv_str[i] - они верные). Поставила вывод в консоль - тут вообще беда:
565878
1001.62

362
0
202
671643
565878
1002.32


Текст программы:
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
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstddef>
#include<locale.h> 
#include <windows.h>
#include <string>
#include <cstring>
 
 
using namespace std;
void main()
{
   
    setlocale(LC_ALL,"Russian");//Русификация
//Объявляем переменные   
double xline,interval;//Объявляем переменные для определния первоначального значения XLINE и интервала отбора
ifstream f;//Объявляем поток чтения из файла
ofstream f1;//Объявляем поток записи в файл
char str[100];//Строковая переменная (для пути к исходному файлу)
char str1[100];//Строковая переменная (для пути к готовому файлу)
double massiv_str[9]; // Массив, содержащий код и значения очередной строки в сортируемом файле  
string s;// слово в строке сортируемого файла
 
 
 
 
cout<<"\n Введите путь и имя файла для сортировки в виде D:\\имя папки\\имя файла.txt: \n";
SetConsoleCP(1251);
cin>>str;
SetConsoleCP(866);
cout<<"\n Введите начальное значение XLINE:";
cin>>xline;
cout<<"\n Введите интервал для отбора:";
cin>>interval;
cout<<endl;
 
 
//опреляем имя и путь к готовому файлу, он будет лежать там же где исходник, но с именем...SORT.txt
int j=0;
 
while (str[j]!='.') 
{
    str1[j]=str[j];
    j++;
}
str1[j]='S';
j++;
str1[j]='O';
j++;
str1[j]='R';
j++;
str1[j]='T';
j++;
str1[j]='.';
j++;
str1[j]='t';
j++;
str1[j]='x';
j++;
str1[j]='t';
j++;
str1[j]=0; // ставим чтобы не писалось в массив лишнее
 
 
    f.open (str);//Открываем файл
    //Проверка успешности открытия файла:
  if (f.fail()) {cout<<"\n Ошибка открытия файла";
                 exit(1);
                }
 while (!f.eof())//пока не достигнут конец файла
{
 
    for (int i = 0; i < 9; i++) // читаем строку из файла и записываем ее код и значения в массив massiv_str
    {
        f>>s; 
        if (s.empty()) break;
        else {
              if (s == "INLINE")  massiv_str[i] = 1;  
              else {if(s == "XNLINE") massiv_str[i]=2; 
              else {if(s == ":") massiv_str[i] = 3;
                          else massiv_str[i] = std::strtod( s.c_str(), NULL ); //Функция strtod преобразовывает строку string в double. 
                         }
                    } 
              } // заполняли массив massiv_str[i]
        }//for
       
     
if (massiv_str[5] == xline) //если значение в 6-ом столбце равно xline, заданой пользователем надо записать эту строку в новый файл, лежащий там же, но в имени добавлено...sort
{
    f1.open (str1,ios::app);//Открываем файл в режиме записи в конец файла
    //Проверка успешности открытия файла:
  if (f1.fail()) {cout<<"\n Ошибка открытия файла";
                 exit(1);
                }
 
  const int SIZE = 256;
  char s_out[SIZE];
      for (int i = 0; i < 9; i++) // пишем строку в файл, беря данные из массива massiv_str
    {
        if (massiv_str[i] == 1)  {strcpy(s_out,"INLINE"); 
                                  f1<<s_out; strcpy(s_out," "); 
                                  f1<<s_out; 
                                  } 
        else {if(massiv_str[i] == 2) {strcpy(s_out,"XNLINE"); 
                                     f1<<s_out; 
                                     strcpy(s_out," "); f1<<s_out;
                                      }  
              else {if(massiv_str[i] == 3) {strcpy(s_out,":"); 
                                            f1<<s_out; 
                                            strcpy(s_out," "); f1<<s_out; } 
              else { f1<<massiv_str[i];
                     cout<<massiv_str[i]<<endl; 
                     strcpy(s_out,"   ");
                     f1<<s_out;
                     }
                   }
             }//else
            if (i==8) cout <<endl;
          } //for
    f1<<"\n";   
        } //if (massiv_str[6] == xline)
    
f1.close();//Закрываем файл
}//while 
f.close();//Закрываем файл
cout<<"\n Файл отсортирован и создан новый файл в  "<<str1<<endl;
system ("pause"); 
 //return 0;
 }//main
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2014, 09:33
Ответы с готовыми решениями:

Выводит неверное значение переменной sum
выводит неверное значение sum, что не так? ...

функция принимает два параметра типа double и возвращает значение типа double
Напишите функцию, которая принимает два параметра типа double и возвращает значе...

Написать программу, которая выводит на экран значение минимального элемента массива из 100 элементов. Вывести минимальный элемент
Написать программу, которая выводит на экран значение минимального элемента...

Напишите программу, которая получает число типа long double и выводит его целую и дробную части
мое решение #include&lt;stdio.h&gt; #include&lt;math.h&gt; int main() { long...

Функция, выполняющая поиск заданного элемента в одномерном массиве типа double
Написать функцию, выполняющую поиск заданного элемента в одномерном массиве...

2
Extrim88
50 / 50 / 21
Регистрация: 08.02.2013
Сообщений: 189
11.11.2014, 10:11 2
Цитата Сообщение от Natalia_R Посмотреть сообщение
(почемy то округляет 668417,5 до 668418??? Да и последнее значение .... Смотрю значение массива massiv_str[i] - они верные). Поставила вывод в консоль - тут вообще беда:
По-умолчанию, потому что точность вывода чисел с плавающей точкой - 6 цифр. Устанавливайте больше, например, так:
C++
1
cout.precision(10);
И еще у вас завершающие нули не отображаются, можно установить флаг вывода завершающих нулей:
C++
1
cout.setf(ios_base::showpoint);
0
Natalia_R
0 / 0 / 0
Регистрация: 29.10.2014
Сообщений: 33
11.11.2014, 10:24  [ТС] 3
f1.precision(10); Все получилось! С cout.setf(ios_base::showpoint); нулей уж слишком много!
Спасибо!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2014, 10:24

Непонятно выводится значение числа типа double
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main() {...

Как записать значение типа double в char?
Есть массив double massiv_str; Проверяем его и если 1,2 или 3 присваиваем...

Минимальное значение типа double перед нулем
Нужно найти значение типа double, самое маленькое, перед нулем. Но не...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru