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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2010, 18:25   #1
Tresk
 
Регистрация: 09.03.2009
Сообщений: 6
По умолчанию Считывание из файла чисел, сортировка массива с++

Помогите найти ошибку. В идеале программа должна сначала считывать числа из текстового файла, затем занести их в массив. Далее рассортировать их следующи образом: в один массив числа больше нуля, во второй - числа равные нулю, в третий - числа меньше нуля. И результат должен быть сохранен в тот же тектовый файл. Среда - Visual Studio 2008


Код:

#include <stdafx.h>
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <iomanip>
#include <conio.h>
using namespace std;
int main()
{
//Поток для чтения.
ifstream f;
//Поток для записи.
ofstream g;
float a[100];
float bolshe[100],menshe[100],ravno[100];
//a=new float[100];
int i,j=0,n=0;
//Открываем файл в режиме чтения.
f.open("result.txt",ios::in);
//Если открытие файла прошло корректно, то
if (f)
{
//цикл для чтения значений из файла, выполнение цикла
// прервется, когда достигнем конца файла, в этом
// случае f.eof() вернет истину.
while (!f.eof())
{
//Чтение очередного значения из потока f в очередной
// элемент массива a.
f>>a[n];
//Вывод элемента массива a на экран.
cout<<a[n]<<"\t";
//Увеличение количества считанных чисел.
n++;
}
//Вывод на экран количества считанных чисел.
cout<<"n="<<n<<endl;
//Упорядочение массива
for (i=0;i>n;i++){
	if (a[i]>0){
		bolshe[j]=a[i];
	}
	j++;
}
i=0; j=0;
for (i=0;i>n;i++){
	if (a[i]==0){
		ravno[j]=a[i];
	}
	j++;
}
i=0; j=0;
for (i=0;i>n;i++){
	if (a[i]<0){
		menshe[j]=a[i];
	}
	j++;
}
i=0; j=0;

//Закрываем поток для чтения.
f.close();
//Открываем поток в режиме дозаписи.
g.open("result.txt",ios::app);
//Запись в файл символа табуляции для разделения
//последнего символа исходного файла и
// первого элемента дозаписываемого в массив.
g<<"\t";
// Запись в файл элемента массива и символа табуляции.
for(i=0;i<n;i++){g<<bolshe[i]<< "\t";}
for(i=0;i<n;i++){g<<ravno[i]<< "\t";}
for(i=0;i<n;i++){g<<menshe[i]<< "\t";}
//Закрытие файла
g.close();
}
//Если открытие файла прошло некорректно, то вывод
// сообщения об отсутствии такого файла.
else cout<<"File not found"<<endl;
delete [] a;
cout << "Нажмите любую клавишу для выхода ...";
getch();
}
Tresk вне форума Ответить с цитированием
Старый 07.11.2010, 18:40   #2
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

а в чем ошибка у вас получается, конкретно напишите
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 07.11.2010, 18:44   #3
Tresk
 
Регистрация: 09.03.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от RUSt88 Посмотреть сообщение
а в чем ошибка у вас получается, конкретно напишите
ну программа компилируется, но работает некорректно. После обработки файла в него сохраняется всякая чушь. Вот содержимое файла result.txt после обработки

2.5 4.1 1.4 5.23 8 3 0 0 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008 -1.07374e+008

Первые 8 чисел - исходные данные
Tresk вне форума Ответить с цитированием
Старый 07.11.2010, 19:07   #4
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Цитата:
for (i=0;i>n;i++){
if (a[i]>0){
bolshe[j]=a[i];
}
j++;
}
поставьте j++ в условие, то бишь
Код:
j = 0;
for (i=0;i>n;i++){
    if (a[i]>0){
        bolshe[j++]=a[i];
    }
}
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 07.11.2010, 19:19   #5
Tresk
 
Регистрация: 09.03.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от RUSt88 Посмотреть сообщение
поставьте j++ в условие, то бишь
Код:
j = 0;
for (i=0;i>n;i++){
    if (a[i]>0){
        bolshe[j++]=a[i];
    }
}

бестолку, то же самое. Если это поможет, то вот лог

1>------ Построение начато: проект: 1, Конфигурация: Debug Win32 ------
1>Компиляция...
1>1.cpp
1>c:\users\datacenter\desktop\files _read_double_in_file.jpg\1\1.cpp(82 ) : warning C4996: 'getch': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch. See online help for details.
1> c:\program files\microsoft visual studio 9.0\vc\include\conio.h(145): см. объявление 'getch'
1>c:\users\datacenter\desktop\files _read_double_in_file.jpg\1\1.cpp(15 ) : warning C4101: b: неиспользованная локальная переменная
1>Компоновка...
1>LINK : не найден или не выполнена сборка ..\Debug\1.exe при последней инкрементной компоновке; выполняется полная компоновка
1>Внедрение манифеста...
1>Журнал построения был сохранен в "file://c:\Users\DataCenter\Desktop\files_r ead_double_in_file.jpg\1\Debug\Buil dLog.htm"
1>1 - ошибок 0, предупреждений 2
========== Построение: успешно: 1, с ошибками: 0, без изменений: 0, пропущено: 0 ==========
Tresk вне форума Ответить с цитированием
Старый 07.11.2010, 19:19   #6
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Цитата:
for(i=0;i<n;i++){g<<bolshe[i]<< "\t";}
и вот здесь у вас ошибка, нужно запоминать сколько внесено чисел в каждый массив и циклом идти до этого запомненного числа, а не до n
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 07.11.2010, 19:21   #7
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Код:
j = 0;
for (i=0;i>n;i++){
    if (a[i]>0){
        bolshe[j++]=a[i];
    }
}
razmerBolshe = j;

---------------
for (i=0; i < razmerBolshe; i++) {
   g<<bolshe[i]<< "\t";
}
и все массивы соответственно также переделать
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 07.11.2010, 19:24   #8
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Цитата:
#include <stdafx.h>
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <iomanip>
#include <conio.h>
и здесь у вас смесь сишных заголовочных файлов с с++шными, как-то не очень правильно так
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 07.11.2010, 19:25   #9
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Цитата:
for (i=0;i>n;i++){
if (a[i]>0){
bolshe[j]=a[i];
}
j++;
}
i=0; j=0;
for (i=0;i>n;i++){
if (a[i]==0){
ravno[j]=a[i];
}
j++;
}
i=0; j=0;
for (i=0;i>n;i++){
if (a[i]<0){
menshe[j]=a[i];
}
j++;
}
вот это лучше заменить одним циклом, вы же ведь по одному массиву проходитесь
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 07.11.2010, 19:39   #10
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

Код:
int razmerB, razmerR, razmerM;
razmerB = razmerR = razmerM = 0;
-------------
for (i= 0; i > n; i++) {
  if (a[i]>0){
    bolshe[razmerB++] = a[i];
  }
  else if (a[i] == 0){
    ravno[razmerR++] = a[i];
  }
  else{
      menshe[razmerM++]=a[i];
  }
}
-------
for (i = 0; i < razmerB; i++) {
  g << bolshe[i] << "\t";
}
for (i = 0; i < razmerR; i++) {
  g << ravno[i] << "\t";
}
for (i = 0; i < razmerM; i++) {
  g << menshe[i] << "\t";
}
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Считывание с файла отрицательных чисел trinki Общие вопросы C/C++ 2 01.10.2010 01:39
Считывание массива из файла slKAHN Общие вопросы C/C++ 1 15.11.2009 15:01
Считывание массива из файла slKAHN Общие вопросы C/C++ 2 15.11.2009 14:01
Сортировка массива чисел Roberto Помощь студентам 1 02.04.2008 23:19