bmstu_iu6_Cpp1 (823967), страница 11
Текст из файла (страница 11)
Параметр ptrptr используется для хранения позиции в строке.// Использование ранее применяемой функции strtok() при параллельном// программировании может приводить к ошибкам9) int atoi(const char *s); // функция возвращает целое число,// в символьном виде записанное в строке s10) double atof(const char *s); //функция возвращает вещественное число// двойной точности, в символьном виде записанное в строке s11) char *itoa(int value,char *s,int radix); // функция// осуществляет преобразование целого числа value в строку s// в соответствии с заданной системой счисления radix (от 2 до 36).12) char *_gcvt(double value, int digits, char *buffer );// функция преобразует число value в строку buffer c учетом параметра// digits, который определяет количество значащих цифр13) char *_ecvt(double value,int count,int *dec,int *sign);// функция преобразует число value в строку buffer c учетом параметров// count – количество цифр,14) char *_fcvt(double value,int count,int *dec,int *sign);// функция преобразует число value в строку результата// count – количество цифр, dec, sign – позиции точки и знака15) int sscanf( const char *buffer, const char *format [, argument ] ...
);// функция для разбора элементов строки buffer по указанному формату16) int sprintf( char *buffer, const char *format [,argument] ... );// функции для формирования строки из элементов по указанному форматуОглавление66Для предотвращения возможной ошибки переполнения буфера в MS Visual C++ 2008добавлены функции strcat_s, strcpy_s, strncpy_s, в которых указывается допустимая длина строки, принимающей результат.Пример 3.3. Разработать программу, которая выделяет слова их исходной строки сиспользованием функции strtok_s().#include <locale.h>#include <stdio.h>#include <conio.h>#include <string.h>int main( void ){// исходная строкаchar string[]="A string\tof ,,tokens\nand some more tokens";// строка разделителейchar seps[] = " ,\t\n", *token, *context;setlocale(0,"russian");token = strtok_s( string,seps,&context);while(token!=NULL){printf("%s ",token);token=strtok_s(NULL,seps,&context);}puts("\nНажмите любую клавишу для завершения...");_getch();return 0;}Результаты:A string of tokens and some more tokensНажмите любую клавишу для завершения…Пример 3.4.
Демонстрация преобразования результатов для вывода.#include <locale.h>#include <stdio.h>#include <conio.h>#include <stdlib.h>int main(int argc, char* argv[])Оглавление67{setlocale(0,"russian");// позиция точки и знакаintdecimal,sign;char*buffer;intprecision = 10;doublesource = 3.1415926535;// точностьbuffer =_ecvt( source, precision, &decimal, &sign );printf ("source: %12.10f\nbuffer: '%s'\ndecimal: %d\nsign: %d\n",source, buffer, decimal, sign );puts("Нажмите любую клавишу для завершения...");_getch();return 0;}Результат работы программы:source: 3,1415926535buffer: '3141592654'decimal: 1sign: 0Нажмите любую клавишу для завершения...Пример 3.5. Составить программу, осуществляющую ввод строк, содержащих имя,фамилию, отчество и год рождения, записанные через пробел.
Каждая введенная строкадолжна преобразовываться в строку, содержащую фамилию, инициалы и возраст в 2010году. Например:Petrov Petr Petrovich 1987 => Petrov P.P. 23#include <string.h>#include <stdlib.h>#include <locale.h>#include <stdio.h>#include <conio.h>int main(int argc, char* argv[]){setlocale(0,"russian");char st[40],strez[40],strab[40],*ptr1,*ptr2,*ptr3;int old;Оглавление68while ( puts("Введите строку или Сtrl-z:"),gets_s(st, sizeof(st)-1)!=NULL){strcpy(strez,st);// копирование st в strezptr1=strchr(strez,' ');// поиск первого пробела*(ptr1+2)='.';// вставка точки после инициалаptr2=strchr(st,' ');// поиск первого пробелаptr2=strchr(ptr2+1,' ');// поиск второго пробелаstrncpy(ptr1+3,ptr2+1,1);// копирование второго инициалаstrncpy(ptr1+4,". \0",3);//вставка ".",пробела и конца строкиptr3=strchr(ptr2+1,' ');// поиск третьего пробелаold=2010-atoi(ptr3+1);// определение возрастаstrcat(strez,itoa(old,strab,10));// добавление возрастаputs(strez);}puts("Нажмите любую клавишу для завершения...");_getch();return 0;}Результаты выполнения программы (вводимые данные выделены полужирным):Введите строку или Сtrl-z:Ivanov Ivan Ivanovich 1958Ivanov I.I.
52Введите строку или Сtrl-z:Petrov Petr Petrovich 1987Petrov P.P. 23Введите строку или Сtrl-z:^ZНажмите любую клавишу для завершения...3.6 СтруктурыИногда, при составлении программ необходимо объединить в единое целое разнородную, но логически связанную информацию. Например, нам необходимо хранить данные библиотечной карточки, содержащей следующую информацию о книге: фамилии иОглавление69инициалы авторов; название книги; место издания; издательство; год издания; количествостраниц. Объединить такую разнородную информацию можно связав ее в структуру.Структура – это набор разнотипных переменных, объединенных общим именем.Объявление структуры создает ее шаблон, который можно использовать при созданиипеременных типа этой структуры.Переменные, входящие в структуру, называются ее членами (элементами или полями). Как правило, все члены структуры логически связаны между собой.Объявление структур может выполнить двумя способами: так как это было предложено делать в Си и с использованием оператора создания нового типа typedef.Объявление структуры по правилам Си:struct [<Имя структуры>] {<Описание полей>} [<Список переменных>];Такое описание структуры позволяет организовать два варианта реализации:а) описание структуры выполняется отдельно от объявления списка переменных,например:struct student{char name[22],family[22];int old;}; // описание структурыstruct student stud1,stud2,*ptrstud; // объявление переменныхб) описание структуры выполняется совместно с объявлением переменных, в этомслучае имя структуре можно не присваивать, например:struct{char name[22], family[22];int old;} stud1, stud2, *ptrstud;2.
Описание структуры средствами С++:typedef struct {<Описание полей>} <Имя типа структуры>;Фактически посредством typedef мы объявляем новый тип данных, например:typedef struct{char name[22],family[22];int old;} student;Оглавление70В данном случае student – это имя нового типа данных. Соответственно возможнообъявление переменных этого типа, например:student stud1,stud[10],*ptrstud; // объявляются: переменная, массив и// указатель типа studentВ последнем случае память под размещение структуры надо запрашивать специально, например:ptrstud=new student;Обращение к элементам структуры выполняется с указанием имени переменной иимени поля:<Имя переменной>.<Имя поля><Имя массива>[<Индекс>].<Имя поля>(*<Имя указателя>).<Имя поля>Примеры:stud1.namestud[i].name(*ptrstud).nameЕсли переменная – указатель, то удобнее использовать сокращенную форму записиобращения к элементу структуры<Имя указателя> -> <Имя поля>, например:ptrstud->nameСтатические и внешние структуры (см.
раздел 4.1.1) при объявлении можно инициализировать. При этом значения полей указываются после символа равенства в фигурныхскобках через запятую, например:static student stud1={″Петр″,″Петров″,18},*ptrstud={″Иван″,″Иванов″,19};Чаще всего структуры используются как элементы массивов. Чтобы объявить массивструктур, необходимо определить тип структуры и объявить массив переменных этоготипа. Как во всех массивах, нумерация элементов массива структур начинается с 0, а переменная, содержит адрес первого элемента массива.Пример 3.6.
Написать программу формирования массива данных об игрушках, содержащих их название, количество и стоимость, и определения товара с наибольшей стоимости (см. рисунок 3.12).toynamecostkolРисунок 3.12 – Структура toyОглавление71#include <locale.h>#include <stdio.h>#include <conio.h>#include <string.h>typedef struct{char name[15]; float cost; int kol;}toy;int main(int argc, char* argv[]){setlocale(0,"russian");toy mas[10];int i,n=-1,k;char st[15];float sumcost=0,maxcost=0,num;st[0]='\0';while( (puts("Введите название или end"), scanf("\n%s",st),strcmp(st,"end")!=0)&&(n<9) ){n++;strcpy(mas[n].name,st);printf("Введите стоимость и количество:");scanf("%f %d",&mas[n].cost,&mas[n].kol);}puts("=======puts(" NСписок товаров======");Название Стоимость Количество");puts("==================================");for(i=0;i<=n;i++){printf("%3dprintf(" %9.2f%10s",i+1,mas[i].name);%5d\n",mas[i].cost,mas[i].kol);sumcost=mas[i].cost*mas[i].kol;// определение суммыif (sumcost>maxcost){maxcost=sumcost;// определение максимальной стоимости товараОглавление72strcpy(st,mas[i].name);// сохранение названия товара}}printf("Товар %10s имеет максимальную стоимость= %8.3f\n",st,maxcost);puts("Нажмите любую клавишу для завершения...");_getch();return 0;}Результат работы программы (вводимые данные выделены полужирно):Введите название или endKuklaВведите стоимость и количество: 256 23Введите название или endMishkaВведите стоимость и количество: 400 20Введите название или endend=======NСписок товаров======Название Стоимость Количество==================================1Kukla256,00232Mishka400,0020ТоварMishka имеет максимальную стоимость 8000,000Нажмите любую клавишу для завершения...Поля структуры могут быть не только скалярными, но и структурными.