русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

ПРИМЕРЫ


Дата добавления: 2013-12-23; просмотров: 943; Нарушение авторских прав


Задача 7.1: Дан бинарный файл, содержащий вещественные числа (тип double). Определить максимальное и минимальное значение в файле и поменять их местами. Имя файла передается в параметрах командной строки.

Программа для задачи

#include <stdio.h> //Библиотека функций ввода и вывода

int main(int argc,char *argv[])

{

//Проверка: передан ли параметр командной строки

if(argc < 2){ //Если нет, то вывод сообщения и выход

puts("Имя файла не указано!");

return 0;

}

FILE *f = NULL; //Объявление файловой переменной

//Открытие файла для чтения и записи с проверкой

if((f = fopen(argv[1],"rb+")) == NULL){

//Если файл открыть не удалось, то

puts("Невозможно открыть файл!");//вывод сообщения

return 0; //и выход

}

double val; //Буфер для чтения данных

//Чтение первого значения из файла

if(fread(&val,sizeof(double),1,f) != 1){

//Если файл пустой, то вывод сообщения и выход

puts("Пустой файл!");

return 0;

}

//Объявление и инициализация апеременных для хранения

//максимального и минимального значений в файле

double max = val, min = val;

//Объявление и инициализация апеременных для хранения

//позиций максимального и минимального значений в файле

//Переменная ind - счетчик текущей позиции в файле

long maxpos = 0, minpos = 0, ind = 1;

while(!feof(f)){ //Пока не конец файла

//Чтение значения из файла

fread(&val,sizeof(double),1,f);

//Если текущий максимум меньше, то

//запоминаем значение и позицию нового максимума

if(max < val) {max = val; maxpos = ind;}

//Если текущий минимум больше, то

//запоминаем значение и позицию нового минимума

if(min > val) {min = val; minpos = ind;}

ind++; //Посчет позиции

}

if(max == min){ //Если максимум равен минимуму

//Вывод сообщения



printf(“Файл содержит одинаковые значения: %lf\n”,max);

}else{ //В противном случае

//Вывод значений

printf("Максимум: %lf\n",max); //максимума

printf("Минимум: %lf\n",min); //минимума

//Установка позиции в файле на позицию максимума

fseek(f,maxpos*sizeof(double),SEEK_SET);

//Запись на позицию максимума значения минимума

fwrite(&min,sizeof(double),1,f);

//Установка позиции в файле на позицию минимума

fseek(f,minpos*sizeof(double),SEEK_SET);

//Запись на позицию минимума значения максимума

fwrite(&max,sizeof(double),1,f);

}

fclose(f); //Закрытие файла

return 0;

}

Задача 7.2: В бинарном файле содержится информация о студентах в виде списка однотипных записей. Каждая запись имеет следующую структуру: ФИО студента (строка 35 символов), курс (целое незнаковое значение от 1 до 5), средний балл (целое незнаковое значение от 1 до 10). Переписать файл, упорядочив список по возрастанию курса, а внутри курса по убыванию среднего балла. Если встречаются записи с одними и теми же курсами и средними баллами, то они упорядочиваются по ФИО в алфавитном порядке. Имя файла передается в параметрах командной строки.

Программа для задачи

#include <stdio.h>//Библиотека функций ввода и вывода

#include <string.h>//Библиотека строковых функций

#include <stdlib.h>//Библиотека стандартных функций

typedef struct{//Описание структуры данных

char fio[36]; //ФИО студента

unsigned kurs, ball; //Курс и средний балл студента

} STUDENT;

//Прототип функции сравнения двух записей

int Cmp(const STUDENT *, const STUDENT *);

int main(int argc, char *argv[])

{

//Проверка: передано ли имя файла в параметрах

if(argc < 2){//Если нет, то

puts("Имя файла не указано!"); //Вывод сообщения

return 0; //Выход

}

FILE *f = NULL; //Объявление файловой переменной

 

//Открытие файла для чтения и проверка успешности

if((f = fopen(argv[1],"rb")) == NULL){

//Если открыть файл не удалось, то

puts("Невозможно открыть файл!"); //Вывод сообщения

return 0; //Выход

}

fseek(f,0,SEEK_END); //Установка позиции на конец файла

int num = ftell(f); //Чтение размера файла в байтах

fseek(f,0,SEEK_SET); //Возврат к началу файла

Если размер файла не кратен размеру записи, то файл

if(num % sizeof(STUDENT)){//содержит некорректные данные

puts("Некорректный файл!"); //Вывод сообщения

fclose(f); //Закрытие файла

return 0; //Выход

}

//Вычисление количества записей в файле

num /= sizeof(STUDENT);

//Создание массива под список записей

STUDENT *array = (STUDENT *)calloc(num,sizeof(STUDENT));

if(!array){ //Если массив создать неудалось, то

puts("Не хватает памяти!"); //Вывод сообщения

fclose(f); //Закрытие файла

return 0; //Выход

}

//Чтение списка записей из файла в массив

fread(array,sizeof(STUDENT),num,f);

fclose(f); //Закрываем файл

int flag = 1; //Флаг сортировки

while(flag){ //Внешний цикл сортироки пузырьком

flag = 0; //Сброс флага сортировки

//Внутренний цикл сортировки пузырьком

for(int i=0;i<num-1;i++)

//Проверка на необходимость перестановки элементов

if(Cmp(&array[i],&array[i+1])>0){

STUDENT val = array[i]; //Перестановка элементов

array[i] = array[i+1]; //через дополнительную

array[i+1] = val; //переменную

flag = 1; //Установка флага сортировки

}

}

//Открытие бинарного файла для записи

f = fopen(argv[1],"wb");

if(f == NULL){ //Если файл не создан заново, то

puts(“Невозможно создать файл!”); //Вывод сообщения

free(array); //Освобождение памяти

return 0; //Выход

}

//Сохранение списка записей из массива в файл

fwrite(array,sizeof(STUDENT),num,f);

fclose(f); //Закрытие файла

free(array); //Освобождение памяти

return 0;

}

/* -------------- Функция сравнения -----------------------

Функция стравнивает две записи и возвращает:

1 - если запись st1 «больше» записи st2

-1 - если запись st1 «меньше» записи st2

0 - если равны

-------------------------------------------------------- */

int Cmp(const STUDENT *st1, const STUDENT *st2)

{

if(st1->kurs > st2->kurs) return 1;

else if(st1->kurs < st2->kurs) return -1;

if(st1->ball < st2->ball) return 1;

else if(st1->ball > st2->ball) return -1;

return strcmp(st1->fio,st2->fio);

}

Задача 7.3: Дан текстовый файл, содержащий строки в следующем формате: КЛЮЧ=ЗНАЧЕНИЕ, где КЛЮЧ - текстовая строка длиной до 8-ми символов, а ЗНАЧЕНИЕ - целое число. Необходимо для каждого ключа создать текстовый файл с именем КЛЮЧ.txt, в который записать все значения с таким ключом. Значения в новых файлах разделяются символом табуляции. Имя исходного файла передается в параметрах командной строки.

Программа для задачи

#include <stdio.h>//Библиотека функций ввода и вывода

#include <string.h>//Библиотека строковых функций

int main(int argc, char *argv[])

{

if(argc < 2){//Если имя файла не передано, то

puts("Не указано имя файла!"); //Вывод сообщения

return 0; //Выход

}

FILE *f = NULL; //Объявление фаловой переменной

//Если открыть файл для чтения не удалось, то

if((f = fopen(argv[1],"r")) == NULL){

puts("Невозможно открыть файл!"); //Вывод сообщения

return 0; //Выход

}

unsigned cnt = 0; //Счетчик строк в файле

while(!feof(f)){ //Цикл: пока не достигнем конца файла

char str[40]; //Буфер для чтения

//Чтение строки, с проверкой на достижение конца файла

if(fgets(str,40,f) == NULL) break;

cnt++; //Подсчет номера текущей строки

//Удаление символа перевод строки если он есть

if(str[strlen(str)-1] == '\n') str[strlen(str)-1] = 0;

//Поиск позиции символа ‘=’ в строке

char *ptr = strchr(str,'=');

if(!ptr){ //Если символ не найден, то вывод сообщения

printf("Некорректная строка %u\n",cnt);

continue; //и переход к следующей строке в файле

}

int len = ptr - str; //Вычисление длины ключа в строке

//Строка для формирования имени файла

char key[15] = "";

strncpy(key,str,len); //Копирование ключа

strcat(key,".txt"); //Добавление расширения файла

//Открытие файла для добавления

FILE *r = fopen(key,"a");

if(r == NULL){//Если открыть файл не удалось,

//то вывод собщения

printf("Невозможно открыть файл %s\n",key);

}else{//В противном случае

fprintf(r,"%s\t",ptr+1); //Запись значения в файл

fclose(r); //Закрытие файла

}

}

fclose(f); //Закрытие исходного файла

return 0;

}

