Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[C/C++] Чтение чисел из файла, создание массива заполненного этими числами.

26K
04 июня 2007 года
Enotus
13 / / 04.06.2007
Задача такая :

Цитата:
В файле находятся вещественные числа. Определить количество элементов файла, величина которых меньше среднего арифметического всех элементов данного файла.



Я прикинул предварительный план решения и составил 3 пункта:

1) (То, что я незнаю как реализовать.): Читаем *.txt файл chisla и выделяем из этого файла все вещественные числа стоящие
через пробел (пример файла : "234432.324422 565463.4353 2425654.478".. и т.д.) Записываем по порядку каждое число в новый
динамический массив chisla, размер массива = числу чисел из файла.
2) Находим среднее значение всех чисел используя массив, это я могу сделать.
3) Выводим на экран все элементы массива, меньшие чем их среднее значение. Это я тоже могу реализовать.

Заранее спасибо за любую помощь.

245
05 июня 2007 года
~ArchimeD~
1.4K / / 24.07.2006
Цитата: Enotus

1) (То, что я незнаю как реализовать.): Читаем *.txt файл chisla и выделяем из этого файла все вещественные числа стоящие
через пробел (пример файла : "234432.324422 565463.4353 2425654.478".. и т.д.) Записываем по порядку каждое число в новый
динамический массив chisla, размер массива = числу чисел из файла.
.



Это ты с числами решил общаться как со строками? Почему не с бинарным файлом, а именно с текстровым?

26K
05 июня 2007 года
Enotus
13 / / 04.06.2007
Ммм... если я что-то говорю не так, то прошу прощения.
Опыта работы с файлами в си ранее не имел.
245
05 июня 2007 года
~ArchimeD~
1.4K / / 24.07.2006
да не, все так, это твоя мысля и твое право работать с числами и файлами так, как захочется. Просто удобнее было бы на мой взгляд забить в бинарный файл числа типа long long, чтобы на все хватило, и затем читать их. Иначе тебе придется парсить строку, выковыривая числа, и затем юзать нечто вроде strtoint. На мой взгляд, если задача не критична, лучше юзать блочные чтение/запись бинарного файла. Вот небольшой примерчик
Код:
#include <stdlib.h>
#include <stdio.h>

#define SIZE 20 //это кол-во элементов

int main( void )
{
   int count
   long long array1[SIZE], array2[SIZE];
   FILE *fp;

   // забиваем массив 1 числами 0,1,2,4,...,38
   for (count = 0; count < SIZE; count++)
       array1[count] = (long long) (2 * count);

   // открываем бинарный файл
   if ( (fp = fopen("file.bin", "wb")) == NULL)
   {
       fprintf(stderr, "Error opening file.");
       exit(1);
   }

   // сохраняем в файл первый массив
   // fwrite (void *buff, int size, int count, FILE *fp)
   // buff - указатель на память, которую пишем
   // size - размер отдельных элементов
   // count - число элементов
   if (fwrite(array1, sizeof(long long), SIZE, fp) != SIZE)
   {
       fprintf(stderr, "Error writing to file.");
       exit(1);
   }

   fclose(fp);

   // Открываем файл на чтение
   if ( (fp = fopen("file.bin", "rb")) == NULL)
   {
       fprintf(stderr, "Error opening file.");
       exit(1);
   }

   // Читаем файл в массив 2
   if (fread(array2, sizeof(long long), SIZE, fp) != SIZE)
   {
       fprintf(stderr, "Error reading file.");
       exit(1);
   }

   fclose(fp);

   // Во втором массиве должны быть полученные данные, выводи их, сверяй и т.д.

   return 0;
}
320
05 июня 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: ~ArchimeD~
...Просто удобнее было бы на мой взгляд забить в бинарный файл числа типа long long, чтобы на все хватило, и затем читать их. Иначе тебе придется парсить строку, выковыривая числа, и затем юзать нечто вроде strtoint. На мой взгляд, если задача не критична, лучше юзать блочные чтение/запись бинарного файла...


Зачем создавать бинарный файл,когда по условию файл дан ? В нем находятся какие то числа.Массив стоит сделать 2-мерный(или числа в файле идут в одну строку ? Вряд ли).Ничего не надо выковыривать,никакого stroint( ? ).Все проще.Я делаю единственное допущение,что в первой строке файла записан размер массива и мы его считываем(облом считать:) ).Далее читаем весь массив.

Код:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int row,col;
    ifstream inF("1.txt");
        if (!inF)
        {
            cout << endl << "Error !";
        }
        inF >> row;// считываем размер массива
        inF >> col;
        int **num = new int*[row];
        for (int i = 0; i < row; ++i)
        {
            num = new int[col];
            for (int j = 0; j < col; ++j)
            {
                inF >> num[j];
            }
        }
        inF.close();
        for (int i = 0; i < row; ++i)
        {
            for (int j = 0; j < col; ++j)
            {
                cout <<setw(6)<< num[j];
            }
            cout << "\n\n";
        }
        int sum = 0;
                          for (int i = 0; i < row; ++i)
        {
            for (int j = 0; j < col; ++j)
            {
                sum += num[j];
            }
        }
                  int count = 0;
         for (int i = 0; i < row; ++i)
        {
            for (int j = 0; j < col; ++j)
            {
                if(num[j] < sum/(row*col))
                    ++count;
            }
        }
                cout<<count<<endl;
        for(int i = 0;i < row;++i)
            delete[] num;
        delete[] num;
    return 0;
}
245
05 июня 2007 года
~ArchimeD~
1.4K / / 24.07.2006
Меня терзают смутные сомнения, что на С это не прокатит, и не везде на С++ тоже. Просто хранить числа в текстовом файле как-то для меня странно.
320
05 июня 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: ~ArchimeD~
Меня терзают смутные сомнения, что на С это не прокатит, и не везде на С++ тоже. Просто хранить числа в текстовом файле как-то для меня странно.


