3 / 3 / 7
Регистрация: 21.03.2013
Сообщений: 639
1

Напишите программу, которая контролирует индексы, выходящие за пределы массива и генерирует исключения.

15.02.2014, 21:41. Показов 3234. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Реализовать базовый класс исключений и многоуровневую иерархию производных классов с использованием наследования, таких как выход индекса за пределы массива, неправильный аргумент у функции, переполнение сверху, переполнение снизу, ошибка диапазона, ошибка выделения памяти и др. №2 Промоделировать ситуацию, в которой будет важна последовательность вызова обработчиков в иерархии исключений.

Вот именно моё задание: Напишите программу, которая контролирует индексы, выходящие за пределы массива и генерирует исключения. В сообщение об ошибке должна входить информация о значении индекса, приведшего к сбою.

Вот код, пока без иерархии классов хочу разобратся, можно впринципе и динамический массив сделать.
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
#include <iostream>
#include <string>
#include <locale.h>
#include <exception>
using namespace std;
 
 
 
int main()
{
    setlocale(LC_ALL,"Russia");
    int m[3];
    int a;
    cin>>a;
    try
    {
        //cin>>a;
        m[a]=30/a;
        //cout<<m[a];
        //cout<<"alala";
    }
    catch(int [])
    {
        cout<<m[a];
    }
    system("pause");
}
Вопросы: Почему тут катч не работает, с throw тоже не перехватывается, и ещё подскажите плз, функцию возвращающую индекс элемента, есть ли она, и как вообще вывести индекс приведший к сбою
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2014, 21:41
Ответы с готовыми решениями:

Напишите программу, которая генерирует в лексикографическом порядке 4-буквенные слова
Напишите программу, которая генерирует в лексикографическом порядке 4-буквенные слова в наборе A =...

Напишите программу которая генерирует 10 случайных чисел. Вычислить их среднее арифметическое
Напишите программу которая генерирует 10 случайных чисел в диапозоне от 1 до 20, выводит эти числа...

Напишите программу, которая позволяет пользователю ввести число, а затем генерирует таблицу размером 20 строк на 10 столбцов
вот задача Решения к упражнениям, помеченным знаком *, можно найти в приложении Ж. *1....

Построения, выходящие за пределы осей
Всем доброго времени суток! Есть такая программка: load geoid figure %ax1 = axes('Position',);...

4
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
15.02.2014, 21:49 2
Цитата Сообщение от Владислаучык Посмотреть сообщение
Вопросы: Почему тут катч не работает, с throw тоже не перехватывается, и ещё подскажите плз, функцию возвращающую индекс элемента, есть ли она, и как вообще вывести индекс приведший к сбою
С.Прата Язык программирования С++ - там в теме исключений есть как раз [].
Начнём с того, что у вас исключения не вызывается, точнее вызывается что-то типа index_error - производный объект от базового expection.
вот здесь, надо вызывать как раз объект, по которому генерируется исключение
C++
1
 [quote="Владислаучык;5786180"]catch(int [])[/quote]
т.е. к примеру catch(index_error &obj)
в теле обработки исключения, надо описать его т.е. к примеру выглядеть это будет так:
C++
1
2
3
4
5
catch(index_error &obj) // передаем объект типа index_error по ссылке
{
cout<<"Error! The index of array is not range!";
// тут можно завершить программу exit'ом или продолжить, что угодно
}
само прерывание тоже надо генерировать, т.е. к примеру есть функция getArray - которая возвращает i элемент, тогда
C++
1
2
3
4
5
6
int  getArray(int* m, int i)
{
if (i<0 || i> a)  // a - предел массива
    throw index_error;
return m[i];
}
я настоятельно рекомендую заглянуть в Прата т.к. там это точно есть, я же могу что-то сказать не так ибо сам не так давно только читал про исключения

кстати вы по идее можете перехватывать исключения базовым expecition
0
20 / 20 / 8
Регистрация: 26.01.2014
Сообщений: 56
15.02.2014, 21:55 3
Вообще-то стандартные массивы не выбрасывают исключений при неправильном индексе. Они его не проверяют.
Индекс проверяет метод at класса vector. Данные по неправильному индексу просто записываются в область памяти определяемую как arr + index, могут перезатереть важные данные и нарушить выполнение программы. В данном случае программа маленькая и ничего не происходит (заметного). Нужно либо писать свой класс хранения данных, либо использовать vector, либо array (для стандарта с++11)
0
3 / 3 / 7
Регистрация: 21.03.2013
Сообщений: 639
15.02.2014, 22:51  [ТС] 4
Цитата Сообщение от stikkas Посмотреть сообщение
Вообще-то стандартные массивы не выбрасывают исключений при неправильном индексе. Они его не проверяют.
Индекс проверяет метод at класса vector. Данные по неправильному индексу просто записываются в область памяти определяемую как arr + index, могут перезатереть важные данные и нарушить выполнение программы. В данном случае программа маленькая и ничего не происходит (заметного). Нужно либо писать свой класс хранения данных, либо использовать vector, либо array (для стандарта с++11)
вектор и аррау точно не надо(не проходили ещё ), ну тут по условию надо иерархию классов создать, я просто пока разобратся решил всё в маине сделать, не получилось (
0
20 / 20 / 8
Регистрация: 26.01.2014
Сообщений: 56
16.02.2014, 09:34 5
Цитата Сообщение от Владислаучык Посмотреть сообщение
Вот именно моё задание: Напишите программу, которая контролирует индексы, выходящие за пределы массива и генерирует исключения. В сообщение об ошибке должна входить информация о значении индекса, приведшего к сбою.
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
#include <iostream>
#include <string>
using std::string;
using std::cin;
using std::cout;
using std::cerr;
using std::endl;
 
class OutRangeError {
public:
    OutRangeError(int idx) : index(idx) {}
    virtual ~OutRangeError(){}
    virtual string what() const {
        return "Error index";
    }
    int getIndex() const {return index;}
private:
    int index;
};
 
class LowBoundError : public OutRangeError {
public:
    LowBoundError(int idx) : OutRangeError(idx){}
    string what() const {
        return "Index is less than lower bound";
    }
};
 
class UpBoundError : public OutRangeError {
public:
    UpBoundError(int idx) : OutRangeError(idx){}
    string what() const {
        return "Index is less than upper bound";
    }
};
 
int main() {
    int arr[] = {1, 2, 10, 4, 5, 6, 7, 9, 10};
    cout << "Gimme index: ";
    int idx;
    cin >> idx;
    try {
        if (idx < 0)
            throw LowBoundError(idx);
        else if (idx >= sizeof(arr) / sizeof(int))
            throw  UpBoundError(idx);
        cout << "You number is " << arr[idx] << endl;
    } catch (const OutRangeError &err) {
       cerr << err.what() << "; index = " << err.getIndex() << endl;
       return 1;
    }
 
    return 0;
}
Как-то так.
0
16.02.2014, 09:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2014, 09:34
Помогаю со студенческими работами здесь

Даны два массива. Напишите программу, которая находит такую последовательность элементов максимальной длины, которая содержится и в первом, и во вт
Помогите написать программу.Даны два массива. Напишите программу, которая находит такую...

Выход за пределы массива, обработка исключения
Есть такой код, когда я вызываю функцию на вывод массив еще не инициализирован, и я хочу чтобы у...

Напишите программу, которая выполняет неполную сортировку массива: ставит в начало массива три самых меньших
Напишите программу, которая выполняет неполную сортировку массива: ставит в начало массива три...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru