你应该不介意再帮我几个问题噶?1.在文本文件Comp.txt里有需要计算结果的整数算式,每个算式占一行且文件中有多个算式,运算类型只有“加法(+)”或者“减法(-)”且运算符前后至少有一个空格

来源:学生作业帮助网 编辑:作业帮 时间:2024/11/27 13:00:12
你应该不介意再帮我几个问题噶?1.在文本文件Comp.txt里有需要计算结果的整数算式,每个算式占一行且文件中有多个算式,运算类型只有“加法(+)”或者“减法(-)”且运算符前后至少有一个空格
xXOWqaEbؘ"JXEU'ز6! 1Iy%<`HCYcc_S{x6vEf=;;r~ gM93#H LZx̻b%UƕWt"xq|ZY,$ԭ'jz^,Sެ^(PQSvSPPק&gv@ xep,Q!$q,&VԚq氟&^+ jbSHQ|'g3u#{`hgVY;^Lw'sU=y)gApy V!̔t\:i~L$񜲳7FLR o8xTw soNܚ3 ;Kxbyg2$so ³3 L?zԒp@$SzWhHmu!ID.OW o9+9O6fwZ$Y9(|tW0^>! #aTxzAwsKy\`{ak^xE6-m-&_&wKd 69B1Wȭ*Yxd(]٩VNs+( RV-ƙtӶLF6`6NeKS>\{">g&-Ga -,+6~ɚ()NukXB0 ˾ =0vݔ]%mGBEb(xã!JE1f7o '"D__xx"Yr pFQ_D8HS]*?+%btUtէjBAdmA /{' qQk4 d?CHhu8L S$vk,R)FߎNq_ L)g6 ⬲ȲWѷߖPDQbս+<5g uZ ERBT6 nH̚2jjƥig#6c} G.h‘{߮΋?l%>ph4`T)1I?I3[9L/_0W *\W/oK"9ڌzOᰠH賂lk85hd!Ȍ/\\;rH%XF QJ=J=i|_|S xZ:@ΊP*`2TE\uce5 j9}#qhPc `]pcֲgU} BHU 6I€x>(OunuD A |my`4#1Dl:yP`8"J6Lh4nb P I8"zӨ>uԕ۫pQ ur J_l@PO#V#kx}jR41Tr Vחx^

你应该不介意再帮我几个问题噶?1.在文本文件Comp.txt里有需要计算结果的整数算式,每个算式占一行且文件中有多个算式,运算类型只有“加法(+)”或者“减法(-)”且运算符前后至少有一个空格
你应该不介意再帮我几个问题噶?
1.在文本文件Comp.txt里有需要计算结果的整数算式,每个算式占一行且文件中有多个算式,运算类型只有“加法(+)”或者“减法(-)”且运算符前后至少有一个空格.计算这些算式的结果并在屏幕上显示.
  单击此处下载程序运行时测试用的算式文件Comp.txt并保存到程序P321.C所在的文件夹且文件名保持不变.编程可用素材:printf("Line %03d:%5d + %-5d = %-6d\n"...、printf("Line %03d:%5d - %-5d = %-6d\n".
  程序的运行效果应类似地如图1所示.
Line 001:123 + 556 = 679
Line 002:300 - 215 = 85
Line 003:1001 - 18976 = -17975
Line 004:9123 + 5156 = 14279
图1 程序运行效果示例(使用系统提供的测试用算式文件Comp.txt)
2.在文本文件Comp.txt里有需要计算结果的整数算式,每个算式占一行且文件中有多个算式,运算类型只有“加法(+)”或者“减法(-)”且运算符前后至少有一个空格——但其中可能有空行和不符合要求的算式(但其行长肯定不超过200字节).计算这些算式的结果并在屏幕上显示,空行不作任何处理,不符合要求的算式则显示Error!.
  单击此处下载程序运行时测试用的算式文件Comp.txt并保存到程序P322.C所在的文件夹且文件名保持不变.编程可用素材:printf("Line %03d:Error!\n"...、printf("Line %03d:%5d + %-5d = %-6d\n"...、printf("Line %03d:%5d - %-5d = %-6d\n".
  ▲ 提示:建议使用fgets读入一行到字符串、再使用sscanf从字符串中读,如此逐行处理!
  程序的运行效果应类似地如图1所示.
Line 001:123 + 556 = 679
Line 002:300 - 215 = 85
Line 004:1001 - 18976 = -17975
Line 005:Error!
Line 007:9123 + 5156 = 14279
Line 008:Error!
Line 009:Error!
Line 010:Error!
Line 011:9901 + 355 = 10256
图1 程序运行效果示例(使用系统提供的测试用算式文件Comp.txt)
3.  方阵的主对角线之上称为“上三角”,设计一个用于填充n(n从键盘读入,约定其取值范围为3~20)阶方阵的上三角区域的程序.填充的规则是:使用1,2,3……的自然数列,从左上角开始,按照顺时针方向螺旋填充.输出时要求每个数据宽度为4、右对齐.编程可用素材:printf("Please input n:")、printf("\nResult is:\n")、printf("%4d"...、printf("\n").
  程序的运行效果应类似地如图1所示,图1中的第1个6是从键盘输入的内容.
Please input n:6Result is:
1 2 3 4 5 6
15 16 17 18 7
14 21 19 8
13 20 9
12 10
11
图1 程序运行效果示例

你应该不介意再帮我几个问题噶?1.在文本文件Comp.txt里有需要计算结果的整数算式,每个算式占一行且文件中有多个算式,运算类型只有“加法(+)”或者“减法(-)”且运算符前后至少有一个空格
第 2 题可视为在第 1 题的基础上,考虑了异常情况的处理,因此可以合并为一个问题.也就是说,第 2 题的代码可以直接作为第 1 题的答案.代码如下:
#include
#include
#include
#include
#define N 512
int readInt(char** pstr, int* pa, char* des)
{
char* str = *pstr;
int flagOver = 0;
char stra[N];
while (*str != 0) {
switch(*str) {
case ' ':
if (flagOver) {
sprintf(stra, "%d ", *pa);
strcat(des, stra);
*pstr = str;
return 0;
} else {
str++;
}
break;
case '\n':
case '=':
if (flagOver) {
sprintf(stra, "%d ", *pa);
strcat(des, stra);
*pstr = str;
return 0;
} else {
return 2;
}
break;
default:
if (!isdigit(*str)) {
if (*str != '-' || flagOver != 0)
return 1;
} else if (flagOver == 0) {
sscanf(str, "%d", pa);
flagOver = 1;
}
str++;
break;
}
}
return 2;
}
int readOp(char** pstr, char* pop, char* des)
{
char* str = *pstr;
char op[3];
while (*str != 0) {
switch(*str) {
case ' ':
str++;
break;
case '\n':
case '=':
return 2;
break;
case '+':
case '-':
sscanf(str, "%c", pop);
sprintf(op, "%c ", *pop);
strcat(des, op);
str++;
*pstr = str;
return 0;
break;
default:
return 1;
break;
}
}
return 2;
}
int calcOneLine(char* str, char* des, int* piLine)
{
int a, b;
char op;
int flag;
printf("Line %03d:\t", ++(*piLine));
flag = readInt(&str, &a, des);
if (flag == 1) {
printf("Error!\n");
return 0;
}
if (flag == 2) {
printf("\n");
return 0;
}
while (str[0] != 0) {
flag = readOp(&str, &op, des);
if (flag == 1) {
printf("Error!\n");
return 0;
}
if (flag == 2) {
printf("%s= %d\n", des, a);
break;
}
flag = readInt(&str, &b, des);
if (flag) {
printf("Error!\n");
return 0;
}
if (op == '+')
a = a+b;
else
a = a-b;
}
return 0;
}
int main()
{
char filename[] = "Comp.txt";
FILE *fp = NULL;
char buf[N], des[N];
int iLine = 0;
fp = fopen(filename, "r");
if (fp == NULL) {
printf("Error: Cannot open file %s.\n", filename);
exit(1);
}
while ( !feof(fp) ) {
des[0] = 0;
buf[0] = 0;
fgets(buf, N-1, fp);
if (buf[0] != 0)
calcOneLine(buf, des, &iLine);
}
fclose(fp);
return 0;
}
若测试文件 Comp.txt 内容如下:
123 + 556
300 - 215
1001 - 18976
9123 + 5156
9123 + 5156 - 3
9123 + 5156 - 3 =
9123+ m5156 - 3
9123 * 5156 - 3
则运行程序,输出如下:
Line 001: 123 + 556 = 679
Line 002: 300 - 215 = 85
Line 003: 1001 - 18976 = -17975
Line 004: 9123 + 5156 = 14279
Line 005:
Line 006: 9123 + 5156 - 3 = 14276
Line 007: 9123 + 5156 - 3 = 14276
Line 008: Error!
Line 009: Error!
Line 010:
第 3 题程序代码如下:
#include
#include
#include
#define CALLOC(ARRAY, NUM, TYPE) {\
ARRAY = (TYPE*) calloc(NUM, sizeof(TYPE));\
if (ARRAY == NULL) {\
printf("File: %s, Line: %d: ", __FILE__, __LINE__); \
printf("Allocating memory failed.\n");\
exit(0);\
} else { \
memset(ARRAY, 0, NUM*sizeof(TYPE));\
} \
}
int main()
{
int n;
int** a=NULL;
int i, j, k, max;
int dir;
do {
printf("Please input n: ");
scanf("%d", &n);
} while (n