PAT (Basic Level) Practice 1041 考试座位号

一、概述

输入试机号,输出考生号和考试号,很简单的一道题,考点主要在char的输入上。

本题中应强化对char输入的理解,另可尝试使用C++中的cin和cout,对于字符串类型的输入输出有极大优势。

二、分析

1、使用C的方法

为了偷懒我先定义了结构体代表每个考生,开一个结构体数组,角标就是试机号。如下

struct ExamNumber
{
	char num[15];
	int seat;
}ExamN[1001];

问题很明显了,首先输入的是考生号,然后输入的才是试机号和考试号,那么考生号需要用一个临时变量存储,然后赋值给结构体中的考生号。然而C中对于一个字符串的值赋值给另一个并不能像普通变量那样使用等号,而是要使用strcpy,这一点一定注意,直接赋值虽然不报错(这可太坑了),但是得到的结果就不知道是什么鬼了。

for (i = 0; i < count; i++)
{
	char _num[15];
	scanf("%s", _num);
	int _seat1, _seat2;
	scanf("%d %d ", &_seat1, &_seat2);
	ExamN[_seat1].seat = _seat2;
	strcpy(ExamN[_seat1].num, _num);
}

注意strcpy调用字符串数组时是不用写下标的。

同时,注意字符数组的大小范围,本题中考生号是14位,那么字符数组应是15位,你用14位可以得到正确结果,只是在debug最后会出来time check failure #2-5,分步debug时会报错num堆栈炸了。这是因为字符串最后有一个\0没有输入,你给的地方不够大,因此爆栈了。所以这一步要注意。

别的就没有什么要注意的了。

2、使用C++的方法

cin和cout很好用,但是最好只在字符串中使用,正常输入数字不要使用,太慢了,很容易超时。

1中的问题,在C++中不是问题,因为我们不用字符数组char[]而是使用字符串string,字符串是可以直接赋值的,方便的多,输出也很是简洁。

for (i = 0; i < count; i++)
{
	string _num;
	cin >> _num;
	int _seat1, _seat2;
	scanf("%d %d ", &_seat1, &_seat2);
	ExamN[_seat1].seat = _seat2;
	ExamN[_seat1].num = _num;
}

三、总结

本题关键就在于字符串的输入,同时对于C++中的一些好用函数应注意学习使用。

PS:代码如下

C版

#include<stdio.h>
#include<string.h>
struct ExamNumber
{
	char num[15];
	int seat;
}ExamN[1001];
int main()
{
	int count;
	scanf("%d", &count);
	int i;
	for (i = 0; i < count; i++)
	{
		char _num[15];
		scanf("%s", _num);
		int _seat1, _seat2;
		scanf("%d %d ", &_seat1, &_seat2);
		ExamN[_seat1].seat = _seat2;
		strcpy(ExamN[_seat1].num, _num);
	}
	int CountSearch;
	scanf("%d", &CountSearch);
	for (i = 0; i < CountSearch; i++)
	{
		int seat1;
		scanf("%d", &seat1);
		printf("%s %d\n", ExamN[seat1].num, ExamN[seat1].seat);
	}
}

C++版

#include<stdio.h>
#include<iostream>
#include<string>
using  namespace std;

struct ExamNumber
{
	string num;
	int seat;
}ExamN[1001];
int main()
{
	int count;
	scanf("%d", &count);
	int i;
	for (i = 0; i < count; i++)
	{
		string _num;
		cin >> _num;
		int _seat1, _seat2;
		scanf("%d %d ", &_seat1, &_seat2);
		ExamN[_seat1].seat = _seat2;
		ExamN[_seat1].num = _num;
	}
	int CountSearch;
	scanf("%d", &CountSearch);
	for (i = 0; i < CountSearch; i++)
	{
		int seat1;
		scanf("%d", &seat1);
		cout << ExamN[seat1].num;
		printf(" %d\n", ExamN[seat1].seat);
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值