Создать файл чисел по правилу - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Дан текстовый файл, элементами которого есть числа типа double а1, а2... аn. Создать файл чисел типа double b1, b2,...,bn, где bii/(1+(a1+a2+...+an)2) , i=1,2,...,n Есть код, но заносить данные в файлы не хочет. Подскажите, пожалуйста, что не так
#include <stdio.h>
#include <iostream>
#include <math.h>
 
void CreateFile (const char *filename)
{   FILE *fp;
    double x;
    fp=fopen(filename,"w+b");
    if(!fp)
    {puts("File not open");
    exit (1);
    }
    printf("Enter numbers: ");
    scanf("%f",&x);
    while(x!=999)
    {fwrite(&x,sizeof(double),1,fp);
    scanf("%f",&x);
    }
    fclose(fp);
}
void PrintFile(const char *filename)
{   FILE *fp;
    double x;
    fp=fopen(filename, "r+b");
    fread(&x,sizeof(double),1,fp);
    while(!feof(fp))
    {printf("%f", x);
    printf(" ");
    fread(&x,sizeof(double),1,fp);
    }
    fclose(fp);
}
int main()
{   FILE *fp,*jp;
    char fname[128];
    char jname[128];
    double x, a, b=0,c=0;
    printf("Enter the name of file1: ");
    gets(fname);
    printf("Enter the name of file2");
    gets(jname);
    CreateFile(fname);
    PrintFile(fname);
    fp=fopen(fname,"r+b");
    jp=fopen(jname,"w+b");
    a=fread(&x,sizeof(double),1,fp);
    while(!feof(fp))
    {c+=a;
    b=a/(1+powf(c,2));
    fwrite(&b,sizeof(double),1,jp);
    a=fread(&x,sizeof(double),1,fp);
    }
    fclose(fp);
    printf("\nFile 2: \n");
    PrintFile(jname);
    fclose(jp);
    system("pause");
    return 0;
}

Решение задачи: «Создать файл чисел по правилу»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
#define ERR_USE 1
#define ERR_OPEN_FILE 2
 
int main(int argc, char *argv[])
{
    FILE *in, *out;
    double temp, denom;
 
    if(argc != 3){
        puts("Use: <name_prog> <in_file> <out_file>");
        exit(ERR_USE);
    }
 
    in = fopen(argv[1], "rt");
    if(!in) exit(ERR_OPEN_FILE);
 
    out = fopen(argv[2], "wt");
    if(!out) exit (ERR_OPEN_FILE);
 
    denom = 0.0;
    while(fscanf(in, "%lf", &temp) == 1)
        denom += temp;
    denom = denom * denom + 1;
    
    rewind(in);
 
    while(fscanf(in, "%lf", &temp) == 1)
        fprintf(out, "%.3lg\n", temp / denom); 
    
    fclose(in);
    fclose(out);
 
    return 0;
}

Объяснение кода листинга программы

  1. Подключение необходимых библиотек
  2. Объявление переменных:
    • temp - для хранения временного значения;
    • denom - для хранения числителя.
  3. Проверка корректности использования программы
    • Если аргументов больше или равно 3, то выводится сообщение об ошибке и программа завершается с кодом ошибки ERR_USE.
  4. Открытие файлов:
    • Входной файл в режиме чтения (rt);
    • Выходной файл в режиме записи (wt).
  5. Проверка на открытие файлов
    • Если файл не открылся, то программа завершается с кодом ошибки ERR_OPEN_FILE.
  6. Считывание чисел из входного файла в переменную temp и суммирование их
  7. Инициализация числителя denom результатом суммирования
  8. Переход к началу файла
  9. Запись в выходной файл значения temp, разделенного на denom, с точностью до трех знаков после запятой.
  10. Закрытие файлов
  11. Возврат 0, что означает успешное завершение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.308 из 5
Похожие ответы