2021-12-06 自动化专业C语言上机作业参考答案19

上机练习19

p314.c

/*编写一程序P314.C实现以下功能
  有一存储很多商品数据(每件商品的属性先后
包括:品名、规格、单价(有小数位)、数量,数据的最长长度分别为20、10、6、5,在文件中以空格为分隔,每个商品的数
据占一行)的文本文件,从键盘输入某种商品的品名,要求在文件中查找有无相应品名商品(可能有多条记录或没有),若有则
在屏幕上显示出相应的商品的品名、规格、数量、单价(显示时,品名、规格、数量、单价之间使用逗号(,)作分隔,单价显
示时只显示2位小数),若无则显示没有相应品名的商品。
  单击此处下载程序运行时测试用的商品数据文件sp.txt并保存到程序P314.C所在的文件夹且文件名保持不变。
编程可用素材:
printf("Please input shang pin pin ming:");
printf("\ncha zhao qing kuang:\n");
printf("mei you shang pin :);

文本文件中一行: xuebi da 6.00 345
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    FILE *fp;
    char name[21];
    char inputName[21];
    char size[11];
    float price;
    int number;
    int flag = 0;

    printf("Please input shang pin pin ming:");
    scanf("%s", inputName);
    // file open
    fp = fopen("sp.txt", "r");
    if (NULL == fp)
    {
        printf("file open error.\n");
        exit(1);
    }

    // find sp
    printf("\ncha zhao qing kuang:\n");
    while (fscanf(fp, "%s %s %f %d", name, size, &price, &number) == 4)
    {
        if (strcmp(inputName, name) == 0)
        {
            flag = 1;
            printf("%s,%s,%d,%.2f\n", name, size, number, price);
        }
    }
    if (flag == 0)
    {
        printf("mei you shang pin :%s", inputName);
    }

    // file close;
    fclose(fp);
    fp = NULL;

    return 0;
}

p320.c

/*
编写一程序P320.C实现以下功能
  在文本文件Comp.txt里有需要计算结果的整数算式,每个算式占一行且文件中只有一个算式,运算类型只有“加法(+)”或
者“减法(-)”且运算符前后至少有一个空格。计算该算式的结果并在屏幕上显示。
  单击此处下载程序运行时测试用的算式文件Comp.txt(加法示例,编程时还应考虑算式为减法的情况)并保存到程序P320.C所
在的文件夹且文件名保持不变。
编程可用素材:printf("%d + %d = %d\n"...、printf("%d - %d = %d\n"...。
*/
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int num1, num2;
    int result;
    char ch;
    FILE *fp;
    // 开文件
    fp = fopen("Comp.txt", "r");
    if (NULL == fp)
    {
        printf("file open error! \n");
        exit(1);
    }
    // 读,算
    while (3 == fscanf(fp, "%d %c %d", &num1, &ch, &num2))
    {
        if ('+' == ch)
        {
            result = num1 + num2;
            printf("%d + %d = %d\n", num1, num2, result);
        }
        else if ('-' == ch)
        {
            result = num1 - num2;
            printf("%d - %d = %d\n", num1, num2, result);
        }
        else
        {
            printf("operator error!\n");
            fclose(fp);
            exit(2);
        }
    }
    // 关文件
    fclose(fp);
    fp = NULL;

    return 0;
}

p321.c

/*
编写一程序P321.C实现以下功能
  在文本文件Comp.txt里有需要计算结果的整数算式,每个算式占一行且文件中有多个(数量不确定)算式,
运算类型只有“加法(+)”或者“减法(-)”且运算符前后至少有一个空格。计算这些算式的结果并在屏幕上显示。
  单击此处下载程序运行时测试用的算式文件Comp.txt并保存到程序P321.C所在的文件夹且文件名保持不变。
编程可用素材:printf("Line %03d:  %5d + %-5d = %-6d\n"...、printf("Line %03d:  %5d - %-5d = %-6d\n"...。
*/
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int num1, num2;
    int result;
    char ch;
    FILE *fp;
    int i = 0;
    // 开文件
    fp = fopen("Comp.txt", "r");
    if (NULL == fp)
    {
        printf("file open error! \n");
        exit(1);
    }
    // 读,算
    while (3 == fscanf(fp, "%d %c %d", &num1, &ch, &num2))
    {
        if ('+' == ch)
        {
            result = num1 + num2;
            // printf("%d + %d = %d\n", num1, num2, result);
            printf("Line %03d:  %5d + %-5d = %-6d\n", i + 1, num1, num2, result);
        }
        else if ('-' == ch)
        {
            result = num1 - num2;
            // printf("%d - %d = %d\n", num1, num2, result);
            printf("Line %03d:  %5d - %-5d = %-6d\n", i + 1, num1, num2, result);
        }
        else
        {
            printf("operator error!\n");
            fclose(fp);
            exit(2);
        }
        i++;
    }
    // 关文件
    fclose(fp);
    fp = NULL;

    return 0;
}

p322.c

/*
编写一程序P322.C实现以下功能
  在文本文件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. 读到空行: 计数器加,但不处理输出
    2. 读到非空行->错行: 计数器加,出输
    3. 读到非空行->可正常处理行: 计数器加,出输
    4. 读到末尾: 程序结束
*/
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *fp;
    int num1, num2;
    int result;
    char op;
    int i = 0;
    char line[201];

    // 开文件
    fp = fopen("Comp.txt", "r");
    if (NULL == fp)
    {
        printf("file open error!\n");
        exit(1);
    }
    // 读文件
    while (1)
    {
        // 读到末尾: 程序结束,如果已经读不到数据了,退出
        if (fgets(line, 200, fp) == NULL)
        {
            break;
        }
        // 读到了数据,分析,是不是出错行
        if (EOF == sscanf(line, "%d %c %d", &num1, &op, &num2)) // 是空行
        {
            // 不做处理,直接去计数
        }
        else // 不是空行
        {
            if (3 == sscanf(line, "%d %c %d", &num1, &op, &num2)) //可以刚好读到三个数,一定可以进行后面的判断
            {
                // 只算加和减
                if (op == '+')
                {
                    result = num1 + num2;
                    printf("Line %03d:  %5d + %-5d = %-6d\n", i + 1, num1, num2, result);
                }
                else if (op == '-')
                {
                    result = num1 - num2;
                    printf("Line %03d:  %5d - %-5d = %-6d\n", i + 1, num1, num2, result);
                }
                else
                {
                    printf("Line %03d: Error!\n", i + 1);
                }
            }
            else
            {
                printf("Line %03d: Error!\n", i + 1);
            }
        }
        i++;
    }

    // 关文件
    fclose(fp);
    fp = NULL;

    return 0;
}

p323.c

/*
编写一程序P323.C实现以下功能
  在文本文件Comp.txt里有需要计算结果的整数算式,每个算式占一行且文件中只有一个算式,
运算类型只有“加法(+)”、“减法(-)”、“乘法(*)”且运算符前后至少有一个空格。计算该算式的结果并在屏幕上显示。
  单击此处下载程序运行时测试用的算式文件Comp.txt并保存到程序P323.C所在的文件夹且文件名保持不变。
编程可用素材:printf("%d %c %d %c %d = %d\n"…。
*/
#include <stdio.h>
#include <stdlib.h>

// 完成按运算符进行运算
int calculate(int d1, char op, int d2);

int main(void)
{
    int num1, num2, num3;
    char op1, op2;
    int result;
    FILE *fp;

    // open file
    fp = fopen("Comp.txt", "r");
    if (NULL == fp)
    {
        printf("file open error!\n");
        exit(1);
    }
    // 读文件,进行处理
    while (5 == fscanf(fp, "%d %c %d %c %d", &num1, &op1, &num2, &op2, &num3))
    {
        // 第一个运算符对于运算顺序没有影响,第二个是*,则先算
        if (op2 == '*')
        {
            // 第二运算先算
            result = calculate(num2, op2, num3);
            result = calculate(num1, op1, result);
        }
        else
        {
            // 正常顺序运算
            result = calculate(num1, op1, num2);
            result = calculate(result, op2, num3);
        }
        // 算完即可输出
        printf("%d %c %d %c %d = %d\n", num1, op1, num2, op2, num3, result);
    }
    // close file
    fclose(fp);
    fp = NULL;

    return 0;
}

int calculate(int d1, char op, int d2)
{
    //只有“加法(+)”、“减法(-)”、“乘法(*)”
    if (op == '+')
    {
        return d1 + d2;
    }
    else if (op == '-')
    {
        return d1 - d2;
    }
    else
    {
        return d1 * d2;
    }
}

p324.c

