Проблемы, связанные с использованием указателей 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Проблемы, связанные с использованием указателей



Указатели предоставляют мощь и изящность программному коду. Кроме того, они необходимы в большинстве программ. Но когда указатель содержит неправильное значение, он может вызвать наиболее трудно устранимую ошибку. Сам по себе указатель не вызывает никаких проблем. Проблемы возникают, когда выполняется какая-либо операция, использующая неправильный указатель, например, производится чтение или запись в неизвестный участок памяти. При чтении в худшем случае в результате будет прочитан «мусор». При записи можно затереть участки кода или данных. В результате этого при поиске ошибки можно найти ее совсем в другом месте. Не существует очевидного способа для разрешения проблем, связанных с указателями.

Поскольку ошибки с указателями приводят к ужасающим последствиям, то лучше этого не допускать. С этой целью здесь рассмотрены две наиболее общие ошибки.

Классическим примером ошибки с указателем является неинициализированный указатель. Например:

// программа неверна

void main (){

int x, *p;

x = 10;

*p = x;

}

Данная программа присваивает значение 10 некоторому неизвестному участку памяти. Указатель p не получал адреса памяти, которую можно использовать. Следовательно, он содержит неопределенное значение. Такого рода проблемы часто незаметны, когда программа невелика, поскольку p, скорее всего, содержит «безопасный» адрес, не принадлежащий коду, данным, стеку или операционной системе. По мере роста программы растет и вероятность того, что неправильное использование указателя испортит жизненно важную часть программы. Неожиданно программа может зависнуть. Решение таких проблем совершенно очевидно: следует убедиться, что указатель указывает на некоторую допустимую область. Хотя в таких случаях ошибки достаточно непросто обнаружить: частая инициализация указателей (или некорректная инициализация) затрудняет поиск ошибок.

Следующая типичная ошибка возникает из-за недоразумений по использованию указателя. Например, следующая программа содержит ошибку:

// программа неверна

void main (){

int x, *p;

x = 10;

p = x;

printf("%d",*p);

}

Вызов printf() не выводит значения x, которое равно 10, на экран. В результате возникает ошибка из-за неправильного оператора присваивания

p = x;

Этот оператор присваивает значение 10 указателю р, который должен содержать адрес, а не значение. Для устранения ошибки следует написать

p = &x;

Хотя С++ выдает предупреждения об ошибках в программе, они не всегда могут помочь. Данные типы ошибок могут потребовать окольных путей по их обнаружению. Поэтому следует быть внимательным. Тот факт, что указатели могут вызвать очень сложные ошибки при некорректном использовании, не имеет никакого отношения к устранению этих ошибок.

Задания

1. Напишите функцию, параметрами которой служат адреса трех переменных типа double. Функция должна возвращать адрес (значение указателя) той из переменных, адресуемых параметрами, которая имеет максимальное значение. В основной программе с помощью обращения к функции поменяйте знак значения максимальной из трех переменных. Для решения данной задачи используйте вспомогательную функцию, возвращающую адрес максимальной из переменных, адресуемых двумя параметрами-указателями.

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

3. Напишите функцию для вычисления значения многочлена Коэффициенты , аргумент и коэффициенты передавайте в функцию с помощью списка параметров изменяемой длины. В основной программе вычислите и напечатайте значения нескольких полиномов. Для вычисления полиномов используйте схему Горнера:

.

Домашние задания

1. Наберите коды программ из Примеров 1 и 2. Выполните компиляцию и запуск программ.

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

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

 

Варианты индивидуального задания

Задание
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. Произведение элементов списка.

 


Лабораторная работа 25

Символьные данные и строки

 

Цель работы: изучить особенности внутреннего представления символьных данных и строк, научиться выполнять ввод/вывод, просмотр и замену в строках при решении задач на языке C++.

 

Теоретические сведения

Для представления текстовой информации в языке С++ используются символы (константы), символьные переменные и строки (строковые константы), для которых в языке С++ не введено отдельного типа в отличие от некоторых других языков программирования.

Для символьных данных в С++ введен тип char. Описание символьных переменных:

char список_имен_переменных;

Например:

const char c='c';

//символ – занимает один байт, его значение не меняется

char a,b;

/*символьные переменные, занимают по одному байту,

значения меняются*/

const char *s="Пример строки\n";

//текстовая константа

Строка – это последовательность символов, заключенная в двойные кавычки (" ").

Размещая строку в памяти, транслятор автоматически добавляет в ее конце символ '\0' (нулевой символ или нулевой байт, является признаком конца строки). В записи строки может быть и один символ: ”А” (заключен в двойные кавычки), однако, в отличие от символьной константы 'А' (используются апострофы) длина строки ”А” равна 2 байтам.

В языке С++ строка – это пронумерованная последовательность символов (массив символов), она всегда имеет тип char[]. Все символы строки нумеруются, начиная с нуля. Символ конца строки также нумеруется – ему соответствует наибольший из номеров. Таким образом, строка считывается значением типа «массив символов». Количество элементов в таком массиве на 1 больше, чем изображение соответствующей строки, так как в конец строки добавлен нулевой символ '\0' (рис.).

 

A \0   A
”А” строка (2 байта)   'А' символ (1 байт)

 

Рис. Представление строки и символа

 

 

Символьная строка в программном коде может располагаться на нескольких строках. Для переноса используется символ '\' с последующим нажатием клавиши ввод. Символ '\' игнорируется компилятором, и следующая строка считается продолжением предыдущей.

Присвоить значение строке с помощью оператора присваивания нельзя. Поместить строку в массив можно либо при вводе, либо с помощью инициализации:

char s1[] = ”ABCDEF”; //инициализация строки

char s2[]={'A','B','C','D','E','F','\0'};//инициализация строки

 

Операция вычисления размера (в байтах) sizeof действует для объектов символьного типа и строк.

Пример 1.

// Определение размера строк

#include <iostream.h>

void main() {

char s1[10]="string1";

int k=sizeof(s1);

cout<<s1<<"\t"<<k<<"\n";

char s2[]="string2";

k=sizeof(s2);

cout<<s2<<"\t"<<k<<"\n";

char s3[]={'s','t','r','i','n','g','3','\0'};

/*окончание строки '\0' следует соблюдать, формируя

в программах строки из отдельных символов*/

k=sizeof(s3);

cout<<s3<<"\t"<<k<<"\n";

char *s4="string4";

//указатель на строку, ее нельзя изменить

k=sizeof(s4);

cout<<s4<<"\t"<<k<<"\n";

}

Результат выполнения программы:

string1 10 – выделено 10 байтов, в том числе под '\0'

string2 8 – выделено 8 байтов (7 + 1 байт под '\0')

string3 8 – выделено 8 байтов (7 + 1 байт под '\0')

string4 2 – размер указателя 2 байта

 



Поделиться:


Последнее изменение этой страницы: 2016-09-13; просмотров: 490; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.16.69.143 (0.025 с.)