pat乙级真题 1072. 开学寄语(20)

本文介绍了一种用于检查学生是否携带违禁品的算法实现。通过解析输入数据,该算法能够有效识别并统计违禁物品及其携带者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接

                        点击打开链接

思路简介
把违禁品存储在数组中,然后每行逐个处理。先把以空格隔开的每行输入中各部分解析出来,再逐个判断该学生所携带的物品是否是违禁品。
注意事项
要注意学生携带物品数为0的情况,否则第二组测试用例过不了
代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int  stu_fobiden_num, //携带被禁止物品的学生总数
	thing_fobiden_num;//携带的所有违禁物件数

/*********************************************************************************
* 函数功能:判断学生携带的该物件是否被禁止
* 变量:    a  ---学生携带的物件编号
*           b  ---被禁止的物件
*           num---该学生携带的物件总数
***********************************************************************************/
int isFobiden(char a[],char b[][5],int num){
	int i;
	for (i = 0; i < num;i++){
		if (!strcmp(a, b[i]))
			return 1;
	}
	return 0;
}

/*********************************************************************************
* 函数功能:解析出每个学生对应的一行中的空格隔开的各部分
* 变量:    count ----- 对input数组解析到的数组下标值
***********************************************************************************/
int get_str(char _input[],char str[],int count){
	int i,j;
	for (i = count, j = 0; _input[i] != ' ' && _input[i] != '\0';)
		str[j++] = _input[i++];
	str[j] = '\0';
	return count + j +1;  //返回input数组中下一个部分的头下标
}

/*********************************************************************************
* 函数功能:把input数组各部分解析出来
* 变量:    num ---该学生携带的物件数目
*            _name -- 学生的姓名
*			_stu_thing --- 该学生携带的各物件
***********************************************************************************/
void del_input(char _input[],int * num,char _stu_thing[][5],char _name[]){
	int i,j,k,count;
	char temp[10];
	count = 0;
	count = get_str(_input,_name,count); //得到学生名字
	count = get_str(_input, temp, count);//得到物件数目
	*num = atoi(temp);
	for (k = 0; k < *num;k++){          //逐个解析各物件
		count = get_str(_input, temp, count);
		strcpy(_stu_thing[k], temp);
	}
}

/*********************************************************************************
* 函数功能:处理单个学生对应的一行输入
* 变量:    _M ---违禁品总数
*           _fobiden -- 违禁品
***********************************************************************************/
void del_one_stu(int _M,char _fobiden[][5]){
	char input[100],
		name[5],        //学生名字
		stu_thing[10][5]; //学生携带的物件
	int stu_thing_num,   //学生携带的物件数目
		i, j,
		 flag; //标志该学生是否有携带违禁物品

		gets(input);
		del_input(input, &stu_thing_num, stu_thing, name);
		for (j = 0, flag = 1; j < stu_thing_num; j++){ //逐个处理学生所带的每件物品
			if (isFobiden(stu_thing[j],_fobiden, _M)){
				if (flag){
					stu_fobiden_num++;
					thing_fobiden_num++;
					printf("%s: %s", name, stu_thing[j]);
					flag = 0;
				}
				else{
					printf(" %s", stu_thing[j]);
					thing_fobiden_num++;
				}
			}
		}
		if (!flag)
			printf("\n");
}
int main(){
	char input[100],
		name[5],        //学生名字
		fobiden[6][5],      //被禁止的物件
		stu_thing[10][5]; //学生携带的物件
	int stu_thing_num,   //学生携带的物件数目
		N,               //学生总数
		M,              //违禁物品总数
		i;
	scanf("%d %d",&N,&M);
	for (i = 0; i < M;i++){
		scanf("%s",fobiden[i]);
	}
	getchar();
	for (i = 0; i < N;i++){ //逐个处理每个学生
		del_one_stu(M,fobiden);
	}
	printf("%d %d",stu_fobiden_num,thing_fobiden_num);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值