2. Что такое файл с точки зрения языка программирования С?

3. Какие виды файлов Вы знаете?

4. В чем отличие текстового файла от бинарного и от чего зависит наличие этого различия?

5. Что такое поток?

6. Что такое признак окончания файла? Для каких файлов он существует?

7. Как инициализировать поток?

8. Что такое структурный тип?

9. Какая функция отвечает за открытие потока? Какие у нее параметры?

10. Какие режимы открытия файла Вы знаете? В чем их отличия друг от друга?

11. Какие ошибки могут возникнуть при открытии файла?

12. В каком случае указатель на поток принимает значение NULL?

13. Какая функция отвечает за закрытие файла? Какие у нее параметры?

14. Зачем закрывать файл?

15. Сколько раз можно открыть файл в программе?

16. Какие функции используются для ввода-вывода данных при работе с текстовыми файлами?

17. Какие функции используются для ввода-вывода данных при работе с бинарными файлами?

18. В чем отличие функции fprintf() от функции fread(), а функции fscanf() от fwrite()?

19. Как определить текущую позицию указателя на поток?

20. Как переместить указатель на поток из текущей позиции в заданную?

21. За что отвечает константа EOF? Как и где ее можно использовать?

22. Какие основные функции для работы с файлами Вы знаете?

23. С помощью каких функций можно осуществлять побайтовую обработку файлов?

24. Для чего используются функции rename() и remove()? Нужно ли при работе с ними объявлять файловый указатель?

25. Можно ли удалить или переименовать открытый файл?

Библиографический список

1. Типовые алгоритмы и их программирование: практическое пособие / А.Н. Гущин [и др.]; Под. ред. И.К. Раковой; Балт. гос. техн. ун-т. – СПб., 2016.

2. Керниган Б. Язык программирования Си : пер. с англ. / Б. Керниган, Д. Ритчи – 2-е изд., перераб. и доп. – Москва [и др.] : Вильямс, 2015. - 288 с.

3. Подбельский В.В. Курс программирования на языке Си : Учебник / В.В. Подбельский, С.С. Фомин; М.: ДМК Пресс, 2012 – 384 с.

4. Арсеньев Б.П. и др. Основы языков программирования С и С++: Учеб. пособие/ Б.П. Арсеньев, О.А. Решетова, И.И. Рыкова, Ю.П. Шеляпин. Балт. гос. техн. ун-т. СПб., 2001. – 132 с.

5. Березин Б.И. Начальный курс С и С++: учеб. пос./ Б.И. Березин, С.Б. Березин; ДИАЛОГ-МИФИ. М., 2004. – 288 с.
Приложение
Образец оформления отчета по практической работе

Балтийский государственный технический университет «Военмех» им. Д. Ф. Устинова

 

Кафедра И9

«Систем управления и компьютерных технологий»

 

Практическое задание № 2
по дисциплине «Основы программирования»

на тему «Ветвления и циклы»

 

 

Вариант 11

 

 

Выполнил:

Студент Иванов И. И.

Группа И953

 

Преподаватель:

Палехова О. А.

 

Санкт-Петербург

2015

Задача 1. Вычислить значение функции , используя условную операцию ?:

Исходные данные:

Так как значения х и у могут быть любыми, объявим соответствующие переменные типа double.

Результирующие данные:

Значение функции f тоже будет типа double.

Схема программы

Текст программы

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

 

int main (void)

{

double x, y, f;

printf ("x=");

scanf ("%lf", &x); /*ввод х*/

printf ("y=");

scanf ("%lf", &y); /*ввод у*/

f=x<0?y-x:y<0?y*y-x:sin(x); /*вычисление результата*/

printf ("f=%lf\n", f); /*вывод результата*/

system ("pause");

return 0;

}

 

Результаты тестирования

Исходные данные Ожидаемый результат Результат работы программы
х=-1.4, у=1 2,4 f=2.400000
х=3, у=-1 -2 f=-2.000000
x=0, y=0 0 f=0.000000

 

Задача 2. Вычислить значение функции

Исходные данные:

Тип аргумента в задании не указан, поэтому переменная х будет типа double.

Результирующие данные:

Значение функции q тоже будет типа double.

Предварительные вычисления:

Чтобы можно было вычислить значение функции, должны быть выполнены следующие условия: x¹0, ненулевой знаменатель второй дроби, неотрицательное подкоренное выражение.

Вспомогательные переменные:

d – подкоренное выражение, z – знаменатель второй дроби; обе переменные типа double.

Схема программы:

Текст программы

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

 

int main (void)

{

double x, z, d, q;

printf ("x=");

scanf ("%lf", &x); /*ввод х*/

if (x) /*если х отличен от нуля*/

{ /*под корнем*/

d=(sin(x)+cos(x)*cos(x))/(2*log(x*x+exp(-x)));

z=1+1/(2*x)+fabs(x); /*знаменатель второй дроби*/

/*если под корнем положительное число и знаменатель ненулевой*/

if (d>=0 && z)

{

q=sqrt(d)+1/z; /*вычисляем значение функции*/

printf ("q=%lf\n",q); /*выводим его на экран*/

system ("pause");

return 0; /*программа завершена*/

}

}

/*если не было вычислено значение функции (программа не прервана к текущему моменту), то выводим сообщение о недопустимом значении аргумента*/

printf("х не принадлежит области определения \

функции\n");

system ("pause");

return 0;

}

Результаты тестирования

Исходные данные Ожидаемый результат Результат работы программы
х=0 Сообщ. об ошибке (0 в знаменателе) х не принадлежит области определения функции
х=1 1,745001 f=1.745001
x=-1 Сообщ. об ошибке (отриц. под корнем) х не принадлежит области определения функции

 

Задача 3. Дано натуральное трехзначное число. Если все цифры в нем различны, то оставить заданное число без изменения; если все цифры в нем одинаковые, то первую уменьшить на 1, а последнюю, если это не 9, увеличить на 1; если две цифры в числе одинаковые, то получить число с обратным порядком цифр.

Исходные данные:

Число натуральное трехзначное, поэтому тип переменной n unsigned int.

Результирующие данные:

Результат записывается в ту же переменную n.

Вспомогательные переменные:

Каждую цифру числа будем заносить в отдельную переменную, поэтому определим переменные a, b и c типа char.

Схема программы

Текст программы

#include <stdio.h>

#include <stdlib.h>

 

int main (void)

{

unsigned int n;

char a, b, c;

printf ("n=");

scanf ("%u", &n); /*ввод числа*/

a=n/100; /*первая цифра*/

b=n%100/10; /*вторая цифра*/

c=n%10; /*последняя цифра*/

if (a==b && b==c) /*если все цифры равны*/

{

a--; /*первую уменьшаем на 1*/

/*последнюю увеличиваем на 1, если это не 9*/

if (c!=9) c++;

}

else

/*если совпадают две первые или две последние цифры*/

if (a==b || b==c)

{ /*меняем значения первой и последней цифр*/

int tmp=a;

a=c;

c=tmp;

}

n=a*100+b*10+c; /*«собираем» число из цифр*/

printf ("n=%u\n", n); /*выводим результат*/

system ("pause");

return 0;

}

 

Результаты тестирования

Исходные данные Ожидаемый результат Результат работы программы
n=123 123 n=123
n=222 123 n=123
n=999 899 n=899
n=131 131 n=131
n=112 211 n=211
n=433 334 n=334

 

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

Исходные данные:

Числа будут анализироваться по очереди, поэтому для их представления достаточно одной переменной n типа char.

Результирующие данные:

Для результата отдельной переменной не требуется.

Вспомогательные переменные:

Каждую цифру анализируемого числа будем заносить в отдельную переменную, поэтому определим переменные a и b типа char.

Схема программы:

Текст программы

#include <stdio.h>

#include <stdlib.h>

 

int main (void)

{

char n, a, b;

printf ("Искомые числа: ");

/*n изменяется в цикле от 10 до 99 с шагом 1*/

for (n=10; n<100; n++)

{

a=n/10; /*первая цифра*/

b=n%10; /*вторая цифра*/

/*если число удовлетворяет условию*/

if (2*(a+b)==a*b)

printf ("%d ", n); /*то выводим его на экран*/

}

system ("pause");

return 0;

}

 

Результаты тестирования

Ожидаемый результат Результат работы программы
36, 44, 63 Искомые числа: 36 44 63

 

Задача 5. Определить, являются ли натуральные числа a и b взаимно простыми. Взаимно простые числа не имеют общих делителей, кроме единицы.

Исходные данные:

Числа натуральные, поэтому тип переменных a и b unsigned int.

Результирующие данные:

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

Используемые алгоритмы обработки данных:

Алоритм Евклида для поиска наибольшего общего делителя двух натуральных чисел.

Схема программы:

Текст программы

#include <stdio.h>

#include <stdlib.h>

 

int main (void)

{

unsigned int a, b;

printf ("a=");

scanf ("%u", &a);

printf ("b=");

scanf ("%u", &b);

while (a && b) /*пока a и b отличны от 0*/

if (a>b)/*если a>b, то в а остаток от его деления на b */

a%=b;

else /*иначе в b записываем остаток от его деления на а*/

b%=a;

/*НОД=а+b. Числа взаимно простые, если НОД=1*/

printf ("Числа %sвзаимно простые\n",

a+b==1?"":"не ");

system ("pause");

return 0;

}

 

Результаты тестирования

Исходные данные Ожидаемый результат Результат работы программы
а=25 b=33 Взаимно простые Числа взаимно простые
а=25 b=35 Не явл. взаимно простыми Числа не взаимно простые

 

Задача 6. Первоначальный объем древесины на участке леса составляет р кубометров. Ежегодный прирост составляет k%. Годовой план заготовки составляет t кубометров. Определить, через сколько лет в этом лесу будут расти одни опята?

Исходные данные:

Все данные не обязательно целые, поэтому переменные p, k и t будут типа double.

Результирующие данные:

Целое число лет, поэтому возьмем переменную n типа unsigned int.

Предварительные вычисления:

Лес не будет исчезать, если прирост будет больше вырубки.

Схема программы

Текст программы

#include <stdio.h>

#include <stdlib.h>

 

int main (void)

{

double p, k, t;

unsigned int n=0;

printf ("p=");

scanf ("%lf", &p);

printf ("t=");

scanf ("%lf", &t);

printf ("k=");

scanf ("%lf", &k);

if (t<p*k/100)

printf ("Лес не вырубят\n");

else

{

do

{

p-=t; /*общий объем минус вырубка*/

p+=p*k/100; /*прирост оставшейся части*/

n++; /*прошел год*/

}

while (p>0);

printf ("Лес исчезнет через %u лет", n);

}

system ("pause");

return 0;

}

 

Результаты тестирования

Исходные данные Ожидаемый результат Результат работы программы
р=100 k=5% t=2 Лес не вырубят Лес не вырубят
p=100 k=2% t=5 26 лет Лес исчезнет через 26 лет

 

Задача 7. Вычислить значение суммы бесконечного ряда с заданной точностью e=10-6 и значение функции (для проверки) y=cos2x.

Исходные данные:

Тип аргумента в задании не указан, поэтому переменная х будет типа double.

Результирующие данные:

Значение суммы s тоже будет типа double.

Вспомогательные переменные:

n – индекс слагаемого – целое число типа int, a – значение текущего слагаемого – вещественное число типа double.

Предварительные вычисления:

n -ное слагаемое ,

предшествующее слагаемое

коэффициент пропорциональности

индекс первого слагаемого в рекуррентной последовательности n=0, первое слагаемое

Схема программы

Текст программы

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#define EPS 1e-6

 

int main (void)

{

double x, a, s;

int n=0; /*индекс первого слагаемого 0*/

printf ("x=");

scanf ("%lf", &x);

a=0.5;

s=0.5+a;

/*пока слагаемое по модулю больше заданной точности*/

while (fabs(a)>EPS)

{

n++; /*увеличиваем индекс слагаемого*/

a*=-4*x*x/(2*n*(2*n-1));

/*вычисляем очередное слагаемое домножением

предыдущего на коэффициент пропорциональности*/

s+=a; /*накапливаем сумму*/

}

printf ("s=%lf\n cos(%lf)^2=%lf\n",

s, x, cos(x)*cos(x));

system ("pause");

return 0;

}

Результаты тестирования

Исходные данные Ожидаемый результат Результат работы программы
х=0 cos2x =1 s=1.000000
x=1 cos2x =0,291927 s=0.291927

 

Задача 8. Вычислить значение суммы бесконечного ряда с заданной точностью e=10-5 и значение функции (для проверки) , учесть, что x2<1.

Исходные данные:

Тип аргумента в задании не указан, поэтому переменная х будет типа double.

Результирующие данные:

Значение суммы s тоже будет типа double.

Вспомогательные переменные:

n – индекс слагаемого – целое число типа int, a – значение текущего слагаемого – вещественное число типа double.

Предварительные вычисления:

n -ное слагаемое ,

предшествующее слагаемое

коэффициент пропорциональности

индекс первого слагаемого в рекуррентной последовательности n=1, первое слагаемое

Схема программы

Текст программы

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#define EPS 1e-5

 

int main (void)

{

double x, a, s;

int n=1; /*индекс первого слагаемого 0*/

printf ("x=");

scanf ("%lf", &x);

if (fabs(x)>=1) /*если |x|³1*/

{ /*выводим сообщение об этом*/

printf ("Недопустимое значение x\n");

system ("pause");

return 0; /*и прерываем программу*/

}

a=-x/2;

s=1+a;

while (fabs(a)>EPS)

{/*пока слагаемое по модулю больше заданной точности*/

n++; /*увеличиваем индекс слагаемого*/

a*=(1-2*n)*x/(2*n);

/*вычисляем очередное слагаемое домножением

предыдущего на коэффициент пропорциональности*/

s+=a; /*накапливаем сумму*/

}

printf ("s=%.5lf\n y(%lf)=%.5lf\n",

s, x, 1/sqrt(1+x));

system ("pause");

return 0;

}

 

Результаты тестирования

Исходные данные Ожидаемый результат Результат работы программы
х=0 s=1.000000
x=1 Недопустимое значение х Недопустимое значение х
x=0,5 s=0.81650

 

Задача 9. Последовательность a1, a2, a3,... образована по закону а1=b, ai=ai-1- , i=2,3,…. Найти первый отрицательный член последовательности для различных b=3,4,5,6,7,8,9.

Исходные данные:

b целое однозначное число, используем переменную типа char.

Результирующие данные:

номер члена последовательности – целое число – переменная i типа int; значение члена последовательности – вещественное число a типа double.

Схема программы

Текст программы

#include <stdio.h>

#include <stdlib.h>

 

int main (void)

{

double a;

char b;

int i;

for (b=3; b<10; b++) /*для всех b от 3 до 9*/

{

i=1;

a=b; /*значение первого члена послед-ти равно b*/

/*пока значение очередного члена послед-ти неотрицательное*/

while (a>=0)

{

i++;

a-=1/sqrt(i); /*вычисляем следующее*/

}

/*когда вычислено отриц. значение, выводим b, i и найденное a*/

printf ("b=%d\ti=%d\ta=%lf\n", b, i, a);

}

system ("pause");

return 0;

}

 

Результаты тестирования

Ожидаемый результат Результат работы программы
b=3 i=7 a=-0.017883 b=4 i=10 a=-0.020998 b=5 i=14 a=-0.155796 b=6 i=18 a=-0.142232 b=7 i=22 a=-0.026674 b=8 i=27 a=-0.027878 b=9 i=33 a=-0.115590 b=3 i=7 a=-0.017883 b=4 i=10 a=-0.020998 b=5 i=14 a=-0.155796 b=6 i=18 a=-0.142232 b=7 i=22 a=-0.026674 b=8 i=27 a=-0.027878 b=9 i=33 a=-0.115590

 

Оглавление

Предисловие. 3

Практическая работа № 1. Структура программы, основные типы данных, ввод/вывод. 4

Практическая работа № 2. Ветвления и циклы.. 11

Практическая работа № 3. Указатели. 33

Практическая работа № 4. Массивы. Динамическое выделение памяти. 37

Практическая работа № 5. Функции. 54

Практическая работа №6. Строки. 65

Практическая работа №7. Файлы.. 70

Библиографический список. 85

Приложение Образец оформления отчета по практической работе. 86

 

 

 

Основы программирования на языке Си

 

Составитель Палехова Ольга Александровна

 

Редактор Г. М. Звягина

Подписано в печать __.__.20__. Формат 60х84/16.

Бумага документная. Печать трафаретная. Усл. печ. л. ___ .

Уч.-изд. л. ___. Тираж ___ экз. Заказ №___

Балтийский государственный технический университет

Типография БГТУ

190005, С.-Петербург, 1-я Красноармейская ул., д.1