练习题目是某高校的考研专业课题目,题解都是自己写的,如果有错误,或者更优解,将会十分感谢能够指出
1.某文本文件records.txt存放了某公司30位员工的打卡次数,格式如下
工号 姓名 次数
S1001 张三 25
S1002 李四 20
......
编写程序,输出打卡次数最多的员工的工号、姓名和打卡次数。注意:打卡次数最多的员工可能不唯一,这时候要把他们都输出
#include "stdio.h"
#include "string.h"
typedef struct
{
char id[10]; //工号
char name[10]; //姓名
int count; //打卡次数
}recordInfo_TypeDef;
recordInfo_TypeDef buf[30];
int main(int argc, char *argv[])
{
char temp_count[3]; //暂存储打卡次数
char temp[30] = {0}; //存储打卡次数最多的在数组中的序号
int i = 0,k =0;
FILE *fp = fopen("F:\\records.txt", "r");
if (fp == NULL)
{
perror("Open Fail");
}
else
{
while (!feof(fp))
{
buf[i].count = 0; //初始化打卡次数为0
fscanf(fp, "%s%s%s", buf[i].id, buf[i].name, temp_count); //从文件中读取,按照工号,姓名,打卡次数的格式
for (int j = 0; temp_count[j] != '\0'; j++) //文件中储存的是字符串形式,此for循环的作用为将打卡次数字符串形式转变为数字
buf[i].count = buf[i].count * 10 + (temp_count[j] - '0');
if (i > 0)
{
if (buf[i].count < buf[temp[0]].count)
continue;
else if (buf[i].count == buf[temp[0]].count)
temp[++k] = i;
else if (buf[i].count > buf[temp[0]].count)
{
memset(temp, 0, sizeof(temp));
temp[0] = i;
}
}
i++;
}
fclose(fp);
for (i = 0; temp[i] != 0; i++)
{
printf("%s %s %d\n", buf[temp[i]].id,buf[temp[i]].name,buf[temp[i]].count);
}
}
return 0;
}
2.有一个文本文件numbers.txt,其中有20个整数,每个整数占一行。编写程序将这些整数按照从小到大的顺序排好后,重新写入到该文件中。要求在排序前后分别输出该文件内容
#include "stdio.h"
#include "string.h"
int main(int argc, char * argv[])
{
int temp = 0;
char nums[20] = { 0 };
int numbers[20] = {0}; //将文件中的整数暂存在数组
int len = 0; //用来表示有多少行
memset(numbers, 0, sizeof(numbers));
FILE *fp = fopen("F:\\records.txt", "r");
if (fp == NULL)
{
perror("Open Error");
}
else
{
printf("排序前的整数顺序为:");
while (!feof(fp))
{
fscanf(fp, "%s", nums);
if (nums[0] == '-') //表示负数
{
for (int j = 1; nums[j] != '\0'; j++)
numbers[len] = numbers[len] * 10 + (nums[j]-48);
numbers[len] = -1 * numbers[len];
}
else
{
for (int j = 0; nums[j] != '\0'; j++)
numbers[len] = numbers[len] * 10 + (nums[j]-48);
}
printf("%d, \n",numbers[len]);
len++;
}
fclose(fp);
}
/*冒泡排序*/
for (int j = 0; j < len - 1; j++)
{
for (int k = 0; k < (len - 1); k++)
{
if (numbers[k] > numbers[k + 1])
{
temp = numbers[k];
numbers[k] = numbers[k + 1];
numbers[k + 1] = temp;
}
}
}
fp = fopen("F:\\records.txt", "w");
printf("\n排序后的整数顺序为:");
for (int j = 0; j < len; j++)
{
printf("%d, ", numbers[j]);
fprintf(fp, "%d\n", numbers[j]);
}
fclose(fp);
return 0;
}
3.某商店用二进制文件来存储商品信息,包括商品编号(长度为10的字符串)、商品名称(长度为20的字符串)、单价和数量。编写程序完成以下功能
1.输入商品信息,将它们存到二进制文件中取,每次输完一个商品信息后,按N结束输入,其他字符继续输入
2.输入一个商品编号查找这个商品信息
#include "string.h"
#include "stdlib.h"
#include "stdio.h"
typedef struct
{
char id[10];
char name[20];
char price[10];
char amount[10];
}GoodsInfo_TypeDef;
void InputGoods_Info(FILE *file)
{
float temp_price = 0;
int temp_amount = 0;
int i = 1;
char temp = 0;
file = fopen("F:\\GoodsInfo.bin", "ab");
while (1)
{
GoodsInfo_TypeDef goods;
printf("请输入第%d商品编号: ",i);
scanf("%s", goods.id);
goods.id[10] = '\0';
fflush(stdin);
printf("请输入第%d商品名称: ",i);
scanf("%s", goods.name);
goods.name[20] = '\0';
fflush(stdin);
printf("请输入第%d商品价格: ",i);
scanf("%f", &temp_price);
fflush(stdin);
printf("请输入第%d商品数量: ",i);
scanf("%d", &temp_amount);
fflush(stdin);
fprintf(file, "%s %s %.2f %d\n", goods.id, goods.name, temp_price, temp_amount);
printf("第%d个商品信息输入完毕,按N键结束输入,按任意键继续录入商品信息: ",i);
scanf("%c", &temp);
if (temp == 'N' || temp == 'n')
{
printf("输入完毕已退出\n");
break;
}
else i++;
}
fclose(file);
return;
}
void FindGoods_Info(char *buf,FILE *file)
{
file = fopen("F:\\GoodsInfo.bin", "r");
int a = 0;
while (!feof(file))
{
GoodsInfo_TypeDef goods;
fscanf(file, "%s%s%s%s", goods.id, goods.name, goods.price, goods.amount);
if (!strncmp(buf, goods.id, strlen(goods.id) + 1))
{
printf("查找的商品编号为%s\n", goods.id);
printf("查找的商品名称为%s\n", goods.name);
printf("查找的商品价格为%s\n", goods.price);
printf("查找的商品数量为%s\n", goods.amount);
}
}
fclose(file);
}
int main(int argc, char * argv[])
{
FILE *fp = NULL;
InputGoods_Info(fp);
FindGoods_Info("S523", fp);
return 0;
}