Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК_ПВМ.doc
Скачиваний:
5094
Добавлен:
21.02.2016
Размер:
2.79 Mб
Скачать

Другие функции из библиотеки обработки строк. В таблице 8 приведены прототипы и краткое описание остальных функций из библиотеки обработки строк.

Таблица 8 – Другие функции из библиотеки обработки строк

Прототип

Описание функции

int strlen (const char *s)

Определяет длину строки s. Возвращает число символов, предшествующих ограничивающему символу NULL.

char *strlwr (char *s)

Преобразует символы верхнего регистра в символы ниж­него регистра в строке s. Другие символы не затрагиваются. Функ­ция возвращает указатель на строку s.

char *strupr(char *s)

Преобразует символы нижнего регистра в символы верх­него регистра в строке s. Другие символы не затрагиваются. Функ­ция возвращает указатель на строку s.

сhar *strrev(char *s)

Обращает порядок символов в строке s и возвращает указатель на строку s.

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

Пример 1:

main( )

{ staticcharl[ ]=”Сведения о результатах сессии”;

puts(l);

flen(l, 8);

puts(l); }

flen (stroke, size)

char *stroke;

int size;

{ if (strlen(stroka)>size) *(stroke+size)=’\0’; }

Результат:

Сведения о результатах сессии

Сведения

Пример 3:

#include<stdio.h>

#define NAME “Ритчи”

main()

{ char a[20];

puts(“Назовите автора языка Си”);

gets(a);

while (strcmp(a,NAME)!=0)

{ puts(“Ввод следующего варианта”);

gets(a); }

puts(“Ответ принят”); }

Пример 2:

#include <stdio.h>

main()

{ static char name[80];

staticcharstud[ ]= “является студентом факультета ИиВТ”;

puts(“Ведите ваше имя.”);

gets(name);

strcat (name, stud);

puts (name);

puts (stud); }

Результат:

Введите ваше имя

Марат

Марат является студентом факультета ИиВТ

является студентом факультета ИиВТ

#include <stdio.h>

#defineSTROKA“С Новым годом!”

main()

{ static char *ptr=STROKA;

static char res[25];

puts (ptr);

puts (res);

strcpy (res,ptr);

puts (ptr);

puts (res); }

Результат:

С Новым годом!

С Новым годом!

С Новым годом!

Основная литература: 1осн[325-355],2осн[371-405]

Дополнительная литература:9доп[46-51],11доп[13-16]

Контрольные вопросы:

  1. Какие функции используются для обработки строк?

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

  3. Какие функции используются для поиска?

  4. Какой заголовочный файл необходимо подключить для работы с библиотекой обработки строк?

  5. Какие функции используются для изменения регистров?

Тема 11. Структуры данных в Си.

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

struct <rname>

{

<type> <fname>;

…………

<type> <fname>;

}

где rname– имя типа структуры, имя типа структуры можно не указывать, в фигурных скобках приводится список элементов структуры с указанием их типов. После определения структурного шаблона осуществляется определение переменной в следующем виде:

struct <rname> <vnames>;

vnames– имя структурной переменной.

Пример:

struct sved

{

char fam[25];

char adr[20];

int gr;

};

struct sved inf;

Структурный шаблон может приводится как внутри определения функции, так и вне функции. Шаблон, приведенный внутри функции, может использоваться только внутри этой функции. Если структурный шаблон располагается вне функции, то этот шаблон может использоваться всеми функциями программы, следующими за его определением. Например, в другой функции можно определить другую структурную переменную inf1 в видеstructsvedinf1;

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

struct

{

char fam[25];

char adr[20];

int gr;

} inf;

Форму с именем типа структуры обычно используют, если структурный шаблон используется более одного раза.

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

static struct sved inf;

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

static struct sved inf= {“Попов”,

“Сатпаева, 20”,

1978}

Пример: (доступ к элементам структуры)

#include <stdio.h>

main()

{ struct

{ char fam[25];

char adr[20];

int gr;

} inf;

printf(“Введите фамилии : \n”);

gets(inf.fam); /*доступ к элементуfam*/

printf(“Введите адрес: \n”);

gets(inf.adr);

printf(“Введите год рождения : \n”);

scanf(“%d”,&inf.gr);

printf (“%s, %s , %d\n”, inf.fam, inf.adr, inf.gr); }

