第 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= %dn", 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