Основные операции с указателями 


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



ЗНАЕТЕ ЛИ ВЫ?

Основные операции с указателями



Наиболее важные операции с указателями: операция обращения по адресу "*" (называется также разыменованием указателя, разадресацией, операцией косвенной адресации) и операция определения адреса "&". Операция обращения по адресу служит для доступа к данным описанного типа, т.е. для присвоения и считывания данных.

Пример:

int*x; int d; // не путать разадресацию со звёздочкой при объявлении указателя

int у = *х // у = 4;

В первой строке переменной-указателю х присваивается адрес, где хранится значение переменной d во второй строке переменной у присваивается разыменованное значение указателя х, т.е. значение 4. Если первую операцию написать без адреса, т.е. х = dх объявлен как int*x), то х будет указывать на ячейку памяти с адресом??:4 (?? - в зависимости от модели памяти) и значение переменной у будет равно значению,которое хранится по указанному адресу.

Операция определения адреса & возвращает адрес памяти своего операнда (переменной, константы, функции и т. д.). Формат получения адреса следующий:

<адрес> = & <переменная>;

Пример: int x, *y; y = &a; // указатель y содержит адрес х

Кроме того, указатели можно присваивать друг другу, если они одного типа.

 

Пример: int a, *x, *y; x =y;

Всем указателям для инициализации можно присваивать константу NULL, при этом гарантируется, что этот адрес не совпадает ни с каким другим адресом, зарезервированным системой. Операции с указателями будут также рассмотрены при работе с массивами.

 

Указатели и целые величины

Выражение целого типа может складываться и вычитаться из переменной типа указатель. Два указателя на объекты одного и того же типа могут вычитаться; в этом случае результат имеет целый тип.

char*a = "Slovo", c;

c = *(a+3); // c = 'v'

char*a, *b = "ABCDE";

a = b + 2; c = *(- - a;

char k = *a; int d = b-a)

Динамическое размещение указателей в памяти

 

Чтобы не вызвать конфликт в операционной системе или не нарушить работу приложения, нужно выделять место для указанного типа данных в допустимом пространстве памяти, которое называется «heap» или «куча».

Выделение (если есть возможность) памяти и присвоение её адреса указателю, по которому можно работать с описанным типом осуществляется библиотечной функцией malloc () или alloc(), (заголовочный файл <mem.h>), которую необходимо предварительно включить в программу директивой # include. Эти функции при последующих выделениях памяти предотвращают конфликты между указателями.

Формат использования данной функции:

<указатель> = (<тип_указателя>*) malloc (<размер_выделяемой_памяти_байт>);

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

Например, функция динамического распределения памяти может воспринимать размер (в байтах) объекта, для которого выделяется память, и возвращать указатель на тип void

double*dp;

d = (double*) malloc (sizeof(double)); // функция malloc () выделяет память

free dp: *dp = 22. / 7.0 // освобождение динамических выделений памяти.

При использовании функции обеспечивается преобразование возвращаемого значения из указателя на тип void в указатель на тип double.

 

Пример

/* ЗАНЯТИЕ N 8

Выполнил студент группы......... Петров Ю.В.

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

различных типов, изменение значений переменных по адресу

и по ссылке. Примеры операций с указателями */

 

#include <stdio.h>

#include <conio.h>

#include <string.h>

#include <alloc.h>

int a; //Объявление глобальной переменной типа int

int main(void)