Массивы структур. При решении задач используются массивы структур, то есть структурная переменная является элементом массива. Описание массивов структур выполняется следующим образом:

struct sved inf[10];

Элементы массива inf[10] являются структурами типаsved.

При определении элементов массивов структур, как и в случае отдельных структур, имя структуры отделяется от имени элемента структуры символом “.”( операция получения элемента). Например :

inf[0].fam– первый элемент массива

inf[1].fam– второй элемент массива

…………………..

inf[9].fam– 10-й элемент массива

(inf[1] – имя структурной переменной)

#include <stdio.h>

#define num 10

struct cved

{ char fam[25];

char adr[20];

int gr; };

main()

{ struct sved inf[num];

int l=0, i;

while (l<num)

{ printf(“Ввод фамилии \n”);

gets (inf[l].fam);

printf(“Адрес: \n”);

gets (inf[l].adr);

printf(“год рождения \n”);

scanf(“%d”, &inf[l].gr);

l++; }

printf(“Сведения о студентах группы \n”);

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

printf(“%s, %s, %d\n”, inf[i].fam, inf[i].adr, inf[i].gr); }

Рассмотрим вложенные структуры

#include<stdio.h>

#define num 5

#define len 15

#define is “Наука”

struct isd

{ char namisd[len];

int godisd; }

struct knig

{ char author[len];

char title[len]

struct isd isdat; }

main()

{ static struct knig masking[num]={{“Петров В.”,

“Информатика”

{“Наука”, 1998}},

{“Савельев В.”,

“Физика”,

{“Наука”,1985}}};

inti;

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

if (masking[i].isdat.nanidd==IS)

printf (“%s %s \n”, masking[i].author, masking[i].title); }

Рассмотрим использование указателя на структуры. Ранее было отмечено, что структуры не могут использоваться в качестве аргумента функции, а использование указателей на структуры дает возможность осуществить доступ к элементам структуры при помощи указателей. Описание указателя приводится ниже ( рассматривается тот же массив структур):

Struct knig *ptrst;

Создан указатель ptrstдля ссылок на любые структуры типаknig.

Имеют место:

Ptrst==&masking[0];

*ptrst==masking[0];

ptrst->author – это эквивалентно masking[0].author.

Если ptrstявляется указателем на структуруmasking[0], то следующие обозначения эквивалентны

Masking[0].author==(*ptrst).author==ptrst->author

Ptrst+1 ссылается наmasking[1] .Необходимо отметить , что в данном примере 1 к указателюptrstприбавляет 47 к адресу, потому, что каждая структура типа ААА занимает 47 байт.

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

struct ZP

{ char *name;

char *mec;

float nach;

float prem; } SOTR={ “Зуев П”,”январь” 1020.45, 250.15 };

main()

{ float s, fadd();

printf(“Зуеву П. за январь всего начислено %6.2а тенге \n“,fadd(&sotr)); }

float fadd (ptrst)

struct zp *ptrst;

{ float s=0;

s=ptrst->nach+ptrst->prem;

return(s); }

Заметим, что применяется операция & для получения адреса структуры. В отличие от имени массива имя структуры само по себе не является синонимом своего адреса. Рассмотрим массив структур. Имя массива является синонимом его адреса, потому его можно передавать функции.

Struct zp

{ char *name;

char *mec;

float nach;

float prem; } sort[6]={ {“Зуев П.”,”январь”, 8020.45, 1250.15},

……………

{“Потапов М.”,”январь”,6000.50, 1500.20} };

main()

{ float ITS, fadd ( );

printf(“Группе сотрудников за январь всего начислено %10.2fтенге \n”,fadd(sort)); }

float fadd (ptrst)

struct zp *ptrst;

{ float ITS;

int i;

for (i=0, ITS=0; i<6; i++; ptrst++)

ITS+=ptrst ->nach+ptrst->prem;

Return(ITS); }

Основная литература: 1осн[393-397],2осн[406-436],3осн[108-128]

Дополнительная литература:9доп[200-209],11доп[13-16]

Контрольные вопросы:

1. Что такое структуры данных?

2. В каких случаях целесообразно использовать вложенные структуры?

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

4. Каков структурный шаблон описания структуры данных?

5. Каким образом осуществляется доступ компонентам структуры данных?