/*
编写一程序P324.C实现以下功能
  在文本文件Comp.txt、CompA.txt、CompB.txt里有需要计算结果的整数算式,文件Comp.txt提供参加运算的第一个数,
文件CompA.txt提供进行运算的运算符(只有“加法(+)”或者“减法(-)”),文件CompB.txt提供参加运算的第二个数,每个数或
运算符均占一行,组合起来成为一个算式,遇到无法组成一个完整算式时即结束运算。这样的算式有多个(数量不确定)。
计算这些算式的结果并在屏幕上显示。
  单击下载程序运行时测试用的算式文件Comp.txt、CompA.txt、CompB.txt并保存到程序P324.C所在的文件夹且文件名
保持不变。编程可用素材:编程可用素材:printf("Line %03d:  %5d %c %-5d = %-6d\n"…。
*/
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int num1, num2;
    int result;
    char ch;
    FILE *fp1, *fp2, *fp3;
    int i = 0;
    // 开文件
    fp1 = fopen("Comp.txt", "r");
    if (NULL == fp1)
    {
        printf("file1 open error! \n");
        exit(1);
    }
    fp2 = fopen("CompA.txt", "r");
    if (NULL == fp2)
    {
        printf("file2 open error! \n");
        fclose(fp1);
        exit(1);
    }
    fp3 = fopen("CompB.txt", "r");
    if (NULL == fp3)
    {
        printf("file3 open error! \n");
        fclose(fp1);
        fclose(fp2);
        exit(1);
    }
    // 分别读三个文件,获取 数1,符号,数2,再运算
    // 注意,%c前多一个空格,清除上一次缓冲区里读入的空格,否则,下一个字符读取不正确
    while (1 == fscanf(fp1, "%d", &num1) && 1 == fscanf(fp2, " %c", &ch) && 1 == fscanf(fp3, "%d", &num2))
    {
        if ('+' == ch)
        {
            result = num1 + num2;
        }
        else if ('-' == ch)
        {
            result = num1 - num2;
        }
        else
        {
            printf("operator error!\n");
            fclose(fp1);
            fclose(fp2);
            exit(2);
        }
        printf("Line %03d:  %5d %c %-5d = %-6d\n", i + 1, num1, ch, num2, result);
        i++;
    }
    // 关文件
    fclose(fp1);
    fclose(fp2);
    fclose(fp3);
    fp1 = NULL;
    fp2 = NULL;
    fp3 = NULL;

    return 0;
}

p325.c

/*
编写一程序P325.C实现以下功能
  在文本文件Comp.txt、CompA.txt、CompB.txt里有需要计算结果的整数算式,文件Comp.txt提供参加运算的第一个
数,文件CompA.txt提供进行运算的运算符(只有“加法(+)”或者“减法(-)”),文件CompB.txt提供参加运算的第二个数,
每个数或运算符均占一行,组合起来成为一个算式,遇到无法组成一个完整算式时即结束运算。
这样的算式有多个(数量不确定)。计算这些算式的结果并将结果以文本文件格式保存到程序P325.C所在的文件夹中且文件名
命名为CompC.txt。
  单击下载程序运行时测试用的算式文件Comp.txt、CompA.txt、CompB.txt并保存到程序P325.C所在的文件夹且文件名
保持不变。编程可用素材:编程可用素材:fprintf(…"Line %03d:  %5d %c %-5d = %-6d\n"…。
*/
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int num1, num2;
    int result;
    char ch;
    FILE *fp1, *fp2, *fp3, *fp4;
    int i = 0;
    // 开文件
    fp1 = fopen("Comp3.txt", "r");
    if (NULL == fp1)
    {
        printf("file1 open error! \n");
        exit(1);
    }
    fp2 = fopen("CompA.txt", "r");
    if (NULL == fp2)
    {
        printf("file2 open error! \n");
        fclose(fp1);
        exit(1);
    }
    fp3 = fopen("CompB.txt", "r");
    if (NULL == fp3)
    {
        printf("file3 open error! \n");
        fclose(fp1);
        fclose(fp2);
        exit(1);
    }
    fp4 = fopen("CompC.txt", "w");
    if (NULL == fp3)
    {
        printf("file4 open error! \n");
        fclose(fp1);
        fclose(fp2);
        fclose(fp3);
        exit(1);
    }
    // 分别读三个文件,获取 数1,符号,数2,再运算
    // 注意,%c前多一个空格,清除上一次缓冲区里读入的空格,否则,下一个字符读取不正确
    while (1 == fscanf(fp1, "%d", &num1) && 1 == fscanf(fp2, " %c", &ch) && 1 == fscanf(fp3, "%d", &num2))
    {
        if ('+' == ch)
        {
            result = num1 + num2;
        }
        else if ('-' == ch)
        {
            result = num1 - num2;
        }
        else
        {
            printf("operator error!\n");
            exit(2);
        }
        // printf("Line %03d:  %5d %c %-5d = %-6d\n", i + 1, num1, ch, num2, result);
        fprintf(fp4, "Line %03d:  %5d %c %-5d = %-6d\n", i + 1, num1, ch, num2, result);
        i++;
    }
    // 关文件
    fclose(fp1);
    fclose(fp2);
    fclose(fp3);
    fclose(fp4);
    fp1 = NULL;
    fp2 = NULL;
    fp3 = NULL;
    fp4 = NULL;

    return 0;
}

p328.c

/*
编写一程序P328.C实现以下功能
  程序运行时,先从键盘输入一个文本文件的文件名(约定:字符数≤127字节,可含路径),再在屏幕上显示该文件的内容。
  单击此处下载程序运行时测试用的文件Test.txt。
编程可用素材:
printf("input the file's name: ");
printf("\nfile open error!");
printf("------------------------File Begin:----------------------\n");
printf("\n------------------------ File End. ----------------------\n");

*/
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char name[128];
    int chI;
    char ch;
    FILE *fp;

    printf("input the file's name: ");
    gets(name);
    fp = fopen(name, "r");
    if (NULL == fp)
    {
        printf("\nfile open error!");
        exit(1);
    }
    printf("------------------------File Begin:----------------------\n");
    while ((chI = fgetc(fp)) != EOF)
    {
        ch = (char)chI;
        putchar(ch);
    }
    printf("\n------------------------ File End. ----------------------\n");

    fclose(fp);
    fp = NULL;
    return 0;
}

p330.c

/*
编写一程序P330.C实现以下功能
  程序运行时,先从键盘输入一个文本文件的文件名(约定:字符数≤127字节,可含路径),再在屏幕上显示该文件的内容。
注意,对于文件中的字符*,在屏幕上改为显示字符@。
  单击此处下载程序运行时测试用的文件Test.txt。
编程可用素材:
printf("input the file's name: ");
printf("\nfile open error!");
printf("------------------------File Begin:----------------------\n");
printf("\n------------------------ File End. ----------------------\n");
*/
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char name[128];
    int chI;
    char ch;
    FILE *fp;

    printf("input the file's name: ");
    gets(name);
    fp = fopen(name, "r");
    if (NULL == fp)
    {
        printf("\nfile open error!");
        exit(1);
    }
    printf("------------------------File Begin:----------------------\n");
    while ((chI = fgetc(fp)) != EOF)
    {
        ch = (char)chI;
        if (ch == '*')
        {
            putchar('@');
        }
        else
        {
            putchar(ch);
        }
    }
    printf("\n------------------------ File End. ----------------------\n");

    fclose(fp);
    fp = NULL;
    return 0;
}

p796.c

/*
编写一程序P796.C实现以下功能
  在磁盘上新建一个文件Test.txt,将从键盘读入的多个字符存储到该文件中,要求如下:
  (1)若输入的字符中有小写字母,则应先将其转换为大写后再存入。
  (2)输入!表示输入结束且!不存入文件中。
  (3)当文件创建失败或向文件写入字符时出错,应显示指定的出错信息并终止程序的执行。
  (4)程序的返回值(即由main函数return的值和程序使用exit终止运行时返回的值,也称退出代码)规定为:
    ①入字运行正常返回0 ②文件创建失败返回1 ③向文件写符时出错返回2
  编程可用素材:
printf("\nCreate file error!\n");
printf("Input chars: ");
printf("\nWriting file error!\n");
*/
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *fp;
    char ch;
    // file open
    fp = fopen("Test.txt", "w");
    if (NULL == fp)
    {
        printf("\nCreate file error!\n");
        exit(1);
    }

    printf("Input chars: ");
    while (1)
    {
        ch = getchar();
        if ('!' == ch)
        {
            break;
        }
        if (ch >= 'a' && ch <= 'z')
        {
            ch -= 'a' - 'A'; // ch = ch - 32;
        }
        if ((fputc(ch, fp)) == EOF) // 注意,写入出错,才退出
        {
            printf("\nWriting file error!\n");
            fclose(fp);
            exit(2);
        }
    }

    // file close
    fclose(fp);
    fp = NULL;
    return 0;
}
  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值