Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие С(часть1-3).doc
Скачиваний:
23
Добавлен:
12.02.2015
Размер:
854.02 Кб
Скачать

Int feof(file *stream);

Если индикатор позиции файла, связанного с потоком stream, расположен в конце файла возвращается ненулевое значение, в противном случае – нуль.

Для изменения индикатора позиции файла используют функцию

Int fseek ( file* stream, long offset, int origin);

Функция устанавливает индикатор позиции файла, связанного с потоком stream, в соответствии со значением смещенияoffset(количество байтов) и исходного положенияorigin. Параметр originможет принимать одно их следующих значений: 0 – начало файла, 1 – текущая позиция, 2 – конец файла. При успешном выполнении функция возвращает нулевое значение, при возникновении сбоя – ненулевое. Функция очищает признак конца файла. Вообще говоря, функциюfseek() следует использовать только при работе с двоичными файлами. При использовании же с текстовыми файлами параметрoriginдолжен иметь значение 0, а параметрoffset– значение, полученное в результате вызова функции

long ftell (FILE* stream);

которая возвращает текущее значение индикатора позиции файла.

Приведем фрагмент программы, считывающей из файлового потока fpкаждый третий символ

char a;

while ( fseek(fp,2,1)==0 && (a=fgetc(fp))!=EOF)

printf("%c%c",a,' ');

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

int a;

while(fseek(fp,ftell(fp),0)==0&&fscanf(fp,"%d",&a)!=EOF && fscanf(fp, "%d", &a)!=EOF)

printf("%d%c",a,' ');

Пример. Дан текстовый файл, строки которого содержат не более m (m<=20) символов. Считать строки и записать их в файл result.txt в порядке считывания, причем каждая строка должна быть «перевернута».

#include <stdio.h>

#include <stdio.h>

Void main ()

{

char filename[255];

printf("Введите имя файла: ");

scanf("%s",filename);

FILE *fp=fopen(filename,"r"); //открываем файл для чтения

if (fp!=NULL) // Если файл успешно открыт

{

FILE * fp1=fopen("result.txt","w");//Открываем для файл

// для записи

char s[20];// определяем массив для хранения

//считанной строки

while(fgets(s,21,fp)) //Цикл считывания строк

{

int l=strlen(s);

if (s[l-1]!='\n') fputc(s[l-1],fp1);

/*цикл записи символов строки в обратном порядке*/

for (int j=l-2; j>=0; j--) fputc(s[j],fp1); //

fputc('\n',fp1);//запись символа новой строки

}

fclose(fp);

fclose (fp1);

printf("Файл записан");

}

else printf("Не существует такого файла!");

getch();

}

Заметим, что запись считанной строки s в файл происходит, начиная с символа с индексом strlen(s)–2, так как последний символ строки это ноль–символ, а предпоследний – символ новой строки, который записывается в строку при ее чтении из файла функций fgets(). Однако исключение может составлять последняя строка файла, после которой в исходном файле может не стоять символа новой строки. Именно для последней строки в цикле введена проверка условия.

Каждому студенту рекомендуется выполнить хотя бы одно из упражнений 1–12 заданий 16-19.

Задание 16. Определение и вызов функций

  1. Определить функцию, проверяющую, является ли целое число совершенным. Совершенное число равно сумме всех своих делителей, включая единицу и не включая себя. Например 6=1+2+3 – совершенное число, 81+2+2+2 – несовершенное. Выяснить, сколько совершенных чисел находится в диапазоне [n..m] (n<m), вывести их на экран.

  2. Определить функции, переводящую число в двоичную систему счисления и проверяющую, является ли двоичная запись числа симметричной последовательностью нулей и единиц, начинающейся единицей. Напечатать все числа, не превосходящие n, двоичная запись которых есть симметричная последовательность.

  3. Определить функцию, посчитывающую количество инверсий в последовательности цифр натурального числа, то есть количество таких пар соседних цифр, в которых большая находится слева от меньшей. Из массива целых чисел, генерируемом случайным образом, вывести на экран сначала все числа, в записи которых нет инверсий, затем числа, в записи которых 1 инверсия и т.д. до чисел, имеющих максимальное число инверсий в данном массиве. Например, элементы массива {3564, 123, 24, 87, 981, 9871, 54} должны быть выведены следующим образом: 0 инверсий: 123, 24; 1 инверсия: 3564, 87,54; 2 инверсии: 981; 3 инверсии: 9871.

  4. Определить функцию, проверяющую, является ли заданная дробь несократимой. (Дробь задается двумя натуральными числами – числителем и знаменателем). Найти все несократимые дроби, заключенные между 0 и 1, знаменатели которых не превышают заданное число n.

  5. Определить функцию, проверяющую является ли число простым. Распечатать четверки простых чисел, не превосходящих n, принадлежащих одному десятку. Например, для числа 112 надо напечатать четверки 2 3 5 7; 11 13 17 19 ; 101 103 107 109.

  6. Определить функцию, возвращающую сумму простых делителей натурального числа. Найти все пары “дружественных” чисел в диапазоне [n1,n2]. Два натуральных числа называются “дружественными”, если одно из них равно сумме простых делителей другого.

  7. Определить функцию, проверяющую, является ли данное число простым. Составить программу для проверки гипотезы Гольдбаха о том, что каждое четное число, большее 2, можно представить суммой двух простых чисел. (Для любого четного k, не превосходящего n, выдать либо пару простых слагаемых, либо сообщение, что такого разложения нет).

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

  9. Определить функцию, проверяющую, является ли данное число простым, и функцию, подсчитывающую количество единиц в двоичной записи натурального числа. Найти все пары простых чисел, не превосходящих n, сумма единиц в двоичной записи которых совпадает. Например, такой парой является пара 3 (11) и 5 (101).

  10. Определить функцию для нахождения наименьшего общего кратного (НОК) и наибольшего общего делителя (НОД) двух натуральных чисел. Определить НОК и НОД для n введенных натуральных чисел.

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

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