{char c1,c2,buf[20]; //buf-указатель на тип char

char *pc;

char *pst="\"slovo\"";//Объявление указателей на тип char

int *pi= &a;

float *pf, f=26.6; //Объявление указателя на тип float

double *pd, d; //Объявление указателя на тип double

double &sd= d; //Объявление ccылки на тип double

void *pv; //Объявление указателя на тип void

char *pchar=(char *)malloc(20);//Выделение памяти в куче

clrscr(); // Объявление функции void *malloc(size_t size);

pc=&c1; pf=&f; pd=&d;

printf(" Ввод переменной c1 типа char: ");

scanf("%c",pc); //Функция ввода данных, & - операция взятия

//адреса отсутствует

printf(" Вывод переменной c1 типа char: ");

printf("%c\n",*pc);

fflush(stdin);

pc=&c2;

printf(" Ввод переменной c2 типа char: ");

scanf("%c",pc); //Функция ввода данных, & - операция взятия

//адреса отсутствует

printf(" Вывод переменной c2 типа char: ");

printf("%c\n",*pc);

printf("\n Ввод переменной (a) типа int: ");

scanf("%d",pi);

a+=5; ++*pi; //Изменение а = а+5+1

printf(" \t Вывод (a) после изменения а=а+5+1\n");

printf(" Формат вывода (int): +6d #6o #8x\n");

printf("\t\t |%+6d|%#6o|%#8x|\n ",a,*pi,*pi);

printf("\n Вывод исходной cтроки: %s\n",pst);

pc=pst;

printf(" Вывод cтроки в цикле:\n");

while(*pc!='\0') { printf(" %s",pc); pc++; }

printf("\n Ввод cтроки в массив: ");

scanf("%s",buf);

pv=buf; //Использование указателя (pv) на тип void

printf(" Вывод cтроки из массива: %s\n",(char *)pv); //pv -void

printf(" Ввод cтроки в динамическую память: ");

scanf("%s",pchar);

printf(" Вывод cтроки из динамической памяти: %s\n",pchar);

printf(" Ввод переменных типа float and double (через пробел):\n");

printf("\t\t ");

scanf("%f %lf",pf,pd);

pv=pf; //Использование указателя (pv) на тип void

*pf=*(float *)pv*10; //f*=10;

*pd=sd+*(float *)pv; //Использование ccылки (sd) на тип double

pv=pd; //d+=f;

printf("\t Вывод результатов расчета f*=10 d+=f\n");

printf(" Формат вывода (float): 10.6f 10.6e +10.6g\n");

printf("\t\t |%10.6f|%10.6e|%+10.6g|\n",f,*pf,*pf);

printf(" Формат вывода (double): 10.8lf 10.8e 10.8g\n");

printf("\t\t |%10.8lf|%10.8e|%+10.8g|\n ",*pd,*(double *)pv,sd);

getche();

return 0;

}

/* Ввод переменной c1 типа char: w

Вывод переменной c1 типа char: w

Ввод переменной c2 типа char: t

Вывод переменной c2 типа char: t

 

Ввод переменной (a) типа int: 40

Вывод (a) после изменения а=а+5+1

Формат вывода (int): +6d #6o #8x

| +46| 056| 0x2e|

 

Вывод исходной cтроки: "slovo"

Вывод cтроки в цикле:

"slovo" slovo" lovo" ovo" vo" o" "

Ввод cтроки в массив: unsigned

Вывод cтроки из массива: unsigned

Ввод cтроки в динамическую память: dinamo

Вывод cтроки из динамической памяти: dinamo

Ввод переменных типа float and double (через пробел):

1.5 20.4

Вывод результатов расчета *pf=*pf*10; *pd=*pd+f;

Формат вывода (float): 10.6f 10.6e +10.6g

| 15.000000|1.500000e+01| +15|

Формат вывода (double): 10.8lf 10.8e 10.8g

|35.40000000|3.54000000e+01| +35.4|

*/

Ход работы

1 Изучить теоретические сведения.

2 В соответствии с индивидуальным заданием разработать алгоритм применения указателей.

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

4 Набрать программу на компьютере и устранить ошибки.

5.Получить результат.

6 Оформить отчет и сделать выводы по работе.

7 Подготовиться к защите лабораторной работы, изучив контрольные вопросы по данной теме.

 

Индивидуальное задание к лабораторной работе №8

Присвоить раз именованному указателю на тип Р1 значение арифметического выражения АВ включающего указатели на типы Р2 и Р3. Арифметическое выражение реализовать в виде функции возвращающей указатель на тип Р1. Вывести на экран значение указателя Р2 и значение на которое он ссылается. Индивидуальные задания взять из таблицы 8.1.

Таблица 8.1 - индивидуальные задания

