北京理工大學計算機考研複試上機題目及代碼——2017

記:全部題目連接https://blog.csdn.net/u014552756/article/details/78505845,題目來源於博主“我還在路上呢”,我根據個人對題目的理解寫了一下題解代碼,分享在博客上,如代碼寫的有問題希望大家指正,後期會不定時更新。

1、輸入身份證號,通過計算比較校驗位來判斷身份證號是否正確。

如,aaaaaayyyymmddxxsp共18位,其中:

年份代碼yyyy共4位。最後一位p爲校驗位。

校驗規則是:

(1)對前17位數字的權求和 S=Sum(Ai*Wi),i=0,...,16

Ai:表示第i位置上的身份證號碼數字值

Wi:表示第i位置上的加權因子

Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

(2)計算模 Y=mod(S,11)

(3)通過模得到對應的校驗碼

        Y:0 1 2 3 4 5 6 7 8 9 10

校驗碼:1 0 X 9 8 7 6 5 4 3 2

例如,如果得到Y爲9則最後的校驗位p應該爲3

如果校驗位不是3,則該身份證號碼不正確。

輸入示例:

110130197606175317

輸出示例:

110130197606175317 正確.

輸入示例:

110200197501175220

輸出示例:

應爲:11020019750117522X


思路分析:此題是一個字符串處理的題目,解題思路是根據其給出的規則求出對應參數,在此過程中的關鍵是字符和數字的轉換,以及當校驗碼y=s%11爲2時要做分類處理。


#include <stdio.h>
#include <string.h>
 
int main()
{
	int w[20]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2},s=0,r=0;
	char a[18],y[20]={'1','0','X','9','8','7','6','5','4','3','2'};
	gets(a);//輸入身份證號 
	for(int i=0;i<17;i++)
		s=s+(a[i]-'0')*w[i];
	r=s%11;
	if(r==2)
	{
		char t=y[r];
		if(t==a[17])
			printf("%s 正確\n",a);
		else
		{
			printf("應爲:");
			for(int j=0;j<17;j++)
			{
				printf("%c",a[j]);
			}
			printf("%c\n",t);
		} 
	}
	else{
		int t=y[r]-'0';
		if(t==a[17]-'0') 
		printf("%s 正確\n",a);
		else
		{
			printf("應爲:");
			for(int j=0;j<17;j++)
			{
				printf("%c",a[j]);
			}
			printf("%d\n",t);
		}
	}
	return 0;
} 

2、顯示出如下數組中的所有元素,並使用二分查找法在數組中查找元素。

int a[]={-90,-32,12,16,24,36,45,59,98,120};

輸入輸出示例

-90   -32   12   16   24   36   45   59   98   120

請輸入所要查找的元素:24

輸出:第5個元素爲24,比較次數爲1

請輸入所要查找的元素:120

輸出:第10個元素,比較次數爲4

請輸入所要查找的元素:6

輸出:查找失敗 比較次數爲3
 

#include <stdio.h>

int main()
{
	int a[]={-90,-32,12,16,24,36,45,59,98,120};
	for(int i=0;i<10;i++)
		printf("%d ",a[i]);
	printf("\n");
	int n;
	printf("請輸入所要查找的元素:");
	scanf("%d",&n);
	int count=0,t=0;
	for(int i=0;i<10;i++)
	{
		if(a[i]==n)
			t=i;//查詢是數組中的第幾個元素,在輸出時要加做1處理
	}
	int mid,left=0,right=9,f=0;
	while(left<=right)//二分查找,記下對應的次數
	{
		count++;
		mid=(left+right)/2;
		if(a[mid]==n)
		{
			f=1;
			break;
		}
		else if(a[mid]>n) right=mid-1;
		else left=mid+1; 
	}
	if(f==1)
		printf("第%d個元素爲%d,比較次數爲%d\n",t+1,n,count);
	else printf("查找失敗,比較次數爲%d\n",count);
	return 0;
}

3、輸入學生個數以及每個學生的姓名和3門課程成績:輸出不及格學生的信息;按平均成績排序,從高到低輸出學生信息。

輸入示例:

5

zhaoyi     70 80 91

zhanger   68 40 90

zhangsan 60 70 80

lisi            70 80 90

wangwu   52 70 100

輸出示例:

*name: zhanger   score:68 40 99

*name: wangwu   score:52 70 100

[1]  name:zhaoyi     70 80 91

[2]  name:lisi           70 80 90

[3]  name:wangwu  52 70 100

[4]  name:zhangsan 60 70 80

[5]  name:zhanger   68 40 99


思路分析:此題主要運用結構體以及結構體排序來完成,此題的題目數據非常適合用結構體,搞清楚結構體的用法此題非常容易解除。

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

struct Info{
	char name[20];
	int score[3];
	float aveg;
};

bool cmp(Info a,Info b)
{
	return a.aveg>b.aveg;
}

int main()
{
	int n;
	scanf("%d",&n);
	Info stu[n];
	for(int i=0;i<n;i++)
	{
		int ave=0,s=0;
		scanf("%s",stu[i].name);
		for(int j=0;j<3;j++)
		{
			scanf("%d",&stu[i].score[j]);
			s=s+stu[i].score[j];
		}		
		stu[i].aveg=s/3;
	}	
	
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<3;j++)
		{
			if(stu[i].score[j]<60)
				printf("*name:%s score:%d %d %d\n",stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
		}
	}
	
	sort(stu,stu+n,cmp);
	int k=1;
	for(int i=0;i<n;i++)
	{
		printf("[%d] name:%s  %d %d %d\n",k,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2]);
		k++;
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章