Задача 7.4: Дан текстовый файл, содержащий некоторый текст. Упорядочить слова в каждой строке данного файла в алфавитном порядке. Длина строк в файле не превышает 100 символов, а количество слов в строке - не более 15. Слова в строке разделяются одним или несколькими пробелами. Имя файла передается в параметрах командной строки.

Программа для задачи

#include <stdio.h>//Библиотека функций ввода и вывода

#include <string.h>//Библиотека строковых функций

int main(int argc, char *argv[])

{

if(argc < 2){//Если имя исходного файла отсутствует

puts("Не указано имя файла!"); //Вывод сообщения

return0; //Выход

}

FILE *f = NULL; //Объявление файловой переменной

//Открытие исходного файла для чтения

if((f = fopen(argv[1],"r")) == NULL){//Если не удалось:

puts("Ошибка открытия файла!"); //Вывод сообщения

return 0; //Выход

}

FILE *r = NULL; //Объявление файловой переменной

//Создание результирующего файла для записи

if((r = fopen("temp.txt","w")) == NULL){//Если не удалось

puts("Ошибка создания файла!"); //Вывод сообщения

fclose(f); //Закрытие исходного файла

return 0; //Выход

}

while(!feof(f)){//Цикл: пока не конец исходного файла

char str[101];//Буфер для чтения

//Чтение строки с проверкой на достижение конца файла

if(fgets(str,100,f) == NULL) break;

//Удаление символа перевод строки, если он есть

if(str[strlen(str)-1] == '\n') str[strlen(str)-1] = 0;

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

char *words[15] = {NULL};

int num = 0; //Счетчик слов в строке

//Получение первого слова

words[num++] = strtok(str," ");

//Получение остальных слов в строке и заполнение

//массива указателей на слова

while((words[num++] = strtok(NULL," ")) != NULL);

num--; //Коррекция числа слов в строке

int flag = 1; //Флаг сортировки

while(flag){//Внешний цикл сортировки пузырьком

flag = 0; //Сброс флага сортировки

for(int i=0;i<num-1;i++)//Внешний цикл сортировки

//Если слова необходимо поменяить местами

if(strcmp(words[i],words[i+1]) > 0){

char *ptr = words[i]; //Перестановка элементов

words[i] = words[i+1]; //через дополнительную

words[i+1] = ptr; //переменную

flag = 1; //Установка флага сортировки

}

}

//Запись слов в результирующий файл

for(int i=0;i<num;i++) fprintf(r,"%s ",words[i]);

fprintf(r,"\n"); //Запись символа перевод строки в файл

}

fclose(f); fclose(r); //Закрытие файлов

remove(argv[1]); //Удаление исходного файла

//Переименование полученного файла в исходный файл

rename("temp.txt",argv[1]);

return 0;

}

Задача 7.5: Дан текстовый файл, содержащий построчно записи о книгах. В каждой записи содержится: фамилия и инициалы автора (строка, до 20 символов), название книги (строка, до 50 символов), год издания (целое положительное значение). Формат записи: ФИО автора “название” год издания. Преобразовать файл в бинарный файл, упорядочив записи по полю фамилии автора, внутри каждой фамилии - по году издания, а внутри года издания - по названию. Имя файла передается в параметрах командной строки. Если имя файла не указано или файл не существует, то ввод осуществляется с клавиатуры. Признак завершения ввода - ввод пустой строки. Имя выходного файла образуется из имени входного файла путем замены расширения на dat. Если ввод осуществляется с клавиатуры, то имя выходного файла - result.dat.

Программа для задачи

#include <stdio.h>//Библиотека функций ввода и вывода

#include <string.h>//Библиотека строковых функций

#include <stdlib.h>//Библиотека стандартных функций

typedef struct{ //Создание структуры для записей

char author[20]; //фамилия и инициалы автора

char title[50]; //название книги

int year; //год издания

} BOOK;

int Input(FILE *, BOOK *); //Функция ввода одной записи

int Add(BOOK **, BOOK, int*);//Функция добавления в список

int Save(FILE *, BOOK *,int);//Функция записи списка в файл

voidSort(BOOK *,int); //Функция сортировки списка

void Clear(BOOK **,int *); //Функция удаления списка

/* ---------- Главная функция программы: main ---------- */

int main(int argc, char *argv[])

{

char fname[50] = "result.dat"; //Имя выходного файла

//Входной файл, устанавен изначально на стандартный поток

FILE *f = stdin; //ввода

if(argc == 2){//Если имя входного файла передано

f = fopen(argv[1],"r"); //Открываем файл

if(!f){//Если открыть файл не удалось

puts("Файл не существует!"); //Вывод сообщения

f = stdin; //Устанавливаем стандартный поток ввода

}else{//Иначе

strcpy(fname,argv[1]); //Копируем имя входного файла

//Ищем позицию последней точки (точки перед

//расширением) в имени файла

char *ptr = strrchr(fname,'.');

if(ptr) *ptr = 0; //Удаляем расширение имени файла

strcat(fname,".dat");//Добавляем расширение dat имени

}

}

//Переменная указатель на список и локальная переменная

BOOK *list = NULL, book;

//Переменная, содержащая число ввденных записей

int count = 0;

//Цикл считывания (или ввода) записей, выполняется пока

while(Input(f,&book)) //функция не вернет значение 0

//Добавление новой записи в список

if(!Add(&list,book,&count)){//Если добавить не удалось

puts("Мало памяти!"); //Вывод сообщения

break; //Выход из цикла

}

//Если ввод осуществлялся не с клавиатуры

if(f != stdin) fclose(f); //то закрываем файл

if(count < 1){ //Если записи не были считаны или введены

//Вывод сообщения



puts(“Данных для дальнейшей обработки нет!”);

return 0; //Выход

}

//Выводим число прочитанных записей на экран

printf("Введено %d записей\n",count);

Sort(list,count); //Сортировка списка

//Если выходной файл создан и в него записаны данные

if(((f = fopen(fname,"wb")) != NULL)&&

(Save(f,list,count) == 1))

//Вывод сообщения об успешном сохранении данных

printf("Список сохранен в файл %s\n",fname);

//Иначе вывод сообщения об ошибке сохранения данных

else puts("Не возможно создать и/или записать файл!");

//Если файл был создан,

if(f != NULL) fclose(f);//то закрываем его

Clear(&list,&count); //Удаление списка

return 0;

}

/* ---------- Функция ввода одной записи ------------------

Параметры: f - файловый поток, из которого читаются данные,

val - указатель, куда записываются данные.

Возвращаемое значение: 1 - все прошло успешно

0 - ошибка или достигнут конец файла

-------------------------------------------------------- */

int Input(FILE *f, BOOK *val)

