Как правильно записать файл в текстовом формате? - 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; }
Объяснение кода листинга программы
- Ввод и вывод данных в формате double:
В данном коде используются функции scanf и printf для ввода и вывода данных в формате double. Например, для ввода значений переменных A, S, a, am2, a0, ap1, M, h, tau используется функция scanf с параметром
%lf
, который указывает на формат ввода double. Для вывода значений переменных u_old и u_new используется функция printf с параметром%lf
, который указывает на формат вывода double. - Вычисление значения h: Значение переменной h вычисляется как A / M. Это делается для того, чтобы определить шаг по времени и пространству в процессе решения задачи.
- Вычисление значения tau: Значение переменной tau вычисляется как S * h / a. Это делается для определения временного шага, который используется в процессе решения задачи.
- Вычисление значений am1 и ap1: Значения переменных am1 и ap1 вычисляются с использованием численных значений S, a0 и am2. Это делается для определения коэффициентов, используемых в процессе решения задачи.
- Инициализация начального приближения u_old: Переменная u_old инициализируется с использованием функции initvalue. Эта функция принимает на вход массив u_old, размерность M, значение h, A, t и a. Она инициализирует значения u_old в соответствии с условиями задачи.
- Цикл для решения задачи: В цикле используется функция step для вычисления значений u_new на каждом шаге. Функция step принимает на вход значения am2, am1, a0, ap1, S, t, tau, h, A, M и массивы u_old и u_new. После каждого шага значения u_old заменяются значениями u_new.
- Вывод результатов: Для вывода результатов используется функция myoutput, которая принимает на вход значения h, M и массив u_new. Она выводит значения x и u_new для каждого шага.
- Вычисление значений norm1, norm2 и norm3: Значения norm1, norm2 и norm3 вычисляются с использованием функций norma. Norma принимает на вход значения M, t, a и массив u_new. Она вычисляет значения norm1, norm2 и norm3, которые представляют собой различные меры точности решения задачи.
- Инициализация и освобождение памяти: Для работы с массивами u_old и u_new используется функция malloc для выделения памяти и функция free для освобождения памяти. Перед завершением программы необходимо убедиться, что вся выделенная память освобождена.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д