Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основы программирования на языке С. Учебное пособие

.pdf
Скачиваний:
1
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
5. Определить рекурсивную функцию, которая возвращает фактори-
ал целого неотрицательного числа. Написать программу, вычисляющую
2
)!(
a
по заданным a и b.
)!1()!(
ab
6. Определить рекурсивную функцию, вычисляющую число сочета-
ний
k
C , используя соотношение
n
k
k
n
n
111
k
.
CCC
n
7. Определить рекурсивную функцию, которая возвращает n–ое чис-
ло Фибоначчи. Числа Фибоначчи вычисляются следующим образом:
krrrrr
1221
kkk
.
,...4,3,,1
8. Определить рекурсивную функцию, которая вычисляет сумму
цифр натурального числа.
9. Определить рекурсивную функцию, выводящую на экран цифры
целого положительного числа.
10. Определить рекурсивную функцию, которая находит корень
уравнения f(x)=0 на заданном интервале [a,b] c заданной точностью . Ко­рень ищется методом деления отрезка пополам по следующему алгоритму. Первоначально предполагается, что f(a)f(b)<0.
а) вычисляются f(а), f(b); б
) вычисляется c=(a+b)/2 и f(c);
в) если f(a)f(c)>0, то а=c, в противном случае b=c; г) если b–a>, то перейти к шагу 2, иначе любой из концов отрезка
может быть использован в качестве корня уравнения.
11. Определить рекурсивную функцию, выводящее в экран двоичное
представление заданного десятичного числа.
12. Определить рекурсивную функцию, возвращающую максималь-
ное из n чисел.
Задание
18. Использование библиотечных функций string.h
1. Дана текстовая строка. Вывести на печать все ее слова в таком по­рядке: все однобуквенные, потом все двухбуквенные, потом все трехбуквен­ные и т.д. до слова максимальной длины, используя функции strtok, strlen.
2. Даны текстовая строка и слово (например, ba). Напечатать все слова, входящие в эту текстовую строку,
начинающиеся с букв заданного
слова (например, bak, barber, baab, baalam), используя функции strtok,
strlen, strnicmp.
3. Дана текстовая строка. Сформировать строку, состоящую из по­следних букв слов заданной текстовой строки, используя функции strtok, strlen и вывести ее на экран. Например, если задана строка adcd ef ghi jklmn, то на экран должно быть выведено слово dfin.
4. Даны текстовая строка и слово (
например, ab). Напечатать все слова, входящие в эту текстовую строку, заканчивающиеся на буквы заданного сло­ва (например, abcdab, ab, kab), используя функции strtok, strlen, strcmp.
61
5. Даны текстовая строка и слово. Определить, какие слова из этой
текстовой строки предшествуют заданному слову в лексикографическом порядке, используя функции strtok, strcmp.
6. Дан набор слов и произвольная текстовая строка. Выбрать из тек­стовой строки все слова, входящие в данный набор и вывести их на печать, используя функции strtok, strcmp.
7. Дана текстовая строка. Определить,
упорядочены ли ее слова по
алфавиту, указать первое слово, нарушающее порядок, используя функции
strtok, strcmp.
8. Из заданной текстовой строки распечатать только те слова, кото­рые начинаются и оканчиваются одной и тоже буквой, используя функции strtok, strlen.
9. Из заданной строки, распечатать все слова без повторений, ис­пользуя функции strtok, strcmp.
10. Дана текстовая строка. Сформировать строку,
состоящую из тре-
тьих букв каждого слова заданной текстовой строки, используя функции
strtok, strlen, и вывести ее на экран. Например, если задана строка adcd ef ghi jklmno, то на экран должно быть выведено слово сil.
11. Дана текстовая строка. Распечатать строку, состоящую из слов заданной, расположенных в лексикографическом порядке, используя функции strtok, strlen, strnicmp.
12. Дана текстовая строка.
Распечатать из нее все слова, имеющие
наименьшую и наибольшую длину, используя функции strtok, strlen.
Задание19.Использованиебиблиотечныхфункцийstdio.h
1. Дан текстовый фал, содержащий целые числа, разделенные пробе­лами. Определить является ли последовательность чисел, находящихся в файле, упорядоченной. В новый файл вывести сообщение о том, являют­ся ли последовательность чисел в данном файле упорядоченной по
убыва­нию или по возрастанию либо не упорядоченной, а также – среднее ариф­метическое всех чисел.
2. Дан файл, содержащий несколько строк. В новый файл переписать строки данного, вставляя символ ‘!’ после каждой строки, содержащей не более n символов. Если строка заканчивается знаком препинания заменить его на символ ‘!’.
3. Дан файл, содержащий несколько строк.
Найти максималь­ную длину строки и вывести в новый файл все строки, имеющую такую длину.
4. Дан файл, содержащий несколько строк (причем строки не содер­жат пробелов). В новый файл записать строки данного, вставляя пробелы так, чтобы каждая строка имела длину 80 символов (пробелы должны быть расставлены равномерно).
62
5. Дан текстовый файл. Осуществить посимвольную чередующуюся
печать файла в прямом и обратном направлении в новый файл. Например, если в файле было слово ЛУНА, то в результирующем файле должно быть слов ЛАУННУАЛ.
6. В исходном файле находится текст программы на языке С. Со-
здать файл, в который переписать содержимое исходного файла без
одно-
строчных комментариев.
7. Подсчитать количество пустых строк в текстовом файле. Вывести
номера этих строк в новый файл.
8. Дан текстовый файл. Переписать его содержимое в новый файл, разбив строки таким образом, чтобы каждая строка либо оканчивалась точкой, либо содержала 40 литер, если среди них нет точки.
9. В текстовом файле подсчитать количество
строк, которые начи-
наются и оканчиваются одной и той же буквой, вывести эти строки их ко­личество в новый файл.
10. Дано два текстовых файла. Сравнить их содержимое и в новый файл записать либо номер первой строки, в которой они различаются, либо сообщение о том, что файлы идентичны.
11. Если в
текущем каталоге имеется файл, tabl_umn.txt, то вывести на экран его содержимое. Если нет, то создать такой файл и записать туда таблицу умножения для чисел от 2 до 9.
12. Дан текстовый файл. Переписать его содержимое в новый файл, разбив строки таким образом, чтобы каждая строка имела n сим­волов. Если в последней строке меньше,
чем n символов, дополнить ее
символами ‘!’.
63
8. СТРУКТУРЫ
Для хранения совокупности однотипных данных в программах ис­пользуют массивы. Предположим, что в программе необходимо хранить данные о книге: автор, название, год издания, количество страниц и т.д. Очевидно, что это разнотипные данные, следовательно, массив для их хра­нения невозможно использовать. Если в программе требуется работать с такими данными
, т.е. данными, имеющими разный тип, но рассматрива­емыми как единое целое, то используют тип данных, называемый в языке С, структурой. Во многих языках программирования такой тип данных называют записью.
Структура – это поименованная совокупность поименованных эле­ментов, имеющих в общем случае разный тип, и расположенных в памяти компьютера последовательно. Каждая
структура включает в себя один или несколько объектов, называемых элементами структуры. Элементы струк­туры также называют полями структуры.
Формат описания структуры в языке С:
struct [имя типа] { тип1 имя_элемента1; тип2 имя_элемента 2; … тип n имя_элемента n; }[список определителей];
Элементы структуры могут иметь любой тип, кроме типа этой же
структуры.
Например, опишем структуру с тремя полями:
struct student { char fio[30]; int group; int mark; } s1, *s2;
Такое определение вводит новый тип данных student, который может быть использован при определении программных объектов. Например, со­здадим структурированный объект и массив структурированных объектов.
student s3,s4[10];
Структурированные объекты можно определять сразу после описа­ния структуры – в списке определений. В нашем случае в списке опреде­лений определен объект s1, и указатель на структурированный объект s2.
Для обращения к объектам, входящим в качестве элементов в кон­кретную структуру, обычно используют уточненные имена, то есть кон­струкцию вида
имя_структуры.имя_элемента_структуры
Например,
64
s1.group= 121; s1.mark=5;
Если определен указатель на структуру, то для обращения к элемен­там структуры можно использовать операцию выбора компонентов струк­турного объекта →
имя указателя→имя элемента структуры
Например,
student *st;
st→group= 222; //это равносильно (*st).group=222;
Инициализировать конкретную структуру можно только при описа­нии перечислением ее элементов в скобках {} в порядке их описания, например
student s4= {“Fedorov”, 122, 4};
Для переменных одного и того же структурного типа определена операция присваивания, то есть поэлементное копирование, например
s3=s1;
Часто в качестве поля структуры используют объединения. Объеди­нение представляет собой частный случай структуры, все поля которой
располагаются по одному и тому же адресу. Формат описания такой же, но используются ключевое слово union. Размер объединения
равен наиболь-
шему размеру из его полей.
Основное достоинство объединения – возможность разных трактовок одного и того же содержимого участка памяти.
Например,
union
{
float a;
unsigned int b;
}ab;
Если ввести ab.a=3.78, то затем можно рассматривать код его пред­ставления как беззнаковое целое: printf(“%d”, ab.b);
Основное назначение объединения – обеспечить возможность досту­па к одному и тому же участку памяти с помощью объектов разных типов.
Пример. Описать структуру СОТРУДНИК с полями ФАМИЛИЯ, ГОД_РОЖДЕНИЯ, ПОЛ. Для женщин – указывать количество детей, для мужчин – отношение
к военной службе. Ввести данные о сотруднике и вы-
вести их на экран.
#include <stdio.h>
# include <conio.h>
void main ()
{
enum sextype {male, female};
enum ranktype {not,soldier,officier};
struct
{
65
char fio[40]; int year; sextype sex; union { int children; ranktype rang; }; }s1; printf ("Enter fio: "); gets(s1.fio); printf ("\nEnter sex (0-mail, 1-female): "); scanf("%d",&s1.sex); switch(s1.sex) { case male: { printf("\nEnter rank (0 - not, 1 -
soldier, 2- officier):");
scanf("%d",&s1.rang); printf(s1.fio); printf(", male, rank=%d",s1.rang); break; } case female:{printf("Enter number of children "); scanf("%d",&s1.children); printf(s1.fio); printf( ", female, children
=%d",s1.children);
break; } } getch(); }
Рассмотрим, каким образом на практике можно организовать работу
с элементами структур.
Пример. Ввести структуру ДАТА с полями ЧИСЛО, МЕСЯЦ, ГОД.
Составить и протестировать функции
– ввода и вывода на экран даты; – вычисляющую порядковый номер дня в году по введенной дате; – находящую в массиве введенных дат самую раннюю (количество
элементов в
массиве N≤20).
Для решения данной задачи необходимо, прежде всего, определить саму стуртуру с заданными полями. В нашем примере создана структура, которая имеет имя date и три поля типа int.
struct date
{
int day;
int month;
int year;
};
66
Для организации работы с этой структурой в функции main разрабо­таем примитивное меню, например, с помощью конструкции switch-case, заключенной в бесконечный цикл.
void main ()
{
N:
system("cls");
printf("Выберете функцию\n");
printf(" 1 – ввод даты\n");
printf(" 2 – вывод даты\n");
printf(" 3 – порядковый номер даты\n");
printf(" 4 – минимальная дата\n");
printf(" 0 – выход из программы\n");
int nom;
scanf("%d",&nom);
switch (nom)
{
case 0: exit(0);// Выход из программы
case 1: {/*Ввод даты*/ break;}
case 2: {/*Вывод даты*/ break;}
case 3: {/*Порядковый номер даты */ break;}
case 4: {/* Нахождение минимальной дата */ break;}
}
default: printf("Ошибка ввода ");
}
printf("\nДля продолжения нажмите Enter "); getch();
goto N;
}
Выход из этого цикла произойдет только в том случае, если пользо­ватель введет 0. В данном коде все ветви case содержат так называемые «заглушки», которые позже будут заменены вызовом соответствующих функций.
После написания меню можно приступать к разработке функций программы. Прежде всего, необходимо определить и протестировать функцию ввода, а затем функцию вывода
даты. Протестировать данные функции можно с помощью их вызова в соответствующей ветви case, например,
case 1: {date d=vvod(); break;} case 2: {date d=vvod(); vivod (d); break;}
Функции, вычисляющую порядковый номер дня в году по введенной дате и находящую в массиве введенных дат самую раннюю можно писать в любом порядке. Обратите внимание, что прежде чем тестировать функ­ции необходимо создать переменную типа date (или массив типа date для демонстрации работы последней функции).
При создании массива его элементы можно вводить с
клавиатуры,
а можно задать в программе, например следующим образом.
67
const int N=20; int n;//Используемое количество элементов массива date mas[N]; printf("Если хотите вводить массив данных с клавиатуры
нажмите 0, в противном случае - 1: ");
int s; scanf("%d",&s); if (s==0) { printf("\nВведите количество дат "); scanf("%d",&n); for (int i=0; i<n; i++) mas[i]=vvod(); } else { static date m[]={ {3, 12, 1995}, {8,3, 1993}, {4, 3, 1993}, {28, 2, 1993}, {5, 10, 1996} }; n=sizeof(m)/sizeof(date);//вычисление размерности
массива
for (int i=0; i<n; i++) mas[i]=m[i]; printf ("\nМассив дат сфорирован"); }
Приведем полный текст программы.
# include <stdio.h> # include <conio.h> # include <iostream>
struct date { int day; int month; int year; }; //Массив количества дней в обычном и високостном году int tab_day [2][12]=
{{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31}};
//****Функция, проверяющая является ли год високос-
ным*******
int visokos(int year)
68
{
int k=year%4==0&&year%100!=0||year%400==0;
return k;
}
//**********Функция ввода даты***************************
date vvod ()
{
date d;
N: printf ("Введите день, месяц, число\n");
scanf("%d%d%d",&d.day, &d.month, &d.year);
int k=visokos(d.year);
if (d.day<1||d.day>tab_day[k][d.month­1]||d.month<1||d.month>12||d.year<0)
{printf ("Ошибка ввода\n"); goto N;}
else printf ("\Дата введена\n");
return d;
}
//*********Функция вывода да­ты*****************************
void vivod (date d)
{
printf("%2d%c%2d%c%4d%s", d.day,'.',d.month,'.',d.year,"\n");
}
//*****Функция, вычисляющая порядковый номер дня в го­ду*****
int day_number(date d)
{
int k=visokos(d.year);
for (int i=0; i<d.month-1; i++)
d.day+=tab_day[k][i];
return d.day;
}
//*******Функция вычисляющая наименьшую дату *************
date min (date* m, int n)
{
int imin=0, myear=m[0].year, mmonth=m[0].month, mday=m[0].day;
for (int i=1; i<n; i++)
if (m[i].year<myear || m[i].year==myear&&(m[i].month<mmonth || m[i].month==mmonth && m[i].day<mday))
imin=i;
return m[imin];
}
void main ()
69
{ N: setlocale(0, "Russian"); system("cls"); printf("Выберете функцию\n"); printf(" 1 – ввод даты\n"); printf(" 2 – вывод даты\n"); printf(" 3 – порядковый номер даты\n"); printf(" 4 – минимальная дата\n"); printf(" 0 – выход из программы\n"); int nom; scanf("%d",&nom); switch (nom) { case 0: exit(0); case 1: {date d=vvod(); break;} case 2: {date d=vvod(); vivod (d); break;} case 3: {date d=vvod(); printf("\nПорядковый номер
%d",day_number(d));
break; } case 4: { const int N=20; int n;//Используемое количество эле-
ментов массива
date mas[N]; printf("Если хотите вводить массив
данных с клавиатуры нажмите 0, в противном случае - 1: ");
int s; scanf("%d",&s); if (s==0) { printf("\nВведите количество дат
");
scanf("%d",&n); for (int i=0; i<n; i++) mas[i]=vvod(); } else { static date m[]={ {3, 12, 1995}, {8,3, 1993}, {4, 3, 1993}, {28, 2, 1993}, {5, 10, 1996} }; n=sizeof(m)/sizeof(date); for (int i=0; i<n; i++)
70
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]