|
Программирование >> Структурное программирование
d) печать всего массива z for (i = 0; i <= 5; i++) cout zPtr[ i ] endl; e) присваивание значения, указываемого sPtr, переменной number number = *sPtr; f) ++z; g) char 3[10]; cout strncpy(s, hello , 5) endl; h) char s [12] ; strcpy(s, Welcome Home ); i) if ( strcmp(stringl, string2) ) cout << Строки равны << endl; 5.7. Что печатается (если что-либо печатается) при выполнении каждого из следующих операторов? Если оператор содержит ошибку, опишите ее и укажите, как ее исправить. Предполагайте следующие объявления переменных: char si[50] = jack , s2[50] = jill , s3[50], *sptr; a) cout << strcpy(s3, s2) << endl; b) cout strcat(strcat(strcpy(s3, si), and ), s2) endl; c) cout strlen (si) + strlen(s2) << endl; d) cout << strlen(s3) endl; Ответы на упражнения для самопроверки 5.1. а) адрес. Ь) О, NULL, адрес, с) 0. 5.2. а) Ошибка. Операция адресации может быть применена только к переменным и не может быть применена к константам, выражениям или переменным, объявленным с классом хранения register. b) Ошибка. Указатель на void не может быть разыменован, потому что не существует способа узнать точно, сколько байтов памяти должно быть разыменовано. c) Ошибка. Указателю на void можно присваивать все типы указателей без приведения типа. Однако указатель на void может быть присвоен указателю другого типа только явным приведением к типу соответствующего указателя. 5.3. а) float numbers[SIZE] = {0.0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9,}; b) float *nPtr; c) cout setiosflags(ios::fixed ios::showpoint) setprecision(1); for (i = 0; i < SIZE; i++) cout numbers[1] << ; d) nPtr = numbers; nPtr =&numbers[0]; e) cout << setiosflags(ios:;fixed ios::showpoint) << setprecision(1); for (1=0; i < SIZE; i++) cout << *(nPtr + i) << ; f) cout << setiosflags(ios::fixed I ios::showpoint) << setprecision(1); for (i = 0; i < SIZE; i++) cout *(numbers + i) ; g) cout << setiosflags(ios::fixed ios::showpoint) setprecision(1); for (i =0; i < SIZE; i++) cout << nPtr [ i ] << ; h) number[4] *(numbers + 4) nPtr [4] *(nPtr + 4) i) Адрес равен 1002500 + 8 * 4 = 1002532. Значение равно 8.8. j) Адрес number [5] равен 1002500 + 5 * 4 = 1002520. Адрес nPtr -= 4 равен 1002520 - 4 * 4 = 1002504. Значение равно 1.1. 5.4. а) float *fPtr; b) fPtr = Snumberl; c) cout Значение *fPtr равно << *fPtr << endl; d) number2 = *fPtr; e) cout Значение number2 равно number2 endl; f) cout Адрес numberl равен << Snumberl << endl; g) cout << Адрес, хранимый в fPtr, равен << fPtr endl; Да, значение то же самое. h) strcpy(si, s2) ; i) cout stremp(si, s2) = stremp(si, s2) << endl; j) strncat(si, s2, 10); k) cout strlen(si) = strlen(si) endl; 1) ptr = strtok(s2, , ); 5.5. a) void exchange(float *x, float *y) b) void exchange(float *, float *); c) int evaluate(int x, int (*poly) (int)) d) mt evaluate(int, int (*) (int)); e) ehar vowe[ ] = AEIOU ; char vowe[] = {A, E, I, O, U, \0); 5.6. a) Ошибка: zPtr не полчил начального значения. Исправление: присвоить zPtr начальное значение zPtr = z; b) Ошибка: указатель не разыменован. Исправление: изменить оператор на number = *zPtr; c) Ошибка: zPtr[2] не указатель и не может быть разыменован. Исправление: изменить *zPtr[2] на zPtr[2]. d) Ошибка: ссылка с помощью индексации указателя на элемент массива, находящийся вне его границ. Исправление: изменить операцию отношения в структуре for на <, чтобы избежать выхода за конец массива. e) Ошибка: разыменование указателя void. Исправление: чтобы разыменовать указатель, он сначала должен быть приведен к целому указателю. Измените оператор на number = *(int *)sPtr; f) Ошибка: попытка изменить имя массива с помощью арифметической операции над указателем. Исправление: или для выполнения арифметических действий с указателями используйте переменную указатель вместо имени массива, или индексируйте имя массива, чтобы сослаться на отдельный элемент. g) Ошибка: функция strncpy не записывает завершающий нулевой символ в массив s, потому что ее третий аргумент равен длине строки hello . Исправление: сделайте третий аргумент strncpy равным 6 или присвойте s[5] значение \0, чтобы быть уверенным, что завершающий нулевой символ добавляется к строке. h) Ошибка: массив символов s недостаточно велик для хранения завершающего нулевого символа. Исправление: Объявите массив с большим числом элементов. i) Ошибка: функция strcmp возвратит О, если строки равны, поэтому условие в структуре if будет ложным и оператор вывода данных не будет выполнен. Исправление: явно сравнить результат strcmp с О в условии структуры if. 5.7. а) jill b) jack and jill c) 8 d) 13 Упражнения 5.8. Определите, являются ли следующие утверждения правильными. Если нет, то объясните почему. a) Бессмысленно сравнивать два указателя, указывающие на разные массивы. b) Поскольку имя массива является указателем на его первый элемент, именами массивов можно манипулировать точно так же, как указателями. 5.9. Решите следующие задачи. Полагайте, что беззнаковые целые хранятся в 2 байтах, и что начальный адрес массива находится в ячейке памяти 1002500.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |