Как правильно записать файл в текстовом формате? - C (СИ)

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

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

Как правильно записать файл в текстовом формате в языке Си? помогите пожалуйста исправить?
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
 
int M;
// S - sigma
int main(int argc, int *argv[])
{
    FIlE *file;
    file=fopen ("F:/C/norma.txt", "w");
 
    double A, S, a, h, tau, x;  
    int i, N, nt, k;
    double am2, am1, a0, ap1;
    double t=0.;
    double T=10.;
    double *u_new;
    double *u_old;
        
    fprintf("\n Enter the value of A: ");
    fscanf("%lf", &A);
    fprintf("\n Enter the value of M: ");
    fscanf("%d", &M);
    
    u_old = malloc(M*sizeof(double));
    u_new = malloc(M*sizeof(double));
    
    fprintf("\n Enter the value of S: ");
    fscanf("%lf",&S);
    fprintf("\n Enter the value of a: ");
    fscanf("%lf",&a);
    fprintf("\n Enter the value of am2: ");
    fscanf("%lf",&am2);
    fprintf("\n Enter the value of a0: ");
    fscanf("%lf",&a0);
    
// input of unsufficient coefficients       
 
    h = A / M;
    fprintf(h, "\n    h = %lf");
    tau = S*h/a;
    fprintf(tau, "\n  tau = %lf");
    fprintf(S, "\n    S = %lf\n");
    
    am1 = 0.5 * ((1. + S) - 3. * am2 - a0);
    ap1 = 0.5 * ((1. - S) - a0 + am2);
    
    fprintf(am2, "\n am2 = %lf"); 
    fprintf(am1, "\n am1 = %lf");   
    fprintf(a0, "\n  a0 = %lf");
    fprintf(ap1, "\n ap1 = %lf\n");
            
    initvalue (u_old, M, h, A, t, a);
    
    for (nt = 1; nt < M; nt++) {
    
        step (am2, am1, a0, ap1, S, t, tau, h, A, M, u_old, u_new);
    
        if (nt/10 == nt/10.) myoutput (h, M, u_new);
    
        norma (M, t, a, u_new); 
    }
    fclose(file);
    system("PAUSE");
    return;
}   
// insert defenition 
 
void step (double am2, double am1, double a0, double ap1, double S, double t, double tau, double h, double A, int M, double* u_old, double* u_new)  
{
    int i;
    int k;  
 
    for(k = 2; k <= M; k++) {
                
        u_new[k] = am2*u_old[k-2] + am1*u_old[k-1] + a0*u_old[k] + ap1*u_old[k+1];
}
        t += tau;
// insert output condition
     
    for (k = 0; k < M; k++) {
        
        u_old[k] = u_new[k];
    }
    for(k = 0; k <= M; k++)  fprintf (k * h, u_old[k], "\n x = %lf, u_old = %lf");
    
    return;
}
    
    void initvalue (double *ff, int M, double h, double A, double t, double a)
    {
        int i;
        double x;
    
        for(i = 0; i < M; i++) {
    
            x = i * h - a * t;
            if (x < 0.) x = A + x;
        
        if ((x <= 0.) && (x < A / 3.) ) {
        
            ff[i]=0.;
        }
        
        else if ((A / 3. <= x) && (x <= (2. * A) / 3.)) {
            
            ff[i]=1.;
        }
                    
        else if (((2. * A) / 3. < x) && (x <= A )) {
            
            ff[i]=0.;
        }
    }
    return;
    }
    void myoutput (double h, int M, double* u_new)
    {
        int j;
        for (j = 0; j <= M; j++)
        {
            fprintf (j * h, u_new[j], "\n x = %lf, u_new = %lf");
        }
        return;
    }
    void norma (int M, double t, double a, double* u_new)
    {
        int i;
        double norm1;
        double norm2;
        double norm3;
        double TVD;
        double* u_exact;
        double h;
        double A;
        double max;
        
        u_exact = malloc(M*sizeof(double));
        initvalue (u_exact, M, h, A, t, a);
        
        norm1 = 0.;
        for (i = 0; i <= M; i++) {
            if (fabs(u_new[M]) >= max) max = fabs(u_new[i]); 
        }
        norm1 = max;
    
        norm2 = 0.; TVD = 0.;
        for (i = 0; i <= M; i++) {
 
            norm2 += fabs(u_new[i] - u_exact[i]);
            TVD += fabs(u_new[i] - u_new[i-1]);
        }
        norm3 = 0.;
        for (i = 0; i <= M; i++) {
            norm3 += (u_new[i] - u_exact[i])*(u_new[i] - u_exact[i]);
          }
            norm3 = sqrt(norm3);
        
    fprintf (norm1, "\n norm1 = %f");
    fprintf (norm2, "\n norm2 = %f");
    fprintf (norm3, "\n norm3 = %f");
    fprintf (TVD, "\n TVD = %lf");
    
    return;
}

Решение задачи: «Как правильно записать файл в текстовом формате?»

textual
Листинг программы
#include "stdafx.h"
 
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
 
static int   M;
 
// S - sigma
 
// insert def__I__nition
// warning C4100: 'A' : unreferenced formal parameter
// warning C4100: 'S' : unreferenced formal parameter
void step(double am2,double am1,double a0,double ap1,double S,double t,double tau,double h,double A,int M,double* u_old,double* u_new)
{
   int   k;
 
   for (k = 2; k <= M; k++)
   {
      u_new[k] = am2 * u_old[k - 2] + am1 * u_old[k - 1] + a0 * u_old[k] + ap1 * u_old[k + 1];
   }
 
   t += tau;
   
   // insert output condition
   for (k = 0; k < M; k++)
   {
      u_old[k] = u_new[k];
   }
 
   for (k = 0; k <= M; k++)
   {
      printf("\n x = %lf, u_old = %lf",k * h,u_old[k]);
   }
}
 
void initvalue(double* ff,int M,double h,double A,double t,double a)
{
   int      i;
   double   x;
 
   for (i = 0; i < M; i++)
   {
      x = i * h - a * t;
 
      if (x < 0.0)
      {
         x = A + x;
      }
 
      if ((x <= 0.0) && (x < A / 3.0))
      {
         ff[i] = 0.0;
      }
      else if ((A / 3.0 <= x) && (x <= (2.0 * A) / 3.0))
      {
         ff[i] = 1.0;
      }
      else if (((2.0 * A) / 3.0 < x) && (x <= A))
      {
         ff[i] = 0.0;
      }
   }
}
 
void myoutput(double h,int M,double* u_new)
{
   for (int j = 0; j <= M; j++)
   {
      printf("\n x = %lf, u_new = %lf",j * h,u_new[j]);
   }
}
 
// warning C4700: local variable 'A' used without having been initialized
// warning C4700: local variable 'h' used without having been initialized
// warning C4701: local variable 'max' may be used without having been initialized
// warning C4700: local variable 'A' used without having been initialized
// warning C4700: local variable 'h' used without having been initialized
// warning C4701: local variable 'max' may be used without having been initialized
void norma(int M,double t,double a,double* u_new)
{
   int      i;
   double   norm1;
   double   norm2;
   double   norm3;
   double   TVD;
   double*  u_exact;
   double   h;
   double   A;
   double   max;
 
   u_exact = (double*)malloc(M * sizeof(double));
 
   initvalue(u_exact,M,h,A,t,a);
 
   norm1 = 0.0;
   
   for (i = 0; i <= M; i++)
   {
      if (fabs(u_new[M]) >= max)
      {
         max = fabs(u_new[i]);
      }
   }
 
   norm1 = max;
 
   norm2 = 0.0; 
   TVD   = 0.0;
 
   for (i = 0; i <= M; i++)
   {
      norm2 += fabs(u_new[i] - u_exact[i]);
      TVD   += fabs(u_new[i] - u_new[i - 1]);
   }
 
   norm3 = 0.0;
   
   for (i = 0; i <= M; i++)
   {
      norm3 += (u_new[i] - u_exact[i]) * (u_new[i] - u_exact[i]);
   }
 
   norm3 = sqrt(norm3);
 
   printf("\n norm1 = %f",norm1);
   printf("\n norm2 = %f",norm2);
   printf("\n norm3 = %f",norm3);
   printf("\n TVD = %lf",TVD);
}
 
// warning C4189: 'T' : local variable is initialized but not referenced
// warning C4101: 'x' : unreferenced local variable
// warning C4101: 'k' : unreferenced local variable
// warning C4101: 'N' : unreferenced local variable
 
int main()
{
   double   A, S, a, h, tau, x;
   int      N, nt, k;
   double   am2, am1, a0, ap1;
   double   t  = 0.0;
   double   T  = 10.0;
   double*  u_new;
   double*  u_old;
 
   printf("\n Enter the value of A: ");
   scanf("%lf",&A);
   printf("\n Enter the value of M: ");
   scanf("%d",&M);
 
   u_old = (double*)malloc(M * sizeof(double));
   u_new = (double*)malloc(M * sizeof(double));
 
   printf("\n Enter the value of S: ");
   scanf("%lf",&S);
   printf("\n Enter the value of a: ");
   scanf("%lf",&a);
   printf("\n Enter the value of am2: ");
   scanf("%lf",&am2);
   printf("\n Enter the value of a0: ");
   scanf("%lf",&a0);
 
   // input of unsufficient coefficients
   h = A / M;
 
   printf("\n h = %lf",h);
   
   tau = S * h / a;
   
   printf("\n tau = %lf",tau);
   printf("\n S = %lf\n",S);
 
   am1 = 0.5 * ((1. + S) - 3.0 * am2 - a0);
   ap1 = 0.5 * ((1. - S) - a0 + am2);
 
   printf("\n am2 = %lf",am2);
   printf("\n am1 = %lf",am1);
   printf("\n a0 = %lf",a0);
   printf("\n ap1 = %lf\n",ap1);
 
   initvalue(u_old,M,h,A,t,a);
 
   for (nt = 1; nt < M; nt++)
   {
      step(am2,am1,a0,ap1,S,t,tau,h,A,M,u_old,u_new);
 
      if (nt / 10 == nt / 10.0)
      {
         myoutput(h,M,u_new);
      }
 
      norma(M,t,a,u_new);
   }
 
   return 0;
}

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

  1. Ввод и вывод данных в формате double: В данном коде используются функции scanf и printf для ввода и вывода данных в формате double. Например, для ввода значений переменных A, S, a, am2, a0, ap1, M, h, tau используется функция scanf с параметром %lf, который указывает на формат ввода double. Для вывода значений переменных u_old и u_new используется функция printf с параметром %lf, который указывает на формат вывода double.
  2. Вычисление значения h: Значение переменной h вычисляется как A / M. Это делается для того, чтобы определить шаг по времени и пространству в процессе решения задачи.
  3. Вычисление значения tau: Значение переменной tau вычисляется как S * h / a. Это делается для определения временного шага, который используется в процессе решения задачи.
  4. Вычисление значений am1 и ap1: Значения переменных am1 и ap1 вычисляются с использованием численных значений S, a0 и am2. Это делается для определения коэффициентов, используемых в процессе решения задачи.
  5. Инициализация начального приближения u_old: Переменная u_old инициализируется с использованием функции initvalue. Эта функция принимает на вход массив u_old, размерность M, значение h, A, t и a. Она инициализирует значения u_old в соответствии с условиями задачи.
  6. Цикл для решения задачи: В цикле используется функция step для вычисления значений u_new на каждом шаге. Функция step принимает на вход значения am2, am1, a0, ap1, S, t, tau, h, A, M и массивы u_old и u_new. После каждого шага значения u_old заменяются значениями u_new.
  7. Вывод результатов: Для вывода результатов используется функция myoutput, которая принимает на вход значения h, M и массив u_new. Она выводит значения x и u_new для каждого шага.
  8. Вычисление значений norm1, norm2 и norm3: Значения norm1, norm2 и norm3 вычисляются с использованием функций norma. Norma принимает на вход значения M, t, a и массив u_new. Она вычисляет значения norm1, norm2 и norm3, которые представляют собой различные меры точности решения задачи.
  9. Инициализация и освобождение памяти: Для работы с массивами u_old и u_new используется функция malloc для выделения памяти и функция free для освобождения памяти. Перед завершением программы необходимо убедиться, что вся выделенная память освобождена.

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


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

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

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