你应该不介意再帮我几个问题噶?1.在文本文件Comp.txt里有需要计算结果的整数算式,每个算式占一行且文件中有多个算式

1个回答

  • 第 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