Вариант Р1 АВ Р2 Р3
  long (1/sin((р2)2))р3 int float
  float (abs(p3))1/p2 long double
  double tan((p3)2)p2/3 int long
  float (ln(p2)p3)p2 char unsigned long int
  long double sin(abs(p3)p2) double long int
  long sin(p2)/tan(p3) int float
  unsigned long int (++p3)/(--p2) short int int
  long double ((1+(++p2))/p3)p2 long int float
  signed long int (sin(--p2)-(p3))p3 char int
  long int (1/sin(p2))p3 unsigned long int int
  double sin(p3)1/p2 double float
  double cos(p2/p3) int double
  int (--p2)+(++p3) unsigned int short int
  signed int (sin(p2)/tan(p3))p3 short int char
  long double ln(--p2)1/p3 float double
  double 1.2*(10-(--p3))+p3 double short int
  double tan((p3)2)p2/3 double float
  float (ln(p2)p3)p2 int double
  long double sin(abs(p3)p2) unsigned int short int
  long double ((1+(++p2))/p3)p2 double long int
  signed long int (sin(--p2)-(p3))p3 int float
  long int (1/sin(p2))p3 short int int
  long double sin(abs(p3)p2) char int
  long sin(p2)/tan(p3) unsigned long int int
  double sin(p3)1/p2 double float
  double cos(p2/p3) int double
  int (--p2)+(++p3) unsigned int short int
  long double ((1+(++p2))/p3)p2 short int char
  signed long int (sin(--p2)-(p3))p3 float double
  long int (1/sin(p2))p3 double short int

 

 

Требования к содержанию отчёта приведены в лабораторной работе №1.

Контрольные вопросы для подготовки и самостоятельной работы

1 Дайте определение указателю.

2 Какой синтаксис объявления указателя?

3 С какими модификаторами может быть использован указатель?

4 Чем отличается (*) в объявлении указателя и в выражении, где он используется?

5 Что такое операция обращения по адресу?

6 Что такое операция взятия адреса?

7 Как бы Вы присвоили адрес переменной с плавающей точкой salary указателю с именем pt_sal?

8 Обязательно ли инициализировать указатель при его объявлении?

9 В чём особенности использования указателя на тип void?

10 Для чего применяется константа NULL?

11 Что такое динамическое выделение памяти, где она выделяется и с помощью каких функций?

12 Можно ли присваивать указатели одного типа?

13 Как осуществить приведение типа указателя?

14 Объясните примеры, приведенные в теоретической части.

Лабораторная работа №9

Массивы. Селективная обработка массивов

(2 часа)

Цель работы: изучить работу с массивом как с составным типом данных, приёмы ввода и вывода данных, обработку одномерных массивов.

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

Массив - это набор объектов (элементов) одинакового типа, доступ к которым осуществляется прямо по индексу в массиве. Обращение к массивам в С реализовано с помощью указателей (pointers).

Массив в С можно объявить следующим образом:

[Класс_памяти>] <Тип_данных> <Имя_массива> [<Размер_массива>];

<Размер_массива> может быть задан константным выражением.

Доступ к элементам массива происходит следующим образом:

<Имя_массива>[<Значение_индекса>], т.е., используя имя массива и индекс от 0 до (<Размер_массива> -1), т.е. на единицу меньше, чем < Размер_массива>.

Пример объявления массива:

char name[20];

int grad[125];

float b[30];

Массив имеет имя (name), которое является указателем на тип элементов массива и адресует первый элемент с индексом (Æ). Имя массива фактически является константным указателем, ссылающимся на начальный адрес данных, с которого расположен сам массив и может быть использовано как указатель. Обращение к элементам может осуществляться следующим образом name[0] -1-ый элемент массива, name[1]- 2-ой элемент, name[19] – последний 20-ый элемент.

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

(sizeof(тип)*<Размер_массива>) байтов.

Массив размещается последовательно в памяти, т.е. каждая следующая ячейка расположена сразу после предыдущей.

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

for(i=0; i<rasm; i++) mas2[i] = mas1[i];

где rasm - размер массивов, соответствующий указанному в их объявлении

# define rasm 20

int mas2[rasm], mas1[rasm];

Пример

 

/* ЗАНЯТИЕ N 9

Выполнил студент группы......... Петров Ю.В.

Применение массивов при работе с переменными

различных типов (int,float), изменение значений

переменных. Примеры приемов работы с массивами */

 

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#define N 15

#define M 10

int p[N], x[N], i, j, j1, count=0;

int y[N*2], z[N]={15,37,10,-20,-10,25,27,30,89,67,\

24,-6,22};

int *pi=y; //Два последних элемента z[N] равны 0

float *pf, mf[N];

void main()

