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

Программирование на языке Си. Практикум

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
893 Кб
Скачать

1.Вызов осуществлять с использованием указателя на функцию.

Взависимости от введенного признака присвоить указателю нужное значение адреса функции расчета. Вызов осуществлять по указателю.

2.Вызов осуществлять с использованием массива указателей на функции.

Создать массив из трёх указателей на функции расчета.

Взависимости от введенного признака вызывать необходимую функцию по элементу массива указателей.

3.Написать две отдельные функции для расчета разных подынтегральных выражений. В каждой функции расчета интеграла добавить параметр – адрес подынтегральной функции. В зависимости от введенного признака вызывать необходимую функцию расчета интеграла с выбранным подынтегральным выражением, использовать указатель на функцию.

3. Символьные данные (строки)

Символьная информация – это текст, содержащий любые допустимые символы (буквы, цифры, специальные знаки), заключенный в кавычки.

Символьные данные можно создавать: - как статический массив

char p[10];

char s[ ]=”строка”; /* нулевой символ ’\0’ автоматически добавляется в конце строки */

char d[ ]={‘c’,’т’,’р’,’о’,’к’,’а’,’\0’}; /* если не указать ’\0’,

получим не строку, а символьный массив*/

char s[20]=”строка”; /* недостающие элементы заполняются нулевыми признаками ’\0’ */

char s[4]=”строка”; // ошибка

- как указатель на тип char и динамический массив char *s=”строка”;

51

или

char *s;

затем выделить память (calloc(); malloc() ) и s=”строка”;

Имя массива (строки) является указателем, как и у других массивов.

3.1. Функции для работы со строками и символами

Функции для обработки строк, кроме функций ввода, расположены в библиотеках string.h, conio.h, которые необходимо подключать. Все функции работают со строками, которые завершаются '\0' (нулевым признаком).

Функции ввода символов и строк

1.Символов

int getch(); // ввод одного символа без отображения его на экране

int scanf(const char *format, address); // с форматом "%с"

2.Строк

int scanf(const char *format, address); // с форматом "%s" Cтрока читается до первого пробела или нажатия клавиши Enter. Если в формате задаем %8s, то строка состоит из 8 символов. Функция выставляет нулевой знак в конце.

char *gets(const char *s);

Читает строку из стандартного потока и помещает ее по адресу, задаваемому s. Строка считывается до первого '\n', в конце добавляется '\0'. Позволяет вводить строки, содержащие пробелы и символы табуляции. Не забыть выделить память. Возвращает адрес s, а если ошибка, то - NULL.

Функции вывода символов и строк

1. Символов

int printf(const char *format, argument); // с форматом "%с" int putch(int s); - выводит символ s на экран

52

2. Строк

int printf(const char *format, argument); // с форматом "%s"

int puts(const char *s);

Помещает строку c адресом s в стандартный выходной поток. Функция прекращает работу, как только встретит '\0'.

Функции обработки строк

1. Вычисление длины строки

int strlen(const char *s);

Возвращает длину строки без учета '\0'.

2. Поиcк в строке s первого вхождения заданного символа c const char *strchr(const char *s, int c);

Просматривает строку s до первого появления в ней символа с. Возвращает указатель на первое вхождение символа. Если символ не обнаружен, то возвращает NULL.

3.Поиск в строке s1 первого вхождения любого из символов, содержащихся в строке s2

char *strpbrk(char *s1, char *s2);

Просматривает строку s1 до тех пор, пока не встретит символ, содержащийся в строке s2.

4.Поиск в строке s последнего вхождения заданного символа c

const char *strrchr(const char *s, int c);

Проверяет строку в обратном порядке, возвращает указатель на последнее вхождение символа, если его нет, то NULL.

5.Определение длины участка строки s1 без символов из s2. Просматривает строку s1 до тех пор, пока не встретит один из символов, содержащихся в s2

int strcspn(const char *s1,const char *s2);

6.Поиск в строке s1 первого вхождения заданной подстроки s2

const char *strstr(const char *s1, const char *s2);

Возвращает указатель на элемент в строке s1, с которого начинается s2. Если не найден, то NULL.

7. Тестирование буквенных символов (проверка: буква / не буква) int isalpha(int c);

53

Если с - не буква, возвращает 0, иначе ненулевое значение.

8.Тестирование цифровых символов (проверка: цифра / не цифра)

int isdigit(int c);

Если с не цифра, возвращает 0, иначе ненулевое значение.

9. Тестирование специальных символов int isspace(int c);

Возвращает ненулевое значение, если c является символом пробела, табуляции, новой строки и т.п., иначе возвращает 0.

Лабораторная работа № 12 Символьные и строковые данные

Задание: Написать программу для решения задачи по варианту. Текст и символы вводить с клавиатуры. Вывести результат на экран.

Вариант задания

1

Ввести текст и символ. Подсчитать, сколько раз

 

встречается символ в тексте.

2

Ввести текст. Определить длину второго слова. Словом

 

будем считать группу символов, разделенную пробелами.

3

Ввести текст. Найти длину последнего слова. Словом

 

будем считать группу символов, разделенную пробелами.

4

Ввести текст, состоящий из слов. Словом будем считать

 

группу символов, разделенную пробелами. Перенести в

 

первом слове первую букву в конец слова.

5

Ввести текст. Если в тексте нет символа +, то оставить

 

текст без изменения, иначе каждый из символов,

 

предшествующих символу + заменить на цифру 0.

6

Ввести текст, состоящих из цифр и букв. Зашифровать его

 

таким образом: каждая цифра 0 заменяется на 1, а 1 на *.

7

Ввести текст. Подсчитать частоту появления букв

 

латинского алфавита и пробела в тексте.

8

Ввести текст. Подсчитать количество слов в нем. Словом

 

будем считать группу символов, разделенную пробелами.

54

9Ввести текст, состоящий из латинских букв, цифр и знаков +, -, *. Группой букв будем называть совокупность последовательно расположенных букв, разделенную пробелами. Подсчитать число групп букв, которые начинаются на "с".

10Ввести текст. Определить, встречается ли в тексте пара соседствующих букв "ра" или "ар" и сколько раз.

11Ввести текст. Удалить из него все группы букв "adk".

12Ввести текст. Заменить все буквы на цифры по принципу: первая буква 1, вторая 2 и т.д.

13Ввести текст. Все не буквы заменить на *.

14Ввести строку, состоящую из цифр. Определить, какая цифра встречается чаще.

15Дан текст и некоторая совокупность символов. Подсчитать, сколько раз встречается каждый символ в тексте. Переписать совокупность символов в порядке убывания частоты появления символа.

16Дан текст и некоторая совокупность символов. Подсчитать, сколько раз встречается каждый символ в тексте. Переписать совокупность символов в порядке возрастания частоты появления символа.

17Дан текст. Указать для второго слова, сколько раз оно встретилось в тексте. Словом будем считать группу символов, разделенную пробелами.

18Дан текст, состоящий из слов, который заканчивается точкой. Словом будем считать группу символов, разделенную пробелами. Перенести в каждом слове первую букву в конец слова.

19Дан текст. Найти длину самого короткого слова. Словом будем считать группу символов, разделенную пробелами.

20Дан текст. Найти длину самого длинного слова. Словом будем считать группу символов, разделенную пробелами.

21Дан текст, состоящий из символов латинского алфавита и цифр. Если в тексте нет символа z, то оставить текст без изменения, иначе каждую из цифр, предшествующую символу + заменить на цифру 9.

55

22Дан текст. Зашифровать его по следующему принципу: каждая i-ая буква алфавита заменяется на i+4 букву в алфавите.

23Дан текст. Зашифровать его по следующему правилу: каждую букву заменить непосредственно следующей за ней (z заменить на a).

24Дан текст. Подсчитать частоту появления букв латинского алфавита и пробела в тексте.

25Дан текст. Подсчитать количество слов в нем. Словом будем считать группу символов, разделенную пробелами.

26Дан текст, состоящий из латинских букв, цифр и знаков +, -, *. Группой букв, будем называть совокупность последовательно расположенных букв, которой не предшествует и за которой не следует буква. Подсчитать число групп букв, которые начинаются буквой "с".

27Дан текст. Найти все слова, содержащие наибольшее количество букв a и f. Словом будем считать группу символов, разделенную пробелами.

28Дан текст. Определить, чего больше в данном тексте, цифр или латинских букв.

29Дан текст. Подсчитать частоту появления цифр и пробела в тексте.

30Ввести текст (состоящий из латинских букв и цифр) и символ. Заменить каждую цифру в тексте на введенный символ.

4. Файлы. Работа с файлами

Файлом называется участок памяти на внешнем устройстве, имеющий имя и хранящий некоторую информацию. Имя файла состоит из двух частей, разделенных точкой: само имя и расширение. Расширение характеризует тип файла.

Для работы с файлами в программе нужно подключить библиотеку stdio.h и:

1 Объявить указатель на файл

FILE *f1, *f2;

56

2. Открыть файл (поток), инициализировать его

FILE *fopen(const char *filename, const char *type);

Функция связывает файл с потоком и возвращает указатель на открытый файл или NULL(0), если обнаружена ошибка при открытии.

filename - путь и имя файла,

type - способ доступа к файлу (r, w или a) r - только для чтения

w - для записи,

если файл с таким именем уже существует, он будет переписан

a - для дописывания файла,

если файл не существует, создает его для записи

3. Закрыть файл по окончанию работы с ним int fclose(FILE *stream);

В файл, определенный указателем stream, записываются все данные из буфера, и поток stream закрывается. Все буферы, связанные со stream, сбрасываются. При успешном завершении функция возвращает 0, в случае ошибки возвращает EOF(-1).

Функции для работы с файлами

1. Чтение и запись символов

- чтение символа из файла int getc(FILE *stream);

-запись символа в файл int putc(int c, FILE *stream);

Функция возвращает символ.

2.Чтение и запись строк

-чтение строки из файла

char *fgets(char *s, int n, FILE *stream);

где

s - указатель на строку (читаем в символьный массив), n - предельная длина считываемой строки,

stream - указатель на файл, из которого будет читаться строка.

Функция считывает символы из потока в строку s, заканчивает чтение, когда она:

57

-прочтет n-1 символ,

-встретит символ новой строки,

-встретит конец файла.

При успешном выполнении возвращает указатель на строку, а при обнаружении ошибки или конца файла - NULL.

- запись строки в файл

int fputs(const char *s, FILE *stream);

При успешном выполнении функция возвращает неотрицательное значение, в противном случае - значение

EOF.

void main(void)

 

{

 

FILE *f;

//объявление указателя на файл

char *s="пример текста";

f = fopen("D:\\Student\\file2.txt","w"); //открытие файла

if ( f != NULL)

//проверка открытия файла

{

 

fputs(s, f);

//запись строки в файл

fclose(f);

//закрытие файла

}

else

printf("\nОшибка при открытии файла");

}

3. Форматированный ввод (чтение из файла)

int fscanf(FILE *stream, const char *format[,аргумент,...];

4. Форматный вывод в файл (запись в файл)

int fprintf(FILE *stream, char *format[,аргумент,...]);

Например:

fprintf(f, "\ncумма=%.3lf", sum); //запись в файл значения sum

58

Лабораторная работа № 13 Ввод и вывод в текстовые файлы

Задание:

1.Изменить свою программу из работы №12 таким образом, чтобы исходный текст и символы читались из файла, а результат выводился и на экран, и в тот же файл. Предварительно подготовить в Блокноте или аналогичной программе текстовый файл с исходными данными для своей задачи.

2.Дополнить свою программу из работы №9 задача 2 выводом числа n, своего массива и результата в текстовый файл в таком формате:

5

1,00

0,54

-0,42 -0,99 -0,65

1,84

1,38

0,43

-0,15

0,19

1,91

1,45

0,49

-0,08

0,26

1,14

0,68

-0,28

-0,85

-0,51

0,24

-0,22 -1,17 -1,75 -1,41

Результат:

 

 

 

6,14

3,84

-0,95

-3,81

-2,13

5. Структурный тип данных

Часто информация, относящаяся к одному объекту, состоит из различных типов данных (ведомости, каталоги, книги). При этом один элемент имеет тип char, другие int, float и т.д., хотя логически они связаны. Такие данные обрабатываются с помощью структур.

Структура - группа данных различных типов, имеющая общее имя.

При работе со структурами нужно обратить внимание на: - объявление структур,

59

-инициализацию значений,

-доступ к отдельным элементам,

-опeрации над структурами.

Определение структурного типа может быть совмещено с определeнием структурных переменных:

struct имя_структурного_типа {

 

список_объявлений_элементов}

 

имя_структ_перем1,

 

имя_структ_перем2, ...;

Пример:

 

struct abc{ int num;

// номер

char name[20];

// наименование

float cost;

// стоимость

} x, y, z;

 

struct abc x1, y1;

// или abc x1,y1;

Начальные значения для структур задаются внутри фигурных скобок. Инициализация осуществляется только константными значениями. Соответствие между константами и элементами структуры устанавливается по порядку записи. Если инициализаторов меньше, чем элементов структуры, то оставшиеся элементы инициализируются нулевыми значениями.

struct abc{ int num;

char name[20]; float cost;

} x={2, "стул", 4185.80};

Можно использовать указатели на структурную переменную:

struct abc *p; // или abc *p;

p - указатель на структуру типа abc.

Инициализация указателя

struct abc *p = &x; // или abc *p = &x;

Для обращения к элементам структуры указывают имя переменной и имя элемента, разделенные точкой (.)

60

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]