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

книги / Язык Си

..pdf
Скачиваний:
6
Добавлен:
20.11.2023
Размер:
7.64 Mб
Скачать

Программа вывела в файл массив s 1, в результате чего файл

принял вид

 

 

 

11

111

111

111

1

Затем указатель позиции внутри файла был сдвинут на начало функцией rewind\ и строка s2 вывелась не в конец текста, а в начало:

2 2211 111 111 1

Закомментируйте строку rewind(j); и посмотрите, как изме­ нится результат.

Функция remove удаляет указанный файл. Прототип функции имеет вид

intremove(char ^filename)

Функция возвращает нулевое значение при успешной опера­ ции и ненулевое значение в противном случае.

remove("massiv.txt");

Эту функцию можно использовать по окончании работы про­ граммы для удаления за собой временных файлов. Следует пом­ нить, что, прежде чем применить remove, удаляемый файл должен быть закрыт функциейf close.

РЕШ ЕНИЕ ЗАДАЧ

Задача 1. Найти среднее квадратическое отклонение вибро­ перемещений в четырех опорах газотурбинной установки.

Пусть данные о виброперемещениях получены в результате эксперимента и хранятся в файле input.txt в виде

10

2.35 4.15 2.60 2.71

0.35 2.12 3.36 1.15

Здесь 10 - число замеренных виброперемещений в каждой опоре (можно задать другое), столбец 1 - виброперемещения в опоре 1; столбец 2 - виброперемещения в опоре 2 и т.д. Файл до­ пишите самостоятельно.

Для описания виброперемещения создадим структуру OPORA с массивом на четыре элемента в качестве поля структуры. В функции main динамически создадим массив структурного типа а для хранения п замеров в четырех опорах и заполним его инфор­ мацией из файла input.txt.

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

1

 

а =

Ё/=1( £ /,- * 0 2

п - 1

где п - число замеров в каждой опоре (в нашем случае 10); т -

1 П

математическое ожидание, т =—V t / . ; U - виброперемещение в

Пых

опоре.

#include<stdio.h>

#include<conio.h>

#include<stdlib.h>

#include<math.h>

struct OPORA

{float u[4]; //виброперемещения в четырех опорах

};

int main() {OPORA *a; FILE *f; int i,j,n ;

float m[4],s [4];

f = fopen ("input, txt", "r") ; //открываем файл

//проверяем, был ли открыт файл if(f==NULL)

{printf("Error!");

getch();

exit(1);

}

//считываем из файла число испытаний fscanf (f, "%dn,&n) ;

//выделяем динамическую память под массив а = new OPORA [n];

//считываем виброперемещения из файла for(i=0;i<n;i++)

for(j=0;j<4;j++) fscanf(f,"%f",&a[i].u[j] );

//печатаем виброперемещения на экран for(i=0;i<n;i++)

{for(j=0;j<4;j++)

printf ("%10.3f"/a[i].u[j]); printf("\n");

}

//определяем математическое ожидание for(j=0;j<4;j++)

{m[j]=0;

for(i=0;i<n;i++) m[j]+=a[i] .u[j] ;

m [ j ] /=n;

}

//определяем среднее квадратическое отклонение for(j=0;j<4;j++)

{s [j ]=0;

for(i=0;i<n;i++) s[j]+=pow(a[i].u[j]-m[j],2);

s [j]=sqrt(s[j]/ (n-1));

}

//печатаем результат printf("\n\n"); for(j=0;j<4;j++) printf("%10.3f",s[j]);

delete а;

//освобождаем динамическую память

fclose(f);

//закрываем файл

getch();

 

return 0;

 

}

Задача 2. Найти в базе данных заданного сотрудника и повы­ сить ему оклад на 20%.

Пусть в файле хранится база данных сотрудников со следую­ щими полями: фамилия, инициалы, год рождения, оклад. Создайте в папке с программой текстовый файл list.dat и заполните его сле­ дующим образом:

3

Ivanov I.I. 1975 10000.00

Petrov P.P. 1956 14000.00

Sidorov S.S. 1967 12000.00

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

#include<stdio.h>

#include<conio.h>

#include<stdlib.h>

#include<string.h>

struct

MAN

//фамилия

{char

 

Fam[20];

char

 

Inic[5];

//инициалы

int

Birth;

//дата рождения

float

Oklad;

//оклад

} *a;

 

 

 

main()

 

 

{int

i,n;

 

char

 

si[30],s2[30] ;

FILE

 

*f;

 

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

f = fopen(nlist.dat",Mr+" ); //проверяем, был ли открыт файл if(f==NULL)

{printf("Error!");

getch();

exit(1);

//считываем из файла число сотрудников fscanf(f,"%d",&n);

//выделяем динамическую память под массив а = new MAN [n];

//считываем данные о сотрудниках из файла for(i=0; i<n; i++) {fscanf(f,"%s",&a[i].Fam) ;

fscanf(f,"%sn,&a[i].Inic);

fscanf(f,M%d",&a[i].Birth);

fscanf(f,"%f",&a[i].Oklad);

}

//выводим данные о сотрудниках на консоль for(i=0; i<n; i++)

printf("%s %s %d %.2f\nM,

a[i].Fam, a[i].Inic, a[i].Birth, a[i].Oklad);

//задаем сотрудника

printf("Введите фамилию и инициалы: "); gets (si);

//ищем заданного сотрудника в массиве for(i=0; i<n; i++)

{strcpy(s2,a[i].Fam); //соединяем фамилию strcat(s2," "); //пробел strcat(s2,a[i].Inic); //и инициалы

//проверяем, совпадают ли строки if(strcmp(si,s2)==0)

{//повышаем оклад на 20 % a[i].Oklad += a[i].Oklad*0.2; printf("%s %s %d %.2f",

a[i].Fam, a[i].Inic, a[i].Birth, a[i].Oklad); break;

}

}

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

rewind(f);

//записываем в файл число записей в базе данных fprintf(f,"%d\n",n);

//переписываем записи базы данных for(i=0; i<n; i++)

fprintf(f,"%s %s %d %.2f\n",

a[i].Fam, a[i].Inic, a[i].Birth, a[i].Oklad);

delete []a; //удаляем массив fclose(f); //закрываем файл

getch(); return 0;

}

ДОМАШНЕЕ ЗАДАНИЕ

1. Проверьте, как меняется представление текста в файле в за­ висимости от режима открытия файла (см. табл. 12.2) и позиции вывода текста в файл (используйте функциюfeeek).

2. Написать функцию для перемножения матриц. Матрицы задаются в текстовом файле в виде

3

1 1 1

2 2 2

3 3 3

3 3 3

2 2 2

1 1 1 ,

где первая строка 3 - размерность матриц, далее - сами матрицы. Массивы сделать динамическими. Проверить работу про­

граммы на матрицах другой размерности.

СПИСОК ЛИТЕРАТУРЫ

Основной

1. Керниган Б.У., Ритчи Д.М. Язык программирования С. - 2-е изд. - М.: Вильямс, 2009. - 304 с.

2. Подбельский В.В., Фомин С.С. Программирование на языке Си: учеб, пособие. - М.: Финансы и статистика, 2004. -6 0 0 с.

3. Павловская Т.А. C/C++. Программирование на языке высо­ кого уровня. - СПб.: Питер, 2003. - 461 с.

 

 

Дополнительной

1.

Дейтел

X. Как программировать на С? - 4-е изд. - М

БИНОМ, 2006. - 908

с.

2.Культин Н.Б. C/C++ в задачах и примерах. - СПб.: БХВПетербург, 2005. - 288 с.

3.Гудкин Д. С для «чайников». - М.: Вильямс, 2006. - 352 с.

4.Павловская Т.А., Щупак Ю.А. C/C++. Структурное про­ граммирование: практикум. - СПб.: Питер, 2003. - 240 с.

5.Гриффитс Д. Изучаем программирование на С. - М.: Эски­ мо, 2013. - 624 с.

6.Березин Б.И., Березин С.Б. Начальный курс С и C++. - М.: Диалог-МИФИ, 2007. - 288 с.

7.Харбисон С.П., Стил Г.Л. Язык С с примерами. - М.: БИНОМ, 2011.-522 с.

8.Харбисон С.П. Язык программирования С. - 5-е изд. - М.: БИНОМ, 2004. - 522 с.

9.Потопахин В. Язык С. Освой на примерах. - СПб.: БХВПетербург, 2006. - 320 с.

10.Уинер Р.С. Язык Турбо Си. - М.: Мир, 1991. - 380 с.

11.Златопольский Д.М. Сборник задач по программирова­ нию. - СПб.: БХВ-Петербург, 2007. - 240 с.

Учебное издание

ПАЛЬЧИКОВСКИЙ Вадим Вадимович, ПАВЛОГРАДСКИЙ Виктор Васильевич

Я З Ы К С И

Конспект лекций

Редактор и корректор Е.Б. Денисова

Подписано в печать 19.02.14. Формат 60x100/16. Уел. печ. л. 17,25. Тираж 100 экз. Заказ № 20 / 2014.

Издательство Пермского национального исследовательского

политехнического университета.

Адрес: 614990, г. Пермь, Комсомольский пр., 29, к. 113. Тел. (342) 219-80-33.