{ clrscr(); randomize();

pf=mf;

printf("Исходный массив p[]: \n");

for (i=0;i<N;i++)

{ p[i]=random(81)-40; //Инициализация с помощью функции

printf("%4d",p[i]); //random() в интервале +40...-40

if (p[i]>0) //Выбор элементов >0 в массив х[]

{ x[count]=p[i];

mf[count]=x[count]/5.5;

count++;

}

}

printf("\n");

printf("Исходный массив z[j]: \n");

for (i=0;i<N;i++) printf("%4d",z[i]);

printf("\nРабочий массив x[count]>0 из p[i]: \n");

for (i=0;i<count;i++) printf("%4d",x[i]);

j=0;//Выбор элементов в массив у[] из z[] и р[] по условиям

for (i=0;i<N;i++)

{if (z[i]>=-M && z[i]<=(M+N) && (z[i]%2==0))

{ *pi = z[i]; pi++; j++;}

if (p[i]>=-M && p[i]<=(M+N) && (p[i]%2==0))

{ *(y+j)=p[i]; pi++; j++;}

}

j1=j;

printf("\nРабочий массив y[j] из z[i] и р[i] по условиям \n");

printf(" -M<y[j]<(M+N) и четное:\n");

for (i=0;i<j1;i++) printf("%4d",y[i]);

printf("\nРабочий массив mf[j]=x[j]/5.5 \n");

for (i=0;i<count;i++) printf("%6.4f ",*(pf+i));

//Сортировка массива x[]

for (i=0;i<count;i++)

for (j=i;j<count;j++)

if (x[i]<x[j])

{int c=x[i];x[i]=x[j];x[j]=c;

}

else continue;

//Сортировка массива у[]

for (i=0;i<j1;i++)

for (j=i;j<j1;j++)

if (y[i]<y[j])

{int c=y[i];y[i]=y[j];y[j]=c;

}

else continue;

printf("\nСортированный массив x[]: \n");

for (i=0;i<count;i++)

printf("%4d",x[i]);

printf("\nСортированный массив y[]: \n");

for (i=0;i<j1;i++)

printf("%4d",y[i]);

getch();

}

/*

Исходный массив p[]:

32 37 -34 11 30 8 -11 -38 6 -21 -27 -23 -30 -19 -29

Исходный массив z[j]:

15 37 10 -20 -10 25 27 30 89 67 24 -6 22 0 0

Рабочий массив x[count]>0 из p[i]:

32 37 11 30 8 6

Рабочий массив y[j] из z[i] и р[i] по условиям

-M<y[j]<(M+N) и четное:

10 -10 8 6 24 -6 22 0 0

Рабочий массив mf[j]=x[j]/5.5

5.8182 6.7273 2.0000 5.4545 1.4545 1.0909

Сортированный массив x[]:

37 32 30 11 8 6

Сортированный массив y[]:

24 22 10 8 6 0 0 -6 -10 */

 

Ход работы

1 Изучить теоретические сведения.

2 В соответствии с индивидуальным заданием разработать алгоритм инициализации массива, селективной обработки массива.

3 Разработать и набрать программу, отладить её на компьютере, изучить работу операторов.

4 Получить результаты.

5 Оформить отчет.

6 Подготовиться к защите лабораторной работы, изучив контрольные вопросы по данной теме.

 

Требования к содержанию отчёта приведены в лабораторной работе №1

 

Индивидуальное задание к лабораторной работе №9

Составить программу для обработки массива согласно индивидуальному заданию приведенному в таблице 9.1.

Таблица 9.1 - индивидуальное задание

Вар. Условие задачи
  Найти сумму четных чисел массива
  Вычислить произведение отрицательных чисел массива
  Определить количество нечетных чисел массива
  Найти сумму отрицательных чисел массива
  Определить количество отрицательных чисел массива
  Вычислить произведение положительных чисел массива
  Найти сумму положительных чисел массива
  Определить количество четных чисел массива
  Вычислить произведение четных чисел массива
  Найти сумму нечетных чисел массива
  Определить количество кратных 3 чисел массива
  Вычислить произведение нечетных чисел массива
  Найти сумму кратных 3 чисел массива
  Определить количество не кратных 3 чисел массива
  Вычислить произведение кратных 3 чисел массива
  Найти сумму не кратных 3 чисел массива
  Определить количество кратных 4 чисел массива
  Вычислить произведение не кратных 3 чисел массива
  Найти сумму кратных 4 чисел массива
  Определить количество не кратных 4 чисел массива
  Вычислить произведение кратных 4 чисел массива
  Найти сумму не кратных 4 чисел массива
  Определить количество кратных 5 чисел массива
  Вычислить произведение не кратных 4 чисел массива
  Найти сумму кратных 5 чисел массива
  Вычислить среднее арифметическое положительных четных элементов массива
  Найти среднее геометрическое отрицательных нечетных элементов массива
  Найти произведение отрицательных не кратных пяти элементов массива
  Найти среднее арифметическое элементов массива, находящихся в интервале [-10,20]
  Найти среднее геометрическое элементов массива, находящихся в интервале [5,20]

 

