Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
3 / 3 / 2
Регистрация: 10.09.2013
Сообщений: 210

Обработка массива, считанного из файла; найти ошибку

18.06.2014, 17:50. Показов 1184. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть задание: программа считывает из файла массив целых чисел.
Найти максимум (max) и минимум (min) среди них, после чего найти среднее арифметическое отрицательных чисел, расположенных между max и min.

Написал такую программу:
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
#include <iostream>
#include <fstream>
using namespace std;
void main(void)
{int max,min,maxind=0,minind=0,i=0,n,m,dim,counter=0;
double s=0;
char *filename[64];
gets(filename);
ifstream input_file(filename);
ofstream output_file("C:\\temp\\result.txt");
char temp[11];
while(!input_file.eof())
{input_file>>temp;
++i;}
dim=i;
cout<<dim<<"\n";
if(dim==1){cout<<"Only one number in the file!";output_file<<"Result: 0";goto end;}
if(dim==2){cout<<"Only two numbers in the file!";output_file<<"Result: 0";goto end;}
int *num=new int[dim];
input_file.close();cout<<"Closed\n";
input_file.open(filename);cout<<"Opened\n";
input_file>>temp; 
num[0]=atoi(temp);cout<<num[0];
max=num[0];
min=num[0];
i=1;
while(!input_file.eof())
{input_file>>temp; 
num[i]=atoi(temp);cout<<num[i]<<"\n";
++i;}
for(i=0;i<dim;i++)
{if(num[i]>=max){max=num[i];maxind=i;}
if(num[i]<=min){min=num[i];minind=i;};}
cout<<"max="<<max<<"\nmin="<<min;
if(maxind>minind){m=maxind;n=minind+1;}
if(maxind<minind){n=maxind+1;m=minind;}
for(i=n;i<m;i++)
{if(num[i]<0)s=s+num[i];++counter;}
s=s/counter;
cout<<s;
output_file<<"Result: "<<s;
end: system("pause");}
Но появилось несколько проблем:

1. Программа выдаёт ошибку, когда доходит до gets

2. После замены
C++
1
2
char *filename[64];
gets(filename);
на
C++
1
char*filename="C:\\file.txt"
Показывает пустое чёрное окно с курсором и ни на что не реагирует.


1. Я думаю, что это из-за того, что часть массива filename осталось незаполненным. Но какой тогда способ использовать для ввода полного имени файла с клавиатуры?

2. Не представляю даже, что там не так. Но я наставил кучу cout для того, чтобы видеть, на каком этапе программа прервётся. Ни один cout не вывел ничего на экран, значит ошибка где-то ещё до них.

3. Ещё вопрос. Это:
C++
1
2
input_file>>temp; 
num[i]=atoi(temp)
можно ли заменить этим:
C++
1
input_file>>num[i];
Будет работать?

Заранее спасибо

2 исправил: просто проглупил и забыл файл создать.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.06.2014, 17:50
Ответы с готовыми решениями:

Обработка двумерного массива, не могу найти ошибку
если первый элемент в массиве максимальный, то ко всем элементам в строке прибавляет 10.....первая стока проходит, а вторая почему-то нет ...

Обработка двумерного массива, не могу найти ошибку
если первый элемент в строке максимальный, то всю строку увеличить на 10. но почему-то проходит только первую строку, а для последующих не...

Интегрирование полинома, считанного из файла
Из файла считывается степень полинома и его коэффициенты. Например, ============== 5 1 2 3 4 5 6 ============== ~ 1 + 2*x + 3*x^2...

5
Модератор
Эксперт С++
 Аватар для zss
13772 / 10965 / 6491
Регистрация: 18.12.2011
Сообщений: 29,242
18.06.2014, 18:24
Лучший ответ Сообщение было отмечено Монтгомери как решение

Решение

Цитата Сообщение от Монтгомери Посмотреть сообщение
char *filename[64];
gets(filename);
Звездочку уберите

Добавлено через 2 минуты
Цитата Сообщение от Монтгомери Посмотреть сообщение
input_file>>num[i];
Работать будет, но если во входном потоке не окажется цифр,
то возникнет ошибочное состояние. А atoi во что-нибудь да переведет (кажется в 0).
1
3 / 3 / 2
Регистрация: 10.09.2013
Сообщений: 210
18.06.2014, 18:32  [ТС]
Спасибо
0
11 / 11 / 5
Регистрация: 12.10.2013
Сообщений: 54
18.06.2014, 18:40
C
1
2
char *filename[64];
gets(filename);
не правильно.
Сигнатура:
C
1
char * gets ( char * str );
Вы передаете указатель на массив, (аналог: char **str)
А надо указатель на блок памяти (просто указатель, char *str или char str[buffersize], не совсем одно и то же, но прокатит)
http://www.cplusplus.com/reference/cstdio/gets/

Зачем это?
C
1
2
input_file.close();cout<<"Closed\n";
input_file.open(filename);cout<<"Opened\n";

