|
Программирование >> Процедурные приложения
stboat stused boat; Доступ к членам структур Доступ к отдельному члену структуры можно получить с помощью оператора точки: имя переменной. член структуры Например, в языке С запросить содержимое поля szmodel описанной выше структуры stused boat можно с помощью следующего выражения: gets(stused boat.szmodel); Вывести полученное значение на экран можно так: printf( %s ,stused boat.szmodel); В C++ применяется аналогичный синтаксис: cin >> stused boat.szmodel; cout << stused boat.szmodel; Создание простейшей структуры В следующем примере используется структура stboat, описание которой мы рассматривали выше. * struct, с * Эта программа на языке С демонстрирует работу со структурой. #include <stdio.h> #define iSTRINGIS 15 #define 1STRING20 20 #define iNULL CHAR 1 struct stboat { char szmodel[iSTRING15 + iNULL CHAR]; char szserial[iSTRING20 + iNULL CHAR]; int iyear; long lmotor hours; float fsaleprice; ) stused boat; int main(void) printf( \nВведите модель судна: ); gets(stused boat.szmodel) ; printf ( \nВведите регистрационный номер судна: )/ gets(stused boat.szserial) ; printf( \nВведите год изготовления судна: ); scanf( %d ,&stused boat.iyear) ; printf( \nВведите число моточасов, наработанных двигателем: ); scanf( %d ,&stused boat.lmotor hours) ; printf( \nВведите стоимость судна: ); scanf( %a ,Sstused boat.fsaleprice); printf( \n\n ); printf( Судно %s %dгода выпуска с регистрационн1м номером #%s,\n , stused boat.szmodel, stused boat.iyear, stused boat.szserial); printf( отработавшее%d моточасов, , stused boat.lmotor hours); printf( былопроданоза$%8.2f.\n , stused boat.fsaleprice); return(0); При выполнении этой программы на экран будет выведена информация примерно следующего содержания: Судно Чайка 1982 года выпуска с регистрационным номером #XA1011, отработавшее 34187 моточасов, было продано за $18132.00. Передача структур в качестве аргументов функции Часто бывает необходимо передать структуру в функцию. При этом аргумент-структура передается по значению, то есть в функции модифицируются лишь копии исходных данных. В прототипе функции следует задать структуру в качестве параметра (в C++ указывать ключевое слово struct необязательно): /* синтаксис объявления функции в С и C++ */ voidvprint data (structstboatstused boat) ; синтаксис, доступный только в C++ voidvprint data (stboatstused boat) ; Следующая программа является модифицированной версией предыдущего примера. В ней структура stused boatпередается в функцию vprint data( ) . * structfn.c * Эта программа на языке С демонстрирует передачу структуры в функцию. #include <stdio.h> #define iSTRINGIS 15 #define iSTRING20 20 #define iNULL CHAR 1 struct stboat ( char szmodel[iSTRING15 + iNULL CHAR] ; char szserial[iSTRING20 + iNULL CHAR] ; int iyear; long lmotor hours; float fsaleprice; void vprint data(struct stboat stused boat); int main(void) { struct stboat stused boat; printf( \nВведите модель судна: ); gets(stused boat.szmodel); \ printf( \nВведите регистрационн1й номер судна: ); gets(stused boat.szserial) ; printf( \nВведите год изготовления судна: ); scanf( %d ,&stused boat.iyear); printf( \nВведите число моточасов, наработанных двигателем: ); scanf( %d ,&stused boat.lmotor hours); printf( \nВведите стоимость судна: ); scanf( %f ,&stused boat.fsaleprice) ; vprint data(stused boat); return(0); void vprint data(struct stboat stused boat) { printf( \n\n ); printf( Судно %s %d года в1пуска с регистрационн1м номером#%s,\n , stused boat.szmodel, stused boat.iyear, stused boat.szserial); printf( отработавшее%d моточасов, , stused boat.lmotor hours); printf( было продано за$%8.2f\n , stused boat.fsaleprice); Массивы структур В следующей программе создается массив структур с информацией о лодках. * structar.c * Эта программа на языке С демонстрирует работу с массивом структур. #include <stdio.h> #define iSTRINGIS 15 #define iSTRING20 20 #define iNULL CHAR 1 #define iMAX BOATS 50 struct stboat { char szmodel[iSTRINGIS + iNULL CHAR]; char szserial[iSTRING20 + iNULL CHAR]; char szcomment[80]; int iyear; long lmotor hours; float fsaleprice; int main (void) int i, iinstock; struct stboat astBoats [ iMAX BOATS ]; printf( Информацию о скольких лодках следует ввести в базу данных? ) ; scanf( %d ,&iinstock) ; for (i =0;i < iinstock; i++) ( flushall(); /* очистка буфера */ printf ( \nВведите модель судна: ) ; gets (astBoats [i]. szmodel) ; printf ( \nВведите регистрационный номер судна: ); gets (astBoats [i]. szserial) ; printf ( \nВведите строку заметок о судне: ); gets (astBoats [i]. szcomment) ; printf ( \nВведите год изготовления судна: ); scanf( %d ,SastBoats [i].iyear) ; printf ( \nВведите число моточасов, наработанных двигателем: ); scanf ( %d ,SastBoats [i] . lmotor hours) ; printf ( \nВведите стоимость судна: ); scanf ( %f ,SastBoatsfi] .fsaleprice) ; printf( \n\n ); for(i=0;i < linstock; i++) { printf( Судно%s %d года в1пуска с регистрационн1м номером#%s,\n ), astBoats[i].szmodel, astBoats[i].iyear, astBoats[i].szserial); printf( отработавшее%d моточасов.\n ), astBoafcs [i].lmotor hours); printf( %s\n ,astBoats[i].szcomment); printf ( ВСЕГО$%8.2f\n\n ,astBoats[i].fsaleprice); } return(0); } В этой программе мы добавили в структуру stboatновую переменную - массив szcomment[80], содержащий строку с краткой характеристикой судна. Использование функции flushall() внутри первого цикла for необходимо, чтобы удалить из входного потока символ новой строки, оставшийся после выполнения предшествующей функции scanf() (либо той, что стоит перед циклом, либо той, что стоит в конце цикла). Вспомните, что функция gets() считывает все символы вплоть до \n. В паре с функцией scanf(), которая оставляет в потоке символ новой строки, следующая за ней функция gets() прочитает пустую строку. Чтобы предотвратить подобный нежелательный ход событий, вызывается функция flushall (), помимо прочего, очищающая буферы всех открытых входных потоков. Вот как примерно будут выглядеть результаты работы программы:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |