Как правильно записать файл в текстовом формате? - 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 для освобождения памяти. Перед завершением программы необходимо убедиться, что вся выделенная память освобождена.