{

char str[101] = ""; //Буфер для чтения данных

//Чтение данных, если ошибка или конец файла - выход

if(!fgets(str,100,f)) return 0;//с кодом завершения: ноль

//Удаление символа перевод строки, если он есть

if(str[strlen(str)-1] == '\n') str[strlen(str)-1] = 0;

//Если ввод с клавиатуры и введена пустая строка, то

//выход с кодом завершения: ноль

if((strcmp(str,"") == 0)&&(f == stdin)) return 0;

//Поиск двойных кавычек согласно формату ввода

char *ptr1 = strchr(str,'\"'), *ptr2 = strrchr(str,'\"');

//Если парные кавычки не найдены, то выход с кодом

//завершения: ноль

if((ptr1 == NULL)||(ptr1 == ptr2)) return 0;

int len = ptr2 - ptr1; //Вычисление длины названия книги

//Копирование названия книги в структуру

strncpy(val->title,ptr1+1,len-1);

val->title[len] = 0; //Запись завершающего нуля в поле

//Поиск последнего символа ФИО автора в введенной строке

while(*(--ptr1) == ' ');

len = ptr1 - str; //Вычисление длины поля ФИО автора

//Копирование ФИО автора книги в структуру

strncpy(val->author,str,len+1);

val->author[len+1] = 0;//Запись завершающего нуля в поле

//Поиск первого символа года издания в введенной строке

while(*(++ptr2) == ' ');

//Копирование года издания в структуру

val->year = atoi(ptr2);

return 1; //Выход и возврат кода завершения: единица

}

/* ---------- Функция добавления записи в список ----------

Параметры: list - указатель на указатель на список записей,

val - помещаемое в список значение,

num - количество элементов в списке (по ссылке)

Возвращаемое значение: 1 - все прошло успешно

0 - ошибка: нехватка динамической

памяти

-------------------------------------------------------- */

int Add(BOOK **list, BOOK val, int *num)

{

//Выделение памяти под новый элемент списка

BOOK *temp = (BOOK *)realloc(*list,

(*num+1)*sizeof(BOOK));

//Если память не выделилась, то выход с кодом завершения:

if(!temp) return 0; //ноль

temp[*num] = val; //Запись нового значения в конец списка

(*num)++; //Увеличение числа записей в списке

*list = temp; //Установка нового списка

return 1; //Выход с кодом завершения: единица

}

/* ------- Функция сохранения списка в файл ---------------

Параметры: f - файловый поток для записи списка,

list - указатель на список,

num - количество элементов в списке.

Возвращаемое значение: 1 - все прошло успешно

0 - ошибка: невозможно записать все

элементы

-------------------------------------------------------- */

int Save(FILE *f, BOOK *list,int num)

{

//Если не удалось записать все элементы, то возврат ноля

if(fwrite(list,sizeof(BOOK),num,f) != num) return 0;

return 1; //В противном случае: возврат единицы

}

int Cmp(BOOK *, BOOK *); //Функция сравнения элементов

/* --------- Функция сортировки списка --------------------

Параметры: list - указатель на список,

num - количество элементов в списке.

Используется алгоритм сортировки пузырьком

-------------------------------------------------------- */

void Sort(BOOK *list,int num)

{

int flag = 1;

while(flag){

flag = 0;

for(int i=0;i<num-1;i++)

if(Cmp(&list[i],&list[i+1])>0){

BOOK val = list[i];

list[i] = list[i+1];

list[i+1] = val;

flag = 1;

}

}

}

/* ---------- Функция удаления всего списка ---------------

Параметры: list - указатель на список (по ссылке),

num - количество элементов в списке (по ссылке).

-------------------------------------------------------- */

void Clear(BOOK **list, int *num)

{

//Если список присутствует,

if(*list) free(*list); //то удаляем список

*list = NULL; *num = 0;//Очищаем остальные переменные

}

/* ------------ Функция сравнения двух записей ------------

Параметры: указатели на две записи

-------------------------------------------------------- */

int Cmp(BOOK *book1, BOOK *book2)

{

//Сравнение по ФИО автора

int res = strcmp(book1->author,book2->author);

if(res > 0) return 1; //Если «больше»

else if(res < 0) return -1; //Если «меньше»

//Иначе если «равно»: сравнение по году издания

res = book1->year - book2->year;

if(res > 0) return 1; //Если «больше»

else if(res < 0) return -1; //Если «меньше»

//Иначе если «равно»: сравнение по названию

return strcmp(book1->title,book2->title);

}

 



<== предыдущая лекция | следующая лекция ==>
ФУНКЦИИ ДЛЯ РАБОТЫ С ФАЙЛАМИ | ЭЛЕКТРОННЫЙ КОНСПЕКТ ЛЕКЦИЙ ПО ДИСЦИПЛИНЕ


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Полезен материал? Поделись:

Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.019 сек.