Контрольные вопросы для подготовки и самостоятельной работы

1 С какого числа начинается индексация массивов в языке С?

2 Как объявляется 1-но мерный массив?

3 Какие типы языка С можно и нельзя указывать в качестве типа при объявлении массива?

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

5 Какой тип имеет имя массива?

6 Как осуществляется инициализация элементов массива?

7 Как можно инициализировать массив с элементами типа char?

8 Можно ли использовать средство typedef для объявления типа “массив”?

9 Какие альтернативные формы записи элементов массива можно использовать? Приведите примеры.

10 Каковы правила использования индексных выражений?

11 Существуют ли операции работы с массивами?

12 Какие классы памяти можно использовать при объявлении массивов?

Лабораторная работа №10

Формирование рабочих массивов с помощью
операций селекции исходного массива

(2 часа)

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

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

Смотри теоретические сведения по предыдущей работе.

Пример

/* ЗАНЯТИЕ N 10

Разработал Петров Ю.В.

Объявить массивы заданной размерности, выполнить их

инициализацию с применением функции random() и явно.

Получить доступ к элементам массивов с использованием

операторов организации цикла. Переписать положительные

элементы массива x[1],x[2],...,x[N] в массив y[t], а

отрицательные - в массив z[p]. Элементы в массивах y[t]

и z[p] располагать подряд, элементы массива y1[t]

рассчитать для положительных x[i] по формуле

y1[t]=y1[t]+2*exp(b*y[t]-y[t]*y[t]),где b=N/5 */

 

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#include <math.h>

# define N 20

main()

{ clrscr();

randomize();

int i,t=0,p=0,b=N/5;

int x[N],y[N],z[N]; //Объявление одномерного массива (вектора)

float y1[N]={2.3,3.4,4.0,5.2,6.6,7.9,8.34,9.8,10.4,11.2,\

10.1,9.9,8.7,7.5}; //Инициализация первых 14, остальные -0

printf("\nВывод элементов исходного массива y1[ ]\n");

for(i=0;i<N;i++)

{printf(" y1[%2d]=%4.1f",i+1,y1[i]);

if ((i+1)%5==0) printf("\n");

}

printf("\nИнициализация одномерного массива x[N]\n");

for(i=0;i<N;i++)

{ x[i]=random(40)-20;

printf(" x[%2d]=%2d ",i+1,x[i]); //Вывод элементов

if ((i+1)%5==0) printf("\n"); //массива x[ ]

if (x[i]>=0) //Выбор положительных значений

{ y[t]=x[i]; //Расчет элементов массива y1[ ]

y1[t]=y1[t]+2*exp(b*y[t]-y[t]*y[t]); t++;

}

else {z[p]=x[i]; p++;} //Выбор отрицательных значений

}

printf("\nВывод элементов массива y[ ]>0\n");

i=0;

while (i<t)

{ printf(" y[%2d]=%2d ",i+1,y[i]);

if ((i+1)%5==0) printf("\n");

i++;

}

printf("\n");

printf("\nВывод элементов массива y1[ ] после расчета\n");

i=0;

do

{ printf(" y1[%2d]=%3.2f",i+1,y1[i]);

if ((i+1)%5==0) printf("\n");

i++;

} while (i<t);

printf("\n");

printf("\nВывод элементов массива z[ ]<0\n");

for(i=0;i<p;i++)

{ printf(" z[%2d]=%2d ",i+1,z[i]);

if ((i+1)%5==0) printf("\n");

}

getch();

return 1;

}

/* Вывод элементов исходного массива y1[ ]

y1[ 1]= 2.3 y1[ 2]= 3.4 y1[ 3]= 4.0 y1[ 4]= 5.2 y1[ 5]= 6.6

y1[ 6]= 7.9 y1[ 7]= 8.3 y1[ 8]= 9.8 y1[ 9]=10.4 y1[10]=11.2

y1[11]=10.1 y1[12]= 9.9 y1[13]= 8.7 y1[14]= 7.5 y1[15]= 0.0

y1[16]= 0.0 y1[17]= 0.0 y1[18]= 0.0 y1[19]= 0.0 y1[20]= 0.0

 

Инициализация одномерного массива x[N]

x[ 1]= 8 x[ 2]= 10 x[ 3]=- 7 x[ 4]= 13 x[ 5]=- 1

x[ 6]=-14 x[ 7]= 5 x[ 8]= 17 x[ 9]=-14 x[10]=-19

x[11]= 13 x[12]= 8 x[13]=-10 x[14]=-16 x[15]= 5

x[16]= 9 x[17]=-11 x[18]=-12 x[19]=-16 x[20]=- 3

 

Вывод элементов массива y[ ]>0

y[1]= 8 y[2]=10 y[3]=13 y[4]= 5 y[5]=17

y[6]=13 y[7]= 8 y[8]= 5 y[9]= 9

 

Вывод элементов массива y1[ ] после расчета

y1[1]=2.30 y1[2]=3.40 y1[3]=4.00 y1[4]=5.21 y1[5]=6.60

y1[6]=7.90 y1[7]=8.34 y1[8]=9.81 y1[9]=10.40

 

Вывод элементов массива z[ ]<0

z[ 1]=- 7 z[ 2]=- 1 z[ 3]=-14 z[ 4]=-14 z[ 5]=-19

z[ 6]=-10 z[ 7]=-16 z[ 8]=-11 z[ 9]=-12 z[10]=-16

z[11]=- 3 */

Ход работы

1 Изучить теоретические сведения

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

3 Разработать программу, набрать и отладить программу на компьютере.

4 Изучить работу операторов.

5 Получить результаты.

6 Оформить отчет.

7 Подготовиться к защите лабораторной работы, изучив контрольные вопросы по данной теме.

 

Требования к содержанию отчёта приведены в лабораторной работе №1.

 

Индивидуальное задание к лабораторной работе №10

Составить программу для обработки массивов согласно индивидуальному заданию приведенному в таблице 10.1.

 

Таблица 10.1 - Индивидуальное задание

Вар. Условие задачи
  Дан массив X(15). Сформировать новый массив из четных чисел исходного
  Дан массив X(25). Сформировать новый массив из нечетных чисел исходного
  Дан массив D(15). Сформировать новый массив из кратных 3 чисел исходного
  Дан массив A(10). Сформировать новый массив из отрицательных чисел исходного
  Дан массив Z(15). Сформировать новый массив из положительных четных чисел исходного
  Дан массив X(25). Сформировать новый массив из чисел исходного, лежащих в интервале [-3,7]
  Дан массив Y(10). Сформировать новый массив из нечетных положительных чисел исходного
  Дан массив D(12). Сформировать новый массив из положительных кратных 3 чисел исходного
  Дан массив A(8). Сформировать новый массив из отрицательных четных чисел исходного
  Дан массив C(15). Сформировать новый массив из больших 8 чисел исходного
  Дан массив B(21). Сформировать новый массив из кратных 4 чисел исходного
  Дан массив A(12). Сформировать новый массив из отрицательных нечетных чисел исходного
  Дан массив X(8). Сформировать новый массив из отрицательных не кратных 3 чисел исходного
  Дан массив G(9). Сформировать новый массив из четных чисел исходного массива, стоящих на нечетных местах
  Дан массив Y(15). Сформировать новый массив из нечетных, кратных 3 чисел исходного
  Дан массив A(18). Сформировать новый массив из нечетных, кратных 5 чисел исходного
  Дан массив Z (10). Сформировать новый массив из четных чисел исходного, лежащих в интервале [1,12]
  Дан массив A(11). Сформировать новый массив из нечетных чисел исходного, лежащих в интервале [-3,15]
  Дан массив B (10). Сформировать новый массив из номеров отрицательных четных чисел исходного
  Дан массив A(8). Сформировать новый массив из номеров отрицательных нечетных чисел исходного
  Дан массив C(12). Сформировать новый массив из отрицательных чисел исходного, стоящих на четных местах
  Дан массив F(13). Сформировать новый массив из отрицательных чисел исходного, стоящих на нечетных местах
  Дан массив H(12). Сформировать новый массив из положительных чисел исходного, стоящих на четных местах
  Дан массив V(19). Сформировать новый массив из отрицательных чисел исходного, лежащих в диапазоне [-20,-5]
  Дан массив N(11). Сформировать новый массив из отрицательных кратных 5 чисел исходного
  Дан массив K(15). Сформировать новый массив из положительных чисел исходного, стоящих на нечетных местах
  Дан массив Y(11). Сформировать новый массив из отрицательных не кратных 5 чисел исходного
  Дан массив Z(14). Сформировать новый массив из положительных кратных 5 чисел исходного
  Дан массив R(13). Сформировать новый массив из отрицательных кратных 10 чисел исходного
  Дан массив N(11). Сформировать новый массив из отрицательных кратных 8 чисел исходного

 

