Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- int f(char *name1, char *name2);
- double machine_epsilon(void);
- double machine_epsilon(void)
- {
- double eps = 1;
- while( (1 + eps/2)>1)
- eps /= 2;
- return eps;
- }
- /* Ф-ия, получающая имена двух файлов содержащих последовательности вещественных чисел a[i] и b[i],
- * возвращающая:
- * -2, если не удалось считать элемент из какого-то файла;
- * -1, если не удалось открыть какой-то файл;
- * 0, если какой-то элемент второй последовательности(кроме первого и последнего) не равен сумме
- * двух соседних из первого файла: b[i]!=(a[i - 1] + a[i + 1])/2 (*);
- * 1 в противном случае;
- * 2, если невозможно проверить условие (*) (т.е. для какого-то b[i] нет a[i + 1])
- * */
- int f(char *name1, char *name2)
- {
- FILE *a_file, *b_file;
- double a1, a2, a3, b1, b2, eps = machine_epsilon();
- if( ( !(a_file = fopen(name1, "r") )) || ( !(b_file = fopen(name2, "r")) ) )
- return -1;
- if(fscanf(b_file, "%lf%lf", &b1, &b2)!=2)
- {
- if(feof(b_file))
- {
- fclose(a_file);
- fclose(b_file);
- return 1;
- }
- fclose(a_file);
- fclose(b_file);
- return -2;
- }
- if(feof(b_file))
- {
- fclose(a_file);
- fclose(b_file);
- return 1;
- }
- if(fscanf(a_file, "%lf%lf", &a1, &a2)!=2)
- {
- if(feof(a_file))
- {
- fclose(a_file);
- fclose(b_file);
- return 2;
- }
- fclose(a_file);
- fclose(b_file);
- return -2;
- }
- if(feof(a_file))
- {
- fclose(a_file);
- fclose(b_file);
- return 2;
- }
- b1 = b2;
- while(fscanf(b_file, "%lf", &b2)==1)
- {
- if(fscanf(a_file, "%lf", &a3)!=1)
- {
- if(feof(a_file))
- {
- fclose(a_file);
- fclose(b_file);
- return 2;
- }
- fclose(a_file);
- fclose(b_file);
- return -2;
- }
- if( (b1 - (a1 + a3)/2)>eps )
- {
- fclose(a_file);
- fclose(b_file);
- return 0;
- }
- b1 = b2;
- a1 = a2;
- a2 = a3;
- }
- if(!feof(b_file))
- {
- fclose(a_file);
- fclose(b_file);
- return -2;
- }
- fclose(a_file);
- fclose(b_file);
- return 1;
- }
- int main(void)
- {
- char name1[256], name2[256];
- printf("Write filenames(name1, name2):\n");
- scanf("%s%s", name1, name2);
- printf("f(%s, %s) returned %d\n", name1, name2, f(name1, name2));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement