4. Нужно ли писать "else", если при выполнении условия выполняется оператор return?
5. Выражения какого типа могут определять условия?
6. Какие значения выражения, определяющего условие, считаются истинными, а какие ложными?
7. Какие операции относятся к операциям отношения?
8. Чем отличается операция "= =" от операции "="?
9. Какие операции относятся к логическим? Каков их приоритет?
10. Какой операцией можно заменить операцию "&&" ?
11. Какой операцией можно заменить операцию "||" ?
12. Чему может быть равно значение выражения отношения или логического выражения?
13. Как правильно сравнить на равенство вещественные числа?
14. Как правильно проверить вхождение значения в некоторый диапазон?
15. Как проверить некоторое целочисленное значение на равенство нулю?
16. Как проверить отличие целочисленного значения от нуля?
17. Когда применяется вложение условных операторов?
18. Как правильно записать вложенные условные операторы?
19. Что представляет собой оператор switch? Как им пользоваться?
20. Как записать оператор switch с помощью условных операторов?
21. Что такое цикл?
22. Какие виды циклов вы знаете? Какие операторы цикла существуют в языке Си?
23. Чем отличается цикл с предусловием от цикла с постусловием?
24. Когда необходимо использовать цикл с предусловием, а когда с постусловием? Приведите примеры.
25. Какие циклы с предусловием существуют в языке Си?
26. Сколько операторов содержит в себе тело цикла в языке Си?
27. Как правильно записать цикл с постусловием на языке Си?
28. Как задать бесконечный цикл? Зачем он нужен? Как из него выйти?
29. Каким должно быть значение выражения, определяющего условие выполнения цикла, для завершения цикла?
30. Каким должно быть значение выражения, определяющего условие выполнения цикла, для выполнения тела цикла?
31. К чему приведет неправильное задание выражения, определяющего условие выполнения цикла?
32. Может ли тело цикла отсутствовать? Если может, то приведите примеры таких циклов.
33. Чем отличается оператор while от оператора if?
34. Каков порядок действий при выполнении цикла for?
35. Как организовать арифметический цикл с помощью цикла for?
36. Запишите алгоритм, определяемый циклом for, с помощью цикла while.
37. Что такое вложенный цикл?
38. Сколько раз в общей сложности выполняется тело вложенного цикла?
39. Как и когда используются операторы break и continue?
40. Что такое рекуррентные вычисления? Когда они используются? Как их программировать?
Практическая работа № 3. Указатели
Цель работы – познакомиться с адресацией памяти, научиться правильно использовать указатели различных типов.
Операции с указателями
Разыменование, получение адреса, присваивание значения указателя другому указателю того же типа, сложение и вычитание указателя и целого, вычитание и сравнение двух указателей, указывающих на элементы одного и того же типа, а также присваивание указателю нуля и сравнение указателя с нулем.
Постановка задачи
1. Набрать текст программы, представленный ниже. Проанализировать выдаваемые программой результаты. Объяснить, почему они именно такие.
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
int main(void){
//Переменные
int a=1;
float b=2;
double c=3;
//Указатели
int *p1=&a;
float *p2=&b;
double *p3=&c;
void *p4;
// Адреса переменных и размер выделяемой памяти
printf("a: int: start address %p \
extent %d\n", &a, sizeof(a));
printf("b: float: start address %p \
extent %d\n", &b, sizeof(b));
printf("c: double: start address %p \
extent %d\n\n", &c, sizeof(c));
//Адреса указателей и размер выделяемой памяти
printf("p1: pointer: start address %p \
extent %d\n", &p1, sizeof(p1));
printf("p2: pointer: start address %p \
extent %d\n", &p2, sizeof(p2));
printf("p3: pointer: start address %p \
extent %d\n\n", &p3, sizeof(p3));
//Значения, на которые ссылаются указатели
printf("p1: %p related value %d\n",p1,*p1);
printf("p2: %p related value %f\n",p2,*p2);
printf("p3: %p related value %lf\n\n",p3,*p3);
//Использование указателей в выражениях
printf("a=%d\tb=%f\tc=%lf\n", a, b, c);
*p1=5;
*p2=*p2*(*p1);
*p3=sqrt(*p3);
printf("a=%d\tb=%f\tc=%lf\n",a,b,c);
printf("*p1=%d\t*p2=%f\t*p3=%lf\n\n",
*p1, *p2, *p3);
//Присваивание указателей
p1=(int*)p2;
p3=(double*)p2;
p4=p2;
printf("p1=%p\tp2=%p\tp3=%p\tp4=%p\n",
p1, p2, p3, p4);
printf("*p1=%d\t*p2=%f\t*p3=%lf\t*(float*)p4=\
%f\n\n", *p1, *p2, *p3, *(float*)p4);
//Изменение значений указателей
p1++;
p3--;
printf("p1=%p\tp2=%p\tp3=%p\n", p1, p2, p3);
printf("*p1=%d\t\t*p2=%f\t*p3=%lf\n",
*p1, *p2, *p3);
p1-=4;
p3=(double*)&a-1;
printf("p1=%p\tp2=%p\tp3=%p\n",p1,p2,p3);
printf("*p1=%d\t*p2=%f\t*p3=%lf\n",
*p1, *p2, *p3);
system("pause");
return 0;
}
2. Набрать текст программы, найти в нем синтаксические ошибки и исправить их, в начало программы добавить вывод на экран адресов всех переменных, а в конец – значений всех переменных, проанализировать полученные результаты и объяснить, почему они именно такие. Заменить оператор «m+=2;» оператором «m++;», проанализировать результат.
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
char *p, c;
int *a, b;
float *x, y = 3.5;
double *m, n;
a = &b;
printf(" Enter b = ");
scan("%d", a);
printf("a=%p\t*a=%d\tb=%d\n", a, *a, b);
p = a;
c=*p;
*p=*(p+3);
*(p+3)=c;
printf("p=%p\tc=%d\ta=%p\tb=%d\n", p, c, a, b);
x = &y;
printf("x=%p\t*x=%f\ty=%f\n", x, *x, y);
a = x;
*a = *x;
pintf("a=%p\t*a=%d\tx=%p\t*x=%f\ty=%f\n",
a, *a, x, *x, y);
a = &b;
y = 12345,6789;
printf("x=%p\t*x=%f\ty=%f\n", x, *x, y);
p = x;
c=*p;
*p=*(p+3);
*(p+3)=c;
printf("p=%p\tc=%d\tx=%p\ty=%f\n", p, c, x, y);
m = &n;
printf("m=%p\t*m=%lf\tn=%lf\n", m, *m, n);
n = 5.5;
printf("m=%p\t*m=%lf\tn=%lf\n", m, *m, n);
b = n = y = 1.7;
print("b=%d\ty=%f\tn=%lf\n", b, y, n);
printf("*a=%d\t*x=%f\t*m=%lf\n", *a, *x, *m);
m += 2;
printf("n=%lf\tn=%p\tm=%p\n", n, &n, m);
*m = (float)*a - n + (int)*x;
printf("m=%p\t*m=%lf\n", m, *m);
system("pause");
return0;
}
Контрольные вопросы
1. Что такое указатель?