欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

四则运算——c语言

程序员文章站 2022-05-06 11:45:42
...

四则运算——c语言

题目

有个文件大小不确定,每行内容都是一个四则运算表达式,还没有算出结果,写一个程序,自动算出其结果后修改文件。
四则运算——c语言

生成

设置随机数种,生成随机数。练习使用fputc函数

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#include <time.h>

/*
1、以写方式打开文件 判断文件
2、定义 三个变量  字符串
3、循环100次
4、格式化字符串
5、录入内容
6、文件关闭
循环四则运算100次
char arr[20]
sprintf(arr,"%d%c%d=\n",a,c,b);
while(arr!='\0')
{

}
3*2=
5/2=
3-1=
4+6=
*/
enum MyEnum
{
	add, sub, mlt, dive
}opt;
int main6001()
{
	srand((unsigned int)time(NULL));
	FILE* fp = fopen("C:\\Users\\MagicBook\\Desktop\\vshello\\a.txt", "w");
	if (!fp)
		return -1;

	int a, b;
	char c;
	char buf[20];

	for (int i = 0; i < 100; i++)
	{
		switch (rand() % 4)
		{
		case add:
			c = '+';
			break;
		case sub:
			c = '-';
			break;
		case mlt:
			c = '*';
			break;
		case dive:
			c = '/';
			break;
		}
		a = rand() % 10 + 1;//2
		b = rand() % 10 + 1;//3
		memset(buf, 0, 20);
		sprintf(buf, "%d%c%d=\n", a, c, b);//2*3=\n
		int j = 0;
		while (buf[j])
			fputc(buf[j++], fp);
	}
	fclose(fp);

	system("pause");
	return EXIT_SUCCESS;
}

读取计算

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>


/*
1、打开两个文件 c.txt e.txt
2、判断可用性
3、循环读取
4、格式化字符串  sscanf()   计算结果
5、放到e.txt文件中
6、文件关闭

*/
int main09()
{
	FILE* fp1 = fopen("../../c.txt", "r");
	FILE* fp2 = fopen("../../e.txt", "w");

	if (!fp1 || !fp2)
		return -1;

	//循环100次
	int a, b;
	float value = 0;
	char c;

	char buf[20];
	for (int i = 0; i < 100; i++)
	{
		memset(buf, 0, 20);
		fgets(buf, 20, fp1);//2+3=\n
		sscanf(buf, "%d%c%d=\n", &a, &c, &b);

		switch (c)
		{
		case '+':
			value = a + b;
			break;
		case '-':
			value = a - b;
			break;
		case '*':
			value = a * b;
			break;
		case '/':
			value = a * 1.0 / b;
			break;
		}
		//将格式化好的字符串写入文件中
		//memset(buf, 0, 20);
		//sprintf(buf, "%d%c%d=%.2f\n", a, c, b, value);
		//fputs(buf, fp2);
		fprintf(fp2, "%d%c%d=%.2f\n", a, c, b, value);
	}


	fclose(fp1);
	fclose(fp2);

	system("pause");
	return EXIT_SUCCESS;
}

sscanf 说明,C 库函数 int sscanf(const char *str, const char *format, ...) 从字符串读取格式化输入。
fprintf 说明,C 库函数int fprintf(FILE *stream, const char *format, ...)发送格式化输出到流 stream 中。

读取计算——二级指针版

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>


/*
1、打开文件  判断可用性
2、读取内容 再放堆空间中  关闭文件
3、再次打开文件 读取堆空间内容 写入文件中  关闭文件
//{"2+3=4\n","4*5=9\n",""}
//char * buf[100];  buf[1]
//char ** buf = (char **)malloc(sizeof(char *)*100);
//buf[i] = (char *)malloc(sizeof(char)*20);
*/
int main12()
{
	FILE* fp = fopen("../../c.txt", "r+");
	if (!fp)
		return -1;

	char** buf = (char**)malloc(sizeof(char*) * 100);

	int a, b;
	char c;
	float value;
	for (int i = 0; i < 100; i++)
	{
		buf[i] = (char*)malloc(sizeof(char) * 20);
		//格式化读取
		fscanf(fp, "%d%c%d=\n", &a, &c, &b);
		switch (c)
		{
		case '+':
			value = a + b;
			break;
		case '-':
			value = a - b;
			break;
		case '*':
			value = a * b;
			break;
		case '/':
			value = a * 1.0 / b;
			break;
		}
		sprintf(buf[i], "%d%c%d=%.2f\n", a, c, b, value);
		//fgets(buf[i], 20, fp);

	}
	fclose(fp);

	//将结果重新写入c.txt
	fp = fopen("../../c.txt", "r+");
	if (!fp)
		return -1;

	for (int i = 0; i < 100; i++)
		fputs(buf[i], fp);
	fclose(fp);


	//内存释放
	for (int i = 0; i < 100; i++)
	{
		free(buf[i]);
		buf[i] = NULL;
	}
	free(buf);




	return EXIT_SUCCESS;
}

读取计算——指针+结构体版

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct opter
{
	int a;//4
	int b;//4
	char c;//1
	float value;//4
};
typedef struct opter opt;

int main13()
{
	opt* p = (opt*)malloc(sizeof(opt) * 100);
	FILE* fp = fopen("../../c.txt", "r+");//"r+"打开一个用于更新的文件,可读取也可写入。该文件必须存在。
	if (!fp)
		return -1;
	for (int i = 0; i < 100; i++)
	{
		fscanf(fp, "%d%c%d=\n", &(p + i)->a, &p[i].c, &p[i].b);
		switch (p[i].c)
		{
		case '+':
			p[i].value = p[i].a + p[i].b;
			break;
		case '-':
			p[i].value = p[i].a - p[i].b;
			break;
		case '*':
			p[i].value = p[i].a * p[i].b;
			break;
		case '/':
			p[i].value = p[i].a * 1.0 / p[i].b;
			break;
		}
	}

	fclose(fp);


	fp = fopen("../../c.txt", "r+");
	if (!fp)
		return -1;

	for (int i = 0; i < 100; i++)
		fprintf(fp, "%d%c%d=%.2f\n", p[i].a, p[i].c, p[i].b, p[i].value);
	fclose(fp);

	free(p);

	system("pause");
	return EXIT_SUCCESS;
}

C 库函数

C 库函数 - fputc()

描述

C 库函数 int fputc(int char, FILE *stream) 把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。

声明

下面是 fputc() 函数的声明。

int fputc(int char, FILE *stream)

参数

  • char – 这是要被写入的字符。该字符以其对应的 int 值进行传递。
  • stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符的流。

返回值

如果没有发生错误,则返回被写入的字符。如果发生错误,则返回 EOF,并设置错误标识符。

实例

下面的实例演示了 fputc() 函数的用法。

#include <stdio.h>
 
int main ()
{
   FILE *fp;
   int ch;
 
   fp = fopen("file.txt", "w+");
   for( ch = 33 ; ch <= 100; ch++ )
   {
      fputc(ch, fp);
   }
   fclose(fp);
 
   return(0);
}

让我们编译并运行上面的程序,这将在当前目录中创建文件 file.txt,它的内容如下:

!"#$%&'()*+,-./0123456789:;<=>aaa@qq.com[\]^_`abcd

现在让我们使用下面的程序查看上面文件的内容:

#include <stdio.h>
 
int main ()
{
   FILE *fp;
   int c;
 
   fp = fopen("file.txt","r");
   while(1)
   {
      c = fgetc(fp);
      if( feof(fp) )
      {
          break ;
      }
      printf("%c", c);
   }
   fclose(fp);
   return(0);
}

C 库函数 - sprintf()

描述

C 库函数 int sprintf(char *str, const char *format, …) 发送格式化输出到 str 所指向的字符串。

声明

下面是 sprintf() 函数的声明。

int sprintf(char *str, const char *format, ...)

参数

  • str – 这是指向一个字符数组的指针,该数组存储了 C 字符串。
  • format – 这是字符串,包含了要被写入到字符串 str 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是%[flags][width][.precision][length]specifier,具体讲解如下:
specifier(说明符) 输出
c 字符
d 或 i 有符号十进制整数
e 使用 e 字符的科学科学记数法(尾数和指数)
E 使用 E 字符的科学科学记数法(尾数和指数)
f 十进制浮点数
g 自动选择 %e 或 %f 中合适的表示法
G 自动选择 %E 或 %f 中合适的表示法
o 有符号八进制
s 字符的字符串
u 无符号十进制整数
x 无符号十六进制整数
X 无符号十六进制整数(大写字母)
p 指针地址
n 无输出
% 字符
flags(标识) 描述
- 在给定的字段宽度内左对齐,默认是右对齐(参见 width 子说明符)。
+ 强制在结果之前显示加号或减号(+ 或 -),即正数前面会显示 + 号。默认情况下,只有负数前面会显示一个 - 号。
(space) 如果没有写入任何符号,则在该值前面插入一个空格。
# 与 o、x 或 X 说明符一起使用时,非零值前面会分别显示 0、0x 或 0X。 与 e、E 和 f 一起使用时,会强制输出包含一个小数点,即使后边没有数字时也会显示小数点。默认情况下,如果后边没有数字时候,不会显示显示小数点。 与 g 或 G 一起使用时,结果与使用 e 或 E 时相同,但是尾部的零不会被移除。
0 在指定填充 padding 的数字左边放置零(0),而不是空格(参见 width 子说明符)。
width(宽度) 描述
(number) 要输出的字符的最小数目。如果输出的值短于该数,结果会用空格填充。如果输出的值长于该数,结果不会被截断。
* 宽度在 format 字符串中未指定,但是会作为附加整数值参数放置于要被格式化的参数之前。
.precision(精度) 描述
.number 对于整数说明符(d、i、o、u、x、X):precision 指定了要写入的数字的最小位数。如果写入的值短于该数,结果会用前导零来填充。如果写入的值长于该数,结果不会被截断。精度为 0 意味着不写入任何字符。 对于 e、E 和 f 说明符:要在小数点后输出的小数位数。 对于 g 和 G 说明符:要输出的最大有效位数。 对于 s: 要输出的最大字符数。默认情况下,所有字符都会被输出,直到遇到末尾的空字符。 对于 c 类型:没有任何影响。 当未指定任何精度时,默认为 1。如果指定时不带有一个显式值,则假定为 0。
.* 精度在 format 字符串中未指定,但是会作为附加整数值参数放置于要被格式化的参数之前。
length(长度) 描述
h 参数被解释为短整型或无符号短整型(仅适用于整数说明符:i、d、o、u、x 和 X)。
l 参数被解释为长整型或无符号长整型,适用于整数说明符(i、d、o、u、x 和 X)及说明符 c(表示一个宽字符)和 s(表示宽字符字符串)。
L 参数被解释为长双精度型(仅适用于浮点数说明符:e、E、f、g 和 G)。
  • 附加参数 – 根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。

返回值

如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。

实例

下面的实例演示了 sprintf() 函数的用法。

#include <stdio.h>
#include <math.h>

int main()
{
   char str[80];

   sprintf(str, "Pi 的值 = %f", M_PI);
   puts(str);
   
   return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:

Pi 的值 = 3.141593

资料

https://www.runoob.com/cprogramming/c-function-sprintf.html