[C/C++] Чтение чисел из файла, создание массива заполненного этими числами.
Я прикинул предварительный план решения и составил 3 пункта:
1) (То, что я незнаю как реализовать.): Читаем *.txt файл chisla и выделяем из этого файла все вещественные числа стоящие
через пробел (пример файла : "234432.324422 565463.4353 2425654.478".. и т.д.) Записываем по порядку каждое число в новый
динамический массив chisla, размер массива = числу чисел из файла.
2) Находим среднее значение всех чисел используя массив, это я могу сделать.
3) Выводим на экран все элементы массива, меньшие чем их среднее значение. Это я тоже могу реализовать.
Заранее спасибо за любую помощь.
1) (То, что я незнаю как реализовать.): Читаем *.txt файл chisla и выделяем из этого файла все вещественные числа стоящие
через пробел (пример файла : "234432.324422 565463.4353 2425654.478".. и т.д.) Записываем по порядку каждое число в новый
динамический массив chisla, размер массива = числу чисел из файла.
.
Это ты с числами решил общаться как со строками? Почему не с бинарным файлом, а именно с текстровым?
Опыта работы с файлами в си ранее не имел.
#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;
}
Зачем создавать бинарный файл,когда по условию файл дан ? В нем находятся какие то числа.Массив стоит сделать 2-мерный(или числа в файле идут в одну строку ? Вряд ли).Ничего не надо выковыривать,никакого stroint( ? ).Все проще.Я делаю единственное допущение,что в первой строке файла записан размер массива и мы его считываем(облом считать:) ).Далее читаем весь массив.
#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;
}
На С++ - это катит 100%.Потому,что это и есть С++,только вместо дин.массива лучше использовать вектор 2-мерный.Автор в названии пишет С/С++.Он похоже их не разделяет,как и многие другие студенты:(
Потом,что ты имеешь в виду под словом не везде ?
Потом,что ты имеешь в виду под словом не везде ?
Вот я дал свой вариант на С, ты на С++;) все довольны - разделяй и властвуй.
Не везде - мне кажется, что не все компиляторы безболезненно проглотят, хотя очень велика вероятность, что ошибаюсс.
Хотя, да, я дурак - все ок.
Так же на "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: .
Так же на "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++ и генерится автоматически при создании проекта
Честно говоря на этом примере что С, что С++ выглядит довольно одинаково. Разве что у m_Valery реализован потоковый ввод/вывод, но это же не главная отличительная черта с++?
Конечно для такой задачки это не столь принципиально, но
для варианта m_Valery можно было бы для подсчета суммы sum не заводить отдельный цикл, а вычислять ее при считывании элементов еще в первом цикле, ровно как и выводить cout <<setw(6)<< num[j] там же; И sum/(row*col) считать где нибудь вне цикла.
Да, а что именно не работает? У меня пашет.
Конечно для такой задачки это не столь принципиально, но
для варианта m_Valery можно было бы для подсчета суммы sum не заводить отдельный цикл, а вычислять ее при считывании элементов еще в первом цикле, ровно как и выводить cout <<setw(6)<< num[j] там же; И sum/(row*col) считать где нибудь вне цикла.
Да, а что именно не работает? У меня пашет.
в С++ для подобных случаев есть контейнеры .
Используем 2-мернный вектор.Для коллекции Студентам.:)
#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;
}