1. Я думаю, что это из-за того, что часть массива filename осталось незаполненным. Но какой тогда способ использовать для ввода полного имени файла с клавиатуры?
Прикладываю отформатированный код, мб кто-то сможет поймать багу.
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
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main() {
    int max, min ,maxind = 0, minind = 0, i = 0, n, m, dim, counter = 0;
    double s = 0;
    char filename[64];
    gets(filename);
    ifstream input_file(filename);
    ofstream output_file("C:\\temp\\result.txt");
    char temp[11];
    while(!input_file.eof()) {
        input_file >> temp;
        ++i;
    }
    dim = i;
    cout << dim << "\n";
    
    if(dim == 1) {
        cout << "Only one number in the file!";
        output_file << "Result: 0";
    } 
    else if (dim == 2) {
        cout << "Only two numbers in the file!";
        output_file << "Result: 0";
        }
    else {
        int *num = new int[dim];
        input_file.close();
        cout << "Closed\n";
        input_file.open(filename);
        cout << "Opened\n";
        input_file >> temp; 
        num[0] = atoi(temp);
        cout << num[0];
        max = num[0];
        min = num[0];
        i = 1;
    
        while(!input_file.eof()) {
            input_file >> temp; 
            num[i] = atoi(temp);
            cout << num[i] << "\n";
            ++i;
            }
        
        for(i = 0; i < dim; i++) {
            if(num[i] >= max) {
                max=num[i];
                maxind=i;
            }
            if(num[i]<=min) {
                min=num[i];
                minind=i;
            };
        }
        cout << "max=" << max << "\nmin=" << min;
        
        if (maxind > minind) {
            m = maxind;
            n = minind + 1;
        }
        if (maxind < minind) {
            n = maxind + 1;
            m = minind;
        }
        // А если равно!?
        
        for(i = n; i < m; i++) {
            if(num[i] < 0)
                s=s+num[i];
            ++counter;
        }
        s = s/counter;
        cout << s;
        output_file << "Result: " << s;
    }
    system("pause");
}
P.s. не пишите так код пожалуйста, очень сложно читать, используйте отступы и не пишите 3 команды подряд, про goto вообще молчу, просто return нужно делать
1
3 / 3 / 2
Регистрация: 10.09.2013
Сообщений: 210
18.06.2014, 19:07  [ТС]
return будет тоже ждать нажатия любой клавиши? Если да, то от подходит, спасибо.

Добавлено через 5 минут
Цитата Сообщение от LifeMoroz Посмотреть сообщение
Зачем это?
Я думал, что после
C++
1
2
3
4
while(!input_file.eof()) {
        input_file >> temp;
        ++i;
    }
программа будет проболжать с последнего места чтения. А т.к. закончило оно на конце файла, то может выдать ошибку.
Если оно и без этого будет работать - удалю
Цитата Сообщение от LifeMoroz Посмотреть сообщение
// А если равно!?
А равно оно может быть в двух случая:
1. В файла всего одно число, это я раньше предусмотрел.
2. Файл состоит из множества одинаковых чисел (4 4 4 4 4 ...). Это уже маловероятно, хотя хорошо, всё же предусмотрю.

Добавлено через 11 минут
Цитата Сообщение от Монтгомери Посмотреть сообщение
Зачем это?
Проверил: убрал эти две строки. Без этого где-то выдаёт ошибку, а искать откровенно лень.
0
11 / 11 / 5
Регистрация: 12.10.2013
Сообщений: 54
18.06.2014, 19:17
Проверил: убрал эти две строки. Без этого где-то выдаёт ошибку, а искать откровенно лень.
http://www.cplusplus.com/refer... eam/seekg/

file.seekg (0, is.beg)

return будет тоже ждать нажатия любой клавиши? Если да, то от подходит, спасибо.
Не будет, но макаронный код придет к вам ночью и замаринует (однажды), если будете использовать goto. Тот код что я скинул избегает goto и при этом ожидает
Единственно, в конце таки надо добавить return 0;
Функция main должна что-то возвращать по фен-шую
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.06.2014, 19:17
Помогаю со студенческими работами здесь

Передача считанного файла через pipe
прошу помощи разобраться с чтением файла и передачей прочитанных данных через анонимный pipe сам смысл задачи:программа запускается из...

Лишние символы при выводе только что считанного массива
Доброй ночи. При выполнении одного из заданий столкнулся с тем, что паскаль при считывании текстового файла, заполнения массива и вывода...

Обработка исключений-найти ошибку в коде.
Здравствуйте. Помогите пожалуйста. package labs.four; import java.io.*; import java.util.*; import...

Обработка одномерных массивов, не могу найти ошибку в коде
#include &lt;iostream&gt; using namespace std; int main(void) { setlocale(LC_ALL, &quot;Russian&quot;); int n, i, result = 1, max; ...

Обработка ассоциативного массива с файла
Здравствуйте! Помогите новичку, недавно начал изучать PHP - очень тяжело освоится. У меня было задание: создать ассоциативный массив и...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru