Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум по программированию на языке Си - A4.doc
Скачиваний:
4
Добавлен:
01.04.2025
Размер:
670.21 Кб
Скачать

Вариант 4

В школьной администрации имеется следующая информация о каждом выпускнике 11 классов:

  • фамилия, имя, отчество;

  • дата рождения (год, месяц, число);

  • домашний адрес (улица, дом, квартира);

  • оценки аттестата о среднем образовании.

Определить, имеются ли среди выпускников однофамильцы. Если да, то составить их список с указанием всей имеющейся информации о каждом. Результат – динамический массив структур. Возвращаемое значение функции – структура, содержащая два поля: указатель на массив структур и размер этого массива.

Вариант 5

Расписание поездов содержит следующие сведения:

  • номер поезда;

  • станция назначения;

  • время отправления (часы, минуты);

  • время в пути.

Составить список поездов до Москвы, отправляющихся с 12 до 24 часов, с указанием для каждого поезда его номера и времени в пути. Результат сохранить в виде массива структур, который расположить в динамической памяти. Возвращаемое значение функции – структура, содержащая два поля: указатель на массив структур и размер этого массива.

Вариант 6

В редакции телепрограмм имеются следующие сведения о передачах, выходящих в эфир в течение суток:

  • название передачи;

  • жанр передачи (например, художественный фильм, реклама; информационная программа, детская передача и т.д.);

  • время выхода в эфир (начало – часы, минуты, конец – часы, минуты).

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

Вариант 7

В деканате содержатся следующие сведения о каждом студенте: фамилия, имя, отчество; пол (закодированный буквой М или Ж), дата рождения (год, месяц, день). Составить список студентов мужского пола с указанием возраста, родившихся с 1 сентября по 31 декабря 1998 года. Результат сохранить в виде массива структур, который расположить в динамической памяти. Возвращаемое значение функции – структура, содержащая два поля: указатель на массив структур и размер этого массива.

Вариант 8

Имеется следующая информация о фильмах:

  • название;

  • режиссер (фамилия, имя);

  • страна;

  • год выпуска;

  • стоимость (расходы на выпуск);

  • доход.

Определить, есть ли в списке такие фильмы, расходы на выпуск которых превышают доход от них. Если да, то составить их список с указанием фамилии режиссера и страны. Результат сохранить в виде массива, который расположить в динамической памяти.

Вариант 9

Имеется следующая информация о фильмах:

  • название;

  • режиссер (фамилия, имя);

  • страна;

  • год выпуска;

  • стоимость (расходы на выпуск);

  • доход.

Определить режиссера, чьи фильмы (в сумме) принесли наибольший доход.

Лабораторная работа №9 “ Потоки ввода/вывода в Си ”

Методические указания

  1. При вызове функции fopen() обязательна проверка успешности открытия файла.

  2. По завершении работы с данными, находящимися в файле, его следует закрыть с помощью вызова функции fclose().

  3. Чтобы избежать влияния выравнивания при переносе структурных переменных и их массивов с помощью функций fread() и fwrite(), следует в качестве второго параметра этих функций использовать не константу, а выражение sizeof(var), где var – имя шаблона структуры или массива структурных переменных.

Пример 1

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

- фамилии, имена партнеров;

- город, откуда прибыла данная пара;

- оценки, полученные в обязательной программе (всего 10 судей, каждый судья выставляет паре по одной оценке).

Подсчитать процент иногородних пар (допустим, что соревнования проходят в городе N).

#include<stdlib.h>

#include<string.h>

#include<stdio.h>

#include <windows.h>

#include <wincon.h>

#define CB 10 //Число судей

#define MAXLEN 80 //Максимальная длина строки

struct Sport

{

char name[MAXLEN];

char town[MAXLEN];

int ball[CB];

};

int procent(char* filename, char* twn);

void main()

{

SetConsoleOutputCP(1251);

int result;

/*Пусть исходные данные для задачи содержатся в текстовом файле data.txt*/

result=procent("data.txt","Moscow");

if(result != -1)

printf("Процент иногородних пар = %d",result);

}

/*

Функция открывает файл с именем filename, считывает из него последовательно записи, вычисляет и возвращает процент иногородних пар (см. условие задачи). Параметр twn – указатель на строку, которая содержит название города, в котором проходят соревнования.

*/

int procent(char* filename, char* twn)

{

FILE* sp; // Указатель на поток

if((sp=fopen(filename,"r"))==NULL)

{

perror("");

return -1;

}

int i;

/*tmp – для считывания одной записи файла:*/

struct Sport tmp;

int count = 0; //Количество иногородних пар

int n = 0; //Количество всех пар-участников

while(1)

{

if(fscanf(sp,"%s%s",tmp.name,tmp.town) == EOF)

break;

for(i=0;i<CB;i++)

fscanf(sp,"%d",&tmp.ball[i]);

if (strcmp(tmp.town,twn) != 0)

count++;

n++;

}

fclose(sp);

int pr;

pr=(count*100)/n;

return pr;

}

Пример 2

Требуется сохранить массив структурных переменных по шаблону struct Book в двоичном файле.

#include"stdio.h"

#include"stdlib.h"

#define LEN 50

struct Book

{

char name[LEN];

char title[LEN];

int year;

};

void main()

{

//Объявляем указатель на открытый поток:

FILE*f;

//Объявляем массив структур с инициализацией:

const int n=4;

struct Book bibl[n]=

{{"Tolstoy", "Voina_and_mir", 1879},

{"Ostrovski", "Groza", 1965},

{"Zolya", "Nana", 1960},

{"Andersen", "Skazki", 1976}};

//Открываем файл list.dat для записи в двоичном режиме:

if((f=fopen("list.dat", "wb"))==NULL)

{

perror("Error");

exit(1);

}

int c;

//Записываем данные по шаблону Book в файл:

c=fwrite(bibl, sizeof(struct Book), n, f);

//Проверяем успешность записи данных:

if(c==n)

puts("Done.");

else

puts("Error!");

//Закрываем файл:

fclose(f);

}

Задания для самостоятельного выполнения.

Задания I уровня сложности

Варианты 1 – 23

Решить задачу соответствующего варианта I уровня сложности из лабораторной работы №8 в предположении, что исходные данные содержатся в текстовом файле.

Вариант 24

В файле содержатся сведения о сотрудниках учреждения, записанные по следующему образцу:

Иван Иванович Иванов

Петр Петрович Петров

...

Записать эти же сведения в новый файл по следующему образцу:

Иванов И.И.

Петров П.П.

Вариант 25

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

Задания II уровня сложности

Варианты 1 – 9

Решить задачу соответствующего варианта II уровня сложности из лабораторной работы №8 в предположении, что исходные данные содержатся в бинарном файле. Файл с исходными данными предварительно создать программно, сохранив в нём массив структур.

Задания III уровня сложности

Вариант 1

Имеется файл (созданный в двоичном режиме), в котором содержатся записи по шаблону

struct State

{

char name[30]; // название государства

double square; // территория (в тыс. кв. км)

double population; //численность населения (млн. чел.)

char capital[50]; // столица

};

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

Лабораторная работа №10 “ Реализация динамических информационных структур ”

Методические указания

  1. Линейный односвязный список представляет собой динамическую структуру, когда каждый элемент, кроме информационных полей, включает только указатель на следующий элемент списка. Доступ ко всему списку осуществляется через внешний указатель, который указывает на первый элемент списка. Под внешним указателем понимают тот, который не содержится внутри никакого элемента.

  2. Поле следующего адреса последнего элемента содержит нулевое значение (NULL), что означает конец списка.

  3. Список, не содержащий элементов, называется пустым, или нулевым списком. Значение внешнего указателя для такого списка равно NULL.

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

Пример

Создать линейный односвязный список и напечатать его на экране.

#include <stdio.h>

#include <windows.h>

#include <wincon.h>

#include <stdlib.h>

#include <string.h>

struct Student

{

char name[50];

int number;

};

struct Cell

{

struct Student info;

struct Cell* next;

};

struct Cell* create_list();

void print_list(struct Cell* head);

void main()

{

SetConsoleOutputCP(1251);

struct Cell* h;

h=create_list();

print_list(h);

}

/*Функция печатает список head на экране.*/

void print_list(struct Cell* head)

{

struct Cell* current; //Указатель на текущее звено списка

if (head==NULL) //Проверка, не пустой ли список

{

puts("Список пуст");

return;

}

current=head;

while(current!=NULL)

{

printf("%20s%6d\n",

current->info.name,current->info.number);

current=current->next;

}

}

/*Функция create_list создаёт список (данные поступают с клавиатуры), возвращает указатель на начало списка*/

struct Cell* create_list()

{

struct Cell* head; //Начало списка

head=NULL; //Список изначально пуст

struct Cell*_new; //Указатель на вновь создаваемое //звено

struct Cell* end; //Указатель на последнее звено

end=NULL;

while(1)

{

//Создание нового звена списка:

_new=(struct Cell*)malloc(sizeof(struct Cell));

puts("Введите ф.и.о. студента:");

fflush(stdin);

gets(_new->info.name);

if(strcmp(_new->info.name,"")==0)

{

free(_new);

break;

}

puts("Введите № зачётной книжки:");

fflush(stdin);

scanf("%d",&_new->info.number);

_new->next=NULL; //Завершено //формирование звена

//Подключение звена _new в конец списка:

if(head==NULL) //Если список пуст

{

head=_new;

end=_new;

}

else

{

еnd -> next=_new;

еnd = _new;

}

}//Конец цикла while

return head;

} //Конец функции create_list

Задания для самостоятельного выполнения.

Задания I уровня сложности

Вариант 1

Подсчитать количество звеньев в списке.

Вариант 2

Сохранить содержимое списка в файле (имя файла передать через аргумент функции).

Вариант 3

Добавить новое звено в конец уже имеющегося списка (для формирования нового звена определить отдельную функцию).

Вариант 4

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

Вариант 5

Удалить первое звено списка.

Вариант 6

Удалить последнее звено списка.

Вариант 7

Найти звено с заданным свойством (например, с заданным значением одного или нескольких информационных полей), возвратить указатель на найденное звено. Если искомых звеньев в списке несколько, возвратить указатель на первое встретившееся звено. Предусмотреть случай, если звено не найдено.

Вариант 8

Определить, упорядочен ли список по какому-либо признаку.

Вариант 9

Найти звено с наибольшим значением некоторого информационного звена. Если таких звеньев несколько, то первое встретившееся.

Вариант 10

Объединить два списка в один, поместив звенья второго списка вслед за звеньями первого.

Вариант 11

Удалить два первых звена списка.

Задания II уровня сложности

Вариант 1

Поменять местами первое и последнее звенья списка.

Вариант 2

Сформировать новый список, заполнив его данными, считанными из файла.

Вариант 3

Добавить новое звено в список, поместив его после звена с заданным номером (предусмотреть обработку ситуации некорректного задания номера).

Вариант 4

Добавить новое звено в список, поместив его после звена с заданным свойством (предусмотреть обработку ситуации, когда звено с заданным свойством отсутствует).

Вариант 5

Найти все звенья списка, удовлетворяющие заданному условию (например, с заданным значением одного или нескольких информационных полей). Результатом работы функции должен быть массив указателей на найденные звенья. Предусмотреть случай, если ни одного звена с заданным свойством не найдено.

Вариант 6

Удалить звено с заданным номером (предусмотреть случай некорректного задания номера).

Заменить все звенья списка, удовлетворяющие некоторому условию (например, с заданным значением одного или нескольких информационных полей) на новое звено, указатель на которое передать через аргумент функции (для формирования нового звена определить отдельную функцию).

Вариант 7

Изменить значение информационного поля звена с заданным свойством (если их несколько, то замену произвести для всех).

Вариант 8

Поменять местами два звена списка, номера которых передаются через аргументы функции (предусмотреть случай некорректного задания номеров).

Задания III уровня сложности

Вариант 1

Удалить все звенья списка, удовлетворяющие заданному условию (например, с заданным значением одного или нескольких информационных полей).

Вариант 2

Удалить все повторяющиеся звенья списка, оставив по одному представителю.

Вариант 3

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

Вариант 4

Организовать последовательный просмотр на экране всех звеньев списка (по одному). Для каждого звена запрашивать у пользователя подтверждение на его удаление. При положительном ответе звено удалить. Сообщить в конце просмотра общее число удаленных звеньев.

Вариант 5

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

Вариант 6

Добавить новое звено после звена, указанного пользователем в процессе последовательного просмотра звеньев списка (данные для нового звена запросить с клавиатуры).

Литература

  1. Белецкий Я. Энциклопедия языка С. – М., Мир, 1992.

  2. Бочков С.О., Субботин Д.М. Язык программирования Си для персонального компьютера. – М., Радио и связь, 1990.

  3. Грис Д. Наука программирования./Под ред. А.П.Ершова. – М.:Мир, 1984.

  4. Зелковиц М. и др. Принципы разработки программного обеспечения. – М.: Мир, 1982.

  5. Кислицкая И.С. Программирование на языке Си: Учебно-методическое пособие. - Липецк, 2006.

  6. М. Бен-Ари. Языки программирования. Практический сравнительный анализ: Пер. с англ. – М.:Мир, 2000.

  7. Павловская Т.А. С/C++. Программирование на языке высокого уровня – СПб.: Питер, 2004.

  8. Подбельский В.В., Фомин С.С. Программирование на языке Си: Учеб. пособие. – М.: Финансы и статистика, 1999.

  9. С/C++. Структурное программирование: Практикум / Т.А. Павловская, Ю.А. Щупак. – СПб.: Питер, 2004.