四则运算——c语言
程序员文章站
2022-05-06 11:45:42
...
文章目录
四则运算——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