Контрольные вопросы для подготовки и самостоятельной работы

1 Как производится доступ к элементам массива?

2 Какое количество операторов цикла необходимо для обработки главной или побочной диагонали массива?

3 Какие методы сортировки элементов Вы знаете?

4 Можно ли использовать указатель на тип элементов массива в качестве имени массива и что для этого необходимо?

5 Адрес какого элемента содержит имя массива?

6 Какие классы памяти можно использовать при объявлении массива?

7 Какие классы памяти используются по умолчанию?

8 Как размещаются элементы массива в памяти?

9 Как определяется количество байтов, на которое смещается указатель индексного выражения? Зависит ли смещение указателя от типа элементов массива?

 

 

Лабораторная работа №11

Обработка символьных данных

(2 часа)

Цель работы: изучить и научиться использовать массивы символьных данных.

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

Теоретические сведенья приведены в лабораторных работах N3, N8 и N9.

 

Ход работы

1 Изучить теоретические сведения

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

3 Набрать и отладить программу на компьютере.

4 Изучить работу операторов.

5 Получить результаты.

6 Оформить отчет.

7 Подготовиться к защите лабораторной работы, изучив вопросы по данной теме.

 

Требования к содержанию отчёта приведены в лабораторной работе №1.

 

 

Индивидуальное задание к лабораторной работе №11.

Составить программу для обработки символьных данных согласно индивидуальному заданию приведенному в таблице 11.1.

Таблица 11.1

Вариант Задание
  Ввести с клавиатуры предложение (слова отделенные пробелом). Пометить местами первое и последнее слова.
  Ввести с клавиатуры предложение. Поменять местами четные и нечетные, по порядку слова.
  Ввести с клавиатуры предложение. Произвести перестановку слов в предложении в обратном порядке.
  Ввести с клавиатуры предложение. Произвести перестановку букв в словах в обратном порядке.
  Ввести два предложения. Добавить второе предложение к первому, отделив их пробелом.
  Ввести с клавиатуры предложение. Произвести вставку слова «не» перед каждым третьим словом в предложении.
  Ввести с клавиатуры предложение. Произвести вставку запятой после слов заканчивающихся на «й». Вывести на экран количество таких вставок.
  Ввести с клавиатуры предложение. Произвести вставку запятой перед словами начинающихся с букв «по».
  Ввести с клавиатуры предложение. Слова заканчивающиеся на «ие» удалить.
  Ввести с клавиатуры предложение. В словах заканчивающихся на «е» заменить эту букву на «я».
  Ввести с клавиатуры предложение и слово. Произвести вставку слова между словами предложениями.
  Ввести с клавиатуры предложение. Поменять местами второе и последнее слово.
  Ввести с клавиатуры предложение. Произвести преобразование нижнего регистра в верхний.
  Ввести с клавиатуры предложение. Произвести преобразование из верхнего в нижний.
  Вывести строку с буквами верхнего и нижнего регистра. Произвести инвертирования регистра.
  Ввести с клавиатуры предложение. Произвести перестановку букв в строке согласно таблице.
  Ввести с клавиатуры предложение. Отсортировать слова в предложении в алфавитном порядке.
  Ввести с клавиатуры предложение. Отсортировать слова в предложении по возрастанию.
  Ввести с клавиатуры предложение. Подсчитать количество гласных букв в каждом слове предложения.
  Ввести с клавиатуры предложение. Подсчитать количество согласных букв в каждом втором слове предложения.
  Ввести с клавиатуры предложение. Отсортировать буквы в каждом слове предложения в порядке убывания: букву «а» считая последней, букву «я» считая первой.
  Ввести с клавиатуры предложение. Подсчитать длину каждого слова в предложении. Найти номер самого длинного и самого короткого слова.
  Ввести с клавиатуры предложение. Найти самое длинное и самое короткие слова и поменять их местами.
  Ввести с клавиатуры предложение. Сформировать массив из длин слов в предложении.
  Ввести с клавиатуры предложение. Найти среднюю длину слов в предложении. Вывести на экран самое длинное слово, и самое короткое слово, самое «среднее» слово.
  Ввести с клавиатуры предложение. Произвести упаковку и распаковку предложений (повторяющиеся комбинации символов заменить каким-либо одним символом).
  Вывести два предложения. Соединить предложения и отсортировать слова в порядке обратном алфавитному.
  Ввести с клавиатуры предложение. Разбить предложение на два.

 

Контрольные вопросы для подготовки и самостоятельной работы

1 Укажите способы объявления символьных строк (переменных и констант).

2 Какой символ ставится в конце строки?

3 Сколько памяти занимает один символ строки?

4 Сколько памяти занимает строка (слово) из 6 букв?

5 Можно ли использовать указатели для адресации символьных строк, содержащихся в массивах?

6 Сколько указателей можно использовать для работы с массивами?

7 Какой объект адресуется указателем, смещенным относительно начала строки на n байтов?

8 Какая функция позволяет определить длину строки?

9 Какие операции применимы к указателям и необходимы для работы со строками?

10 Можно ли инициализировать массивы с данными типа char строками символов?

11 Можно ли инициализировать указатели на тип char строками символов?

12 Какие символьные последовательности называют управляющими, что они означают?

Лабораторная работа № 12

Использование библиотечных функций для работы с символьными данными

(2 часа)

Цель работы: выработать практические навыки в написании программ с использованием библиотечных функций для работы с символьными данными.

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

Функции для работы с символьными данными

 

Для работы с символьными данными разработан ряд библиотечных функций. Рассмотрим некоторые из них:

char *strcat(char *dest, const char *src); - добавляет копию строки src в конец dest. Длина результирующей строки равна strlen(dest) + strlen(src).

strcat() - возвращает указатель на результирующую строку.

Функция char *strchr(const char *s, int c); - просматривает строку в прямом направлении для отыскания в ней заданного символа. Функция strchr() ищет первое вхождение символа с в строку s. Символ конца строки считается частью строки, поэтому - strchr(strs, 0) вернет значение указателя на нулевой конечный символ строки strs. Функция strchr() возвращает указатель на первое вхождение символа с в s, если c не обнаружен в s, то strchr() возвращает нуль.

int strcmp(const char *s1, const char *s2); -осуществляет беззнаковое сравнение строк s1 и s2, начиная с первого символа каждой строки, до тех пор, пока очередные соответствующие символы в строках не будут различны или пока не будут достигнуты концы строк. Функция strcmp () возвращает значение:

< 0 если s1 меньше чем s2;

= = 0 если s1 равна s2;

> 0 если s1 больше чем s2.

int strcmpi(const char *s1, const char *s2); -сравнивает одну строку с другой аналогично s trcmp(), но без различия больших и маленьких букв. Функция strcmpi() определена как макрос в string.h и преобразует вызовы strcmpi() к вызовам strcmp(). Макрос обеспечивает совместимость с другими компиляторами С.

int strncmp(const char *s1, const char *s2, size_t maxlen); -сравнивает часть одной строки с частью другой. Функция strncmp() производит такое же беззнаковое сравнение, как и strcmp(), но просматривает не более, чем maxlen символов. Она начинает с первого символа каждой строки и заканчивает, когда очередные символы в строках различны или когда проверено maxlen символов. Функция strncmp () возвращает значение типа int, смысл которого аналогичен strncmp().

char *strcpy(char *dest, const char *src); - копирует строку src в dest, завершая работу после копирования символа окончания строки. Функция strcpy() возвращаетуказатель на результирующую строку (dest).

size_t strcspn(const char *s1, const char *s2); -ищет в строке первый сегмент, не содержащий ни одного символа из заданного набора символов. Функция strcspn() возвращает длину первого встретившегося сегмента строки s1, сост



Поделиться:


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

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