Методичка по С. Методические указания к лабораторному практикуму по дисциплине Программирование на языках высокого уровня (язык Си) москва 2005
Скачать 429.5 Kb.
|
Примеры решения задачЗадача 4.1. Дан массив телевизоров. Найти названия городов, в которых выпускаются самые дешевые телевизоры. #include #include #include //пропуск символов до конца строки #define CLR while (getchar()!='\n') //максимальное число структур #define Kmax 10 //максимальная длина строки #define Lmax 81 #define TV struct tv #define PROIZV struct proizv PROIZV { char gorod[Lmax], zavod[Lmax], fam[Lmax]; }; TV { char name[Lmax], color; PROIZV pr; int price, diag; }; void input (TV *tv, int *k) //ввод массива телевизоров { int i; do { printf("Введите количество телевизоров "); scanf("%d", k);//k – указатель на количество структур } while (*k<=0 || *k>Kmax); CLR; //необходим пропуск символов до конца строки, т.к. дальше //функция gets - читается строка for (i=0; i<*k; i++) { printf("Телевизор # %d\n", i+1); printf("Название: "); gets(tv[i].name); printf("Цена: "); scanf("%d", &tv[i].price); printf("Размер по диагонали: "); scanf("%d", &tv[i].diag); CLR;//цветной или ч\б обозначается одной буквой (ц или ч) printf("Цвет изображения: "); tv[i].color=getchar(); CLR;//пропуск символа ‘\n’ printf("Город: "); gets(tv[i].pr.gorod); printf("Завод: "); gets(tv[i].pr.zavod); printf("Фамилия: "); gets(tv[i].pr.fam); printf("\n"); } printf("Ввод телевизоров окончен\n"); getch(); } //вывод массива телевизоров void output (TV *tv, int k) { int i; clrscr(); printf("Были введены телевизоры: \n"); for (i=0; i { printf("Телевизор # %d\n", i+1); printf("Название: %s\n", tv[i].name); printf("Цена: %d\n", tv[i].price); printf("Размер по диагонали: %d\n", tv[i].diag); printf("Цветной или ч\б: %c\n", tv[i].color); printf("Город: %s\n", tv[i].pr.gorod); printf("Завод: %s\n", tv[i].pr.zavod); printf("Фамилия: %s\n", tv[i].pr.fam); printf("Нажмите любую клавишу для продолжения просмотра\n"); getch();//ожидание нажатия клавиши } clrscr(); printf("Вывод закончен\n"); printf("Нажмите любую клавишу\n"); getch(); } //формирование массива городов (города в массиве не повторяются) void search (TV *tv, char goroda[][Lmax], int k, int *kg) { int min=32767, i, j; for (i=0; i<k; i++)//поиск телевизора с минимальной ценой if (tv[i].price //формирование массива городов for (i=0; i if (tv[i].price==min)//если цена совпадает с минимальной { //проверка отсутствия города в массиве городов for (j=0; j<*kg && strcmp(tv[i].pr.gorod, goroda[j]); j++); if (j==*kg) //если отсутствует, запишем город в массив strcpy(goroda[(*kg)++], tv[i].pr.gorod); } } void main() { TV tv[Kmax]; int k, kg=0, i; char goroda[Kmax][Lmax]; clrscr(); input(tv, &k);//ввод массива телевизоров output(tv, k);//вывод массива телевизоров на экран search(tv, goroda, k, &kg);//формирование массива городов clrscr(); printf("Получено %d городов, в которых производятся самые дешевые телевизоры:\n",kg); for (i=0; i puts(goroda[i]); getch(); } Задача 4.2. Модифицировать программу таким образом, чтобы она вводила структуры из текстового файла и записывала результаты в файл. В решении данной задачи приведены те описания данных и функции, которые будут отличаться от предыдущей задачи. На месте остальных функций расположены комментарии. #include #include #include //пропуск символов до конца строки в файле #define FCLR while (getc(fin)!='\n') //замена символа '\n' на '\0' void zamena(char *str) { char *s;//указатель на текущий символ s=str; while (*s!='\n') s++; *s='\0'; } void input (TV *tv, int *k)//чтение данных из файла { char *s; int i; FILE *fin; printf("Введите имя входного файла: "); gets(s); fin=fopen(s, "r"); if (fin==NULL) { printf ("Нет такого файла\n"); getch(); } else {//на первой строке в файле расположено число структур fscanf(fin, "%d", k); FCLR; //пропуск символов до конца строки файла for (i=0; i<*k; i++) {//каждое поле структуры занимает в файле отдельную строку fgets(tv[i].name, Lmax, fin); zamena(tv[i].name); fscanf(fin, "%d", &tv[i].price); fscanf(fin, "%d", &tv[i].diag); FCLR; tv[i].color=fgetc(fin); fgets(s, Lmax, fin); fgets(tv[i].pr.gorod, Lmax, fin); zamena(tv[i].pr.gorod); fgets(tv[i].pr.zavod, Lmax, fin); zamena(tv[i].pr.zavod); fgets(tv[i].pr.fam, Lmax, fin); } fclose(fin); } } // вывод данных на экран и формирование массива городов- аналогично //предыдущей задаче void main() { TV tv[Kmax]; int k, kg=0, i; char goroda[Kmax][Lmax]; FILE *fout; clrscr(); input(tv, &k);//ввод массива структур из файла output(tv, k);//вывод массива структур на экран search(tv, goroda, k, &kg);//поиск городов clrscr(); //вывод результата на экран и в файл fout=fopen("result.txt", "w"); printf("Город(а), в которых производятся самые дешевые телевизоры:\n"); fprintf(fout, "Получено %d городов, в которых производятся самые дешевые телевизоры:\n",kg); for (i=0; i { puts(goroda[i]); fprintf(fout, "%s\n", goroda[i]); } fclose(fout); puts("Результат записан в файл result.txt"); getch(); } Лабораторная работа 5. "Списки. Динамические переменные"Написать программу, которая вводит из файла структуры вида: р азмещает их в стеке; очереди; реализованном(ой) с помощью линейного списка; циклического списка; двунаправленного линейного списка; двунаправленного циклического списка; и выполняет следующие действия: удаляет из списка стулья заданного цвета; удаляет из списка стулья из заданного материала; удаляет из списка все стулья, расположенные между первым и последним стулом заданного цвета; удаляет из списка стул из заданного материала с максимальной высотой; вставляет в список новый стул после первого стула из заданного материала; вставляет в список новый стул перед первым стулом заданного цвета; вставляет в список новый стул перед самым низким стулом; Результат (содержимое стека или очереди) выводится в файл. Таблица 2Выбор варианта |