Процедурное программирование на языке С. Часть 1. Основные понятия языка С: Методические указания к лабораторным работам по курсам «Алгоритмические языки и программирование» и «Процедурное программирование», страница 15

voidmain ()

intnfloatrp;   charhc;

voidVvod_Z(int *,char *,float *);

Vvod_Z (&n,&hc,&rp);

    if (n>5)     printf("\n symbol = %c",hc);

                     else printf("\n number = %f",rp);

}

Vvod_Z(int *m,char *ch,float *pr)

{*m = 10;  *ch =’D’; *pr = 145.87;  }

Если в функции Vvod_Z() значения трех переменных вводятся с клавиатуры с помощью функции scanf(), как в примере 3.6, то операция разыменования не используется, т.к. аргументы функции Vvod_Z()  – адреса.  

Пример 3.6.

Vvod_Z(int *m,char *ch,float *pr)

      {  printf("\n Enter number (type  int) = ");   scanf("%d",m);

         fflush(stdin);

         printf("\n Enter symbol = ");       scanf("%c",ch);

        printf("\n Enter number (Type float) = ");      scanf("%f",pr);

}

Замечание. Функция fflush() с аргументом stdin (из библиотеки <stdio.h>)   очищает входной поток. Если входной поток не очистить, то последующий ввод символа при  спецификации %c, как правило, не осуществляется, т.к. в потоке stdinв этот момент находится управляющий символ, соответствующий клавише “Enter”.


КОНТРОЛЬНЫЕ ВОПРОСЫ И ЗАДАНИЯ

1. Оператор b  = &f; означает, что значение  переменной   b равно:

a) адресу переменной f

b) значению переменной f ;   

c) содержимому по адресу f .

Как должны быть объявлены переменные b и f ?

2. Фрагмент программы:  

float *qq;     floatBB[10];      qq=&BB[0];

qq – переменная или константа? BB – переменная или константа?

Являются ли допустимыми выражения:   qq++, BB++?

3. Какие выражения из перечисленных являются эквивалентными:

a[i];  i[a];  *(a+i);  *(i+a);  ++*(a+i);  *(a+i)++;  ++*(i+a);  *(i+a)++;  a[i]++;  ++i[a]?

Объявите переменные iиa перед ответом на вопрос об эквивалентности записей.

4. В каком случае два оператора эквивалентны? Как должны быть объявлены переменные ?

free(ptr);        ptr=realloc(p1,size);

5. Почему результат выполнения функций    malloc(), calloc(), realloc ()    может быть присвоен указателю на объект любого типа?

6. Какие из операторов могут быть написаны синтаксически верно и в каких случаях?    Как должны быть объявлены (и инициализированы) соответствующие переменные ?

scanf ("%c",&K);   

scanf ("%d",H);   

printf ("%p",&G);

printf ("%f",*S);   

7. Укажите эквивалентные  фрагменты программы, следующие (по одному) за операторами

int arr[4] = {2, 3, 4, 5};        int *ptr; ptr=arr;

Фрагмент 1. ––*ptr++;  Фрагмент 2. ––(*ptr++); 

Фрагмент 3. ––(*ptr); ptr++; Фрагмент 4. *ptr=2;

Фрагмент 5. *ptr=3;  Фрагмент 6. *ptr=4;

8. Если следующие операторы записаны синтаксически верно, то какое значение переменная t принимает после выполнения операторов:

float y[6],*ptr,*pp; int t; ptr=y; pp=y[3]; t= pp – ptr;

9. Какие значения переменные t и s принимают после выполнения операторов (если приведенные операторы могут служить логически  связанным фрагментом программы):

int t=6, *ptr,  s;  ptr=&s;   *ptr=8; t+=  --*ptr+s;

10. Какие значения  принимают переменные (имеются в виду переменные, значения которых определяются однозначно) после выполнения операторов:

int t=6,*ptr, a[2]={'3','8','6'};  ptr = a; a[1]-= a[0];

t+= * ++ptr + a[1];

Если имеются синтаксические ошибки, исправьте  их.

11. Какие значения принимают  элементы массива x,  переменная y и как меняется значение переменной j после выполнения каждого оператора фрагмента программы:

int x[] = {0, 2, 4, 6}, *j, y;

j = x;

y =*j;

y =*j++;

y = ++*j;

y = *++j;

y = (*j)++;

y =++(*j);

12.Что будет на экране после выполнения программы:

#include <stdio.h>

void main (void)

{ char A[]="jhon", * ptr = A,  ch;

while (ch = *ptr++)

  switch (ch)

   { case 'j':

     case 'h': printf ("%c", 'e'); break;

     case 'n': printf ("%c", 'w');

default : printf ("%c", 'a');    

   }