Методичка по С. Методические указания к лабораторному практикуму по дисциплине Программирование на языках высокого уровня (язык Си) москва 2005
Скачать 429.5 Kb.
|
Пример решения задачиЗадача 5. Сформировать стек, содержащий данные о стульях. Удалить из него все стулья, производимые в данном городе. Результат записать в файл. #include #include #include #include #include #define Lmax 20 #define STUL struct stu #define CLR while(fgetc(f)!='\n') STUL {char cvet[Lmax]; int visota; struct{ char city[Lmax],zavod[Lmax],fam[Lmax];} izgot; char mater[Lmax]; STUL *next;//поле указателя на следующую запись }; //формирование стека стульев. На входе - имя входного файла STUL*stack(char name[]) { STUL *tek,*stack=NULL;//изначально список пуст FILE *f; if(!(f=fopen(name,"r"))) puts("Файл не найден"); else { while(!feof(f)) { //выделение памяти для новой записи tek=(STUL*)malloc(sizeof(STUL)); if(fgets(tek->cvet,Lmax,f)) { //другой способ замены '\n' на '\0' tek->cvet[strlen(tek->cvet)-1]='\0'; fscanf(f,"%d",&tek->visota); CLR; fgets(tek->izgot.city,Lmax,f); tek->izgot.city[strlen(tek->izgot.city)-1]='\0'; fgets(tek->izgot.zavod,Lmax,f); tek->izgot.zavod[strlen(tek->izgot.zavod)-1]='\0'; fgets(tek->izgot.fam,Lmax,f); tek->izgot.fam[strlen(tek->izgot.fam)-1]='\0'; fgets(tek->mater,Lmax,f); tek->mater[strlen(tek->mater)-1]='\0'; tek->next=stack; stack=tek; }} free(tek); } return(stack);//возвращается указатель на вершину стека } void vivod(STUL* stack, char name[])//вывод списка в файл {FILE *f2=fopen(name,"w"); if (!stack) {fprintf(f2," список после удаления пуст\n"); } else { fprintf(f2," список после удаления\n"); //вывод списка в файл while(stack!=NULL) { fprintf(f2,"cvet:%s\n",stack->cvet); fprintf(f2,"visota:%d\n",stack->visota); fprintf(f2,"city:%s\n",stack->izgot.city); fprintf(f2,"zavod:%s\n",stack->izgot.zavod); fprintf(f2,"fam:%s\n",stack->izgot.fam); fprintf(f2,"mater:%s\n",stack->mater); stack=stack->next;//движение по списку } } fclose(f2); } STUL* del(STUL* stack)//удаление стульев // Результат – указатель на вершину измененного списка {STUL *tek,*pred;//указатели на текущую и предшествующую запись char gor[Lmax];//заданный город printf("введите город"); gets(gor); tek=pred=stack; while(stack && tek)//пока список не кончился и не удален полностью if(strcmp(gor,tek->izgot.city)==0) { if(tek==stack)//удаление первой записи { stack=stack->next; free(tek); tek=pred=stack; } else //удаление элемента из середины { pred->next=tek->next; free(tek); tek=pred->next; } } else//движение по списку { pred=tek; tek=tek->next; } return(stack); } void main() {STUL *first;//указатель на вершину стека char name1[Lmax],name2[Lmax];//имена входного и выходного файла printf("введите имя входного файла:"); gets(name1); printf("введите имя выходного файла:"); gets(name2); first=stack(name1);//формирование стека if(first!=NULL) { first=del(first);//удаление записей vivod(first,name2);//вывод результата в файл printf("результат находится в файле %s\n",name2); } getch(); } Лабораторная работа 6. "Рекурсия"I. Написать программу, включающую рекурсивную функцию для вычисления: НОД двух неотрицательных целых чисел m и n с использованием второго алгоритма Евклида: НОД двух неотрицательных целых чисел m и n с использованием первого алгоритма Евклида: 3. Биноминального коэффициента С(m,n), где 0 n m по формуле: C(m, 0) = C(n, n) = 1, C(m, n) = C(m - 1, n) + C(m - 1, n - 1) при 0 < n < m. 4. Величины Pow(x,n) для вещественного х 0 и целого n по формуле: 5. Функции Аккермана A(n,m) для неотрицательных целых чисел n и m по формуле: 6. Числа Каталана K(n) для натурального n по формуле: K(1) = K(2) = 1, K(n) = K(n - 1) (4 n - 6) / n , при n 3. 7. Функции F(n) для целого положительного n по формуле: II. Написать программу, которая создает бинарное дерево, состоящее из целых чисел, вводимых с клавиатуры, выполняет преобразования в соответствии с номером задания и печатает все числа исходного и преобразованного бинарного дерева: удаляет из бинарного дерева все числа, меньшие заданного; удаляет из бинарного дерева все числа, равные заданному; находит наиболее часто встречающееся число в бинарном дереве; находит максимальное число в бинарном дереве; удаляет однодетных отцов в бинарном дереве; удаляет листья в бинарном дереве; находит число, ближайшее к среднему арифметическому минимального и максимального чисел в бинарном дереве; формирует новое бинарное дерево, состоящее из листьев исходного дерева; формирует новое бинарное дерево, состоящее из отрицательных чисел исходного дерева. Таблица 3Выбор варианта |