上机练习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;
}