книги / Язык Си
..pdfПрограмма вывела в файл массив 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.