На С++ - это катит 100%.Потому,что это и есть С++,только вместо дин.массива лучше использовать вектор 2-мерный.Автор в названии пишет С/С++.Он похоже их не разделяет,как и многие другие студенты:(
Потом,что ты имеешь в виду под словом не везде ?

245
05 июня 2007 года
~ArchimeD~
1.4K / / 24.07.2006
Цитата: m_Valery
На С++ - это катит 100%.Потому,что это и есть С++,только вместо дин.массива лучше использовать вектор 2-мерный.Автор в названии пишет С/С++.Он похоже их не разделяет,как и многие другие студенты:(
Потом,что ты имеешь в виду под словом не везде ?



Вот я дал свой вариант на С, ты на С++;) все довольны - разделяй и властвуй.
Не везде - мне кажется, что не все компиляторы безболезненно проглотят, хотя очень велика вероятность, что ошибаюсс.
Хотя, да, я дурак - все ок.

26K
05 июня 2007 года
Enotus
13 / / 04.06.2007
а можно это просто с void main() без параметров.
Так же на "stdafx.h" мой MVS 6 орёт : "Cannot open include file: 'stdafx.h': No such file or directory"...
Ещё мне непонятен смысл "cout <<setw(6);" и назначение библиотеки #include <iomanip>, using namespace std; и int _tmain(int argc, _TCHAR* argv[]) аналогично :confused: .
245
05 июня 2007 года
~ArchimeD~
1.4K / / 24.07.2006
[QUOTE=Enotus]а можно это просто с void main() без параметров.
Так же на "stdafx.h" мой MVS 6 орёт : "Cannot open include file: 'stdafx.h': No such file or directory"...
Ещё мне непонятен смысл "cout <<setw(6);" и назначение библиотеки #include <iomanip>, using namespace std; и int _tmain(int argc, _TCHAR* argv[]) аналогично .[/QUOTE]
main без параметров вполне катит, int argc, _TCHAR* argv[] - это параметры командной строки, насчет setw(6) сразу сообразить не могу что за функция, using namespace std - пространство имен, stdafx.h - файл нужен в MS VC++ и генерится автоматически при создании проекта
26K
05 июня 2007 года
Enotus
13 / / 04.06.2007
Она отказывается выполнять что от неё требуется...
361
05 июня 2007 года
Odissey_
661 / / 19.09.2006
Цитата:
На С++ - это катит 100%.Потому,что это и есть С++,только вместо дин.массива лучше использовать вектор 2-мерный.Автор в названии пишет С/С++.Он похоже их не разделяет,как и многие другие студенты



Честно говоря на этом примере что С, что С++ выглядит довольно одинаково. Разве что у m_Valery реализован потоковый ввод/вывод, но это же не главная отличительная черта с++?

Конечно для такой задачки это не столь принципиально, но
для варианта m_Valery можно было бы для подсчета суммы sum не заводить отдельный цикл, а вычислять ее при считывании элементов еще в первом цикле, ровно как и выводить cout <<setw(6)<< num[j] там же; И sum/(row*col) считать где нибудь вне цикла.

Да, а что именно не работает? У меня пашет.

252
06 июня 2007 года
koderAlex
1.4K / / 07.09.2005
Цитата: Odissey_
Честно говоря на этом примере что С, что С++ выглядит довольно одинаково. Разве что у m_Valery реализован потоковый ввод/вывод, но это же не главная отличительная черта с++?

Конечно для такой задачки это не столь принципиально, но
для варианта m_Valery можно было бы для подсчета суммы sum не заводить отдельный цикл, а вычислять ее при считывании элементов еще в первом цикле, ровно как и выводить cout <<setw(6)<< num[j] там же; И sum/(row*col) считать где нибудь вне цикла.

Да, а что именно не работает? У меня пашет.


в С++ для подобных случаев есть контейнеры .

320
06 июня 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: koderAlex
в С++ для подобных случаев есть контейнеры .


Используем 2-мернный вектор.Для коллекции Студентам.:)

Код:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <vector>
using namespace std;
typedef vector< vector<int> > T;
ostream &operator<<(ostream &output,const T &mass)
{
     for(int i = 0;i<mass.size();++i){
        for(int j = 0;j<mass.size();++j)
               output<<setw(5)<<mass[j];
      output<<"\n\n";
    }
     return output;
}
int _tmain(int argc, _TCHAR* argv[])
{
    int row,col;
    ifstream inF("1.txt");
    if (!inF)
    {
        cout << endl << "Error !";
    }
    inF >> row;// считываем размер массива
    inF >> col;
    T mass(row, vector<int>(col));
    int sum = 0;
    for (int i = 0; i < row; ++i){ 
        for (int j = 0; j < col; ++j){     
           inF >> mass[j];
           sum += mass[j];
        }
    }
    inF.close();
    cout<<mass;
    int count = 0;
    for (int i = 0; i < row; ++i){ 
         for (int j = 0; j < col; ++j){
              if(mass[j] < sum/(row*col))
        ++count;
         }
    }
     cout<<count<<endl;
    return 0;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог