【BUPT2021秋季计算导论第十二次实验

函数题

反向打印字符串

实验9_5_反向打印字符串 (100 分)
设计递归函数将字符串str中的内容反向打印出来。

此题要求递归求解,且不允许使用全局变量,否则没有分。
函数接口定义:
void reversePrint(char str[]) ;
其中 str 是用户传入的参数, 为指定字符串。函数没有返回值。

裁判测试程序样例:
#include<stdio.h>

//将字符串str中的内容反向打印的函数
void reversePrint(char str[]) ;

int main()
{
char s[100] ;

scanf( "%s" , s );    
reversePrint(s) ;
printf("\n") ;

return 0;

}

/* 请在这里填写答案 */
输入样例:
ABCdefg
输出样例:
gfedCBA

#include<stdio.h>

//将字符串str中的内容反向打印的函数 
void reversePrint(char str[]) ;

int main()
{
    char    s[100] ;

    scanf( "%s" , s );    
    reversePrint(s) ;
    printf("\n") ;

    return 0;
}

void reversePrint(char str[])
{
	if(str[0] == '\0')
		{
			return ;
		}
	int i =0 ;
	while(str[i] != '\0')
		{
			i++ ;
		}
	printf("%c", str[i-1]);
    str[i-1] = '\0';
    reversePrint(str) ;
}

单词字符统计

6-2 实验9_6_单词字符统计 (100 分)
请设计一个函数,参数为一个单词(字符串),假设max是单词中出现次数最多的字母的出现次数,min是单词中出现次数最少的字母的出现次数,如果max-min是一个质数,则返回则max-min,否则返回-1。

注意:判断一个整数是否为质数的函数不需要实现,要求直接调用下边的函数来判断

int isPrime( int n ) ;
该函数判断一个整数是否是质数,是则返回1,否则返回0。

测试程序输入:

只有一行,是一个单词,其中只可能出现小写字母,并且长度小于100。

测试程序输出:

如果输入单词的max-min是一个质数,输出max-min的值,否则输出-1。

函数接口定义:
int getResult( char word[] ) ;
其中 word 是用户传入的参数,为待处理单词。函数须按要求返回max-min或-1。

裁判测试程序样例:

#include<stdio.h>

#define MAXLEN 110

int isPrime( int n ) ;//判断一个整数是否是质数,是则返回1,否则返回0
int getResult( char word[] ) ;

int main()
{
char word[MAXLEN] ;

scanf( "%s" , word ) ;            
printf( "%d\n" , getResult( word ) );

return 0;

}

/* 请在这里填写答案 */
输入样例:
banana
输出样例:
2

#include<stdio.h>

#define        MAXLEN        110

int        isPrime( int n ) ;//判断一个整数是否是质数,是则返回1,否则返回0 
int        getResult( char word[] ) ;

int main()
{
    char    word[MAXLEN] ;

    scanf( "%s" , word ) ;            
    printf( "%d\n" , getResult( word ) );

    return 0;
}

int        getResult( char word[] )
{
	int i = 0;
	while(word[i] != '\0')
		{
			
			count[word[i] - 97] ++ ;
			i++;
		}
	int j ;
	int max , min ;
	for ( j=0;j< 26 ;j ++)
		{
		   if(count[j] != 0&&max == 0&&min == 0)
		   	{
			   max= count[j] ;
			   min= count[j] ;
	     	}
	     	if ( count[j] != 0)
	     	{
		       if(count[j]> max)
		   		  {
		   			max = count[j] ;
			  	  }
			   if (count[j] < min)
					 {
					min = count[j] ;
					 }
			 }
	    }
	int m ;
	int n;
	n -max- min;
	m = isPrime(n) ;
	if(m == 1)
		{
			return n;
		}
		else if( m== 0)
			{
				return -1;
			}
		
}

编程题

括号匹配

实验9_1_括号匹配 (100 分)
任意给定一个字符串,字符串中包含除了空白符、换行符之外的任意字符。你的任务是检测字符串中的圆括号是否配对,即“(”与“)”是否配对。如字符串“((a+b)* (c+d))”中是配对的,而“((a+b)*) c+d))”则不配对。

输入格式:
一个长度不超过100的非空字符串,该字符串中不会出现空格、换行符。

输出格式:
匹配及不匹配见样例。

输入样例一:
((a+b)(c+d))
输出样例一:
parentheses match!
输入样例二:
((a+b)
)c+d))
输出样例二:
parentheses do not match!

#include<stdio.h>

int main()
{
	int cnt = 0;
	char s[101] ;
	scanf("%s", s);
	int i =0 ;
	int count = 0;
	while (s[i] != '\0')
		{
			if(s[i] == '(')
				{
					cnt ++ ;
				}
				else if(s[i] == ')')
					{
						cnt -- ;
					}
			if(cnt < 0)
				{
					count = 1;
				}
			i++; 
		}
	if(cnt == 0&&count == 0)
		{
			printf("parentheses match!");
		}
	    else {
	    	printf("parentheses do not match!");
		}
	return 0;
}

身份证号码最后一位

实验9_2_身份证号码最后一位 (100 分)
身份证编码规则如下:根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。

顺序码(身份证第十五位到十七位)是县级公安机关所辖派出所的分配码,每个派出所分配码为10个连续号码,例如“000-009”或“060-069”,其中单数为男性分配码,双数为女性分配码,如遇同年同月同日有两人以上时顺延第二、第三、第四、第五个分配码。如:005的就是个男性,而且和他同年月日生的男性至少有两个,他们的后四位是001和003。分配顺序码中“999、998、997、996”四个顺序号分别为男女性百岁以上老人专用的特定编号。 校验码(身份证最后一位)是根据前面十七位数字码,按照ISO7064:1983.MOD11-2校验码计算出来的检验码。

从1999年10月1日起,全国实行公民身份证号码制度,居民身份证编号由原15位升至18位。前6位为地址码;第七位至14位为出生日期码,此码由6位数改为8位数,其中年份用4位数表示;第15位至17位为顺序码,取消了顺序码中对百岁老人使用的特定编号;第十八位为校验码,主要是为了校验计算机输入公民身份证号码的前17位数字是否正确,其取值范围是0至10,当值等于10时,用罗马数字符X表示。

计算方法

1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。

2、将这17位数字和系数相乘的结果相加。

3、用加出来和除以11,看余数是多少?

4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。(即余数0对应1,余数1对应0,余数2对应X…)

5、通过上面得知如果余数是3,就会在身份证的第18位数字上出现的是9。如果对应的数字是2,身份证的最后一位号码就是罗马数字X。

例如:某男性的身份证号码为【53010219200508011X】, 我们看看这个身份证是不是符合计算规则的身份证。

首先我们得出前17位的乘积和【(57)+(39)+(010)+(15)+(08)+(24)+(12)+(91)+(26)+(03)+(07)+(59)+(010)+(85)+(08)+(14)+(1*2)】是189,然后用189除以11得出的结果是189÷11=17余下2,187÷11=17,还剩下2不能被除尽,也就是说其余数是2。最后通过对应规则就可以知道余数2对应的检验码是X。所以,可以判定这是一个正确的身份证号码。

现在请你写一段程序来判断一个身份证号码的最后一位是否与上述规则相符。

输入格式:
第一行一个整数T(0<T<100),表示有T行测试数据。后边是T行每行是一个18位的身份证号码(测试数据前17位保证符合身份证号码的要求,罗马数字X就是大写的英文字母X)。

输出格式:
T行,与输入的T行测试数据相对应,如果该行测试数据最后一位符合所述算法则输出right,否则输出wrong。

输入样例:
2
34052419800101001X
310105199412049278
输出样例:
right
wrong

#include<stdio.h>

int main()
{
	int n;
	int num[17] ={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
	scanf("%d",&n);
	int cnt = 0;
	char s[19] ={0} ;
	for ( ;cnt < n ; cnt++)
		{
			scanf("%s",s) ;
			int i ;
			int sum = 0;
			for (i =0 ;i< 17 ; i++)
				{
					sum =sum +s[i] *num[i] ;
				}
			int yu ;
			yu = sum % 11 ;
			int  z;
			switch(yu)
			{
				case 0 : z = 1;break;
				case 1 : z = 0;break;
				case 2 : z = 88;break ;
				case 3 : z = 9;break;
				case 4 : z = 8;break;
				case 5 : z = 7;break;
				case 6 : z = 6;break;
				case 7 : z = 5;break;
				case 8 : z = 4;break;
				case 9 : z = 3;break;
				case 10 : z = 2;break;
			}
		    if (z == s[17])
		    	{
		    		printf("right\n");
				}
				else 
				{
					printf("wrong\n");
				}
		}
	return 0 ;
}
/*#include <stdio.h>

int main()
{
	int last,sum,left;
	int i,j,n;
	int coefficient[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
	int confirm[11]={1,0,10,9,8,7,6,5,4,3,2};
	char id[18];
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		sum=0;
		scanf("%s",id);
		for(j=0;j<=17;j++)
		{
			if(id[j]==88)
			{
				id[j]=10;break;
			}
			id[j]=id[j]-48;
		}
		for(j=0;j<=16;j++)
		{
			sum=sum+id[j]*coefficient[j];
		}
		left=sum%11;
		last=id[17];
		if(last==confirm[left])
			printf("right\n");
		else
			printf("wrong\n");
	}
	return 0;
}
*/

字母统计

实验9_3_字母统计 (100 分)
任意给定一个字符串,字符串中包含除了空白符、换行符之外的的任意字符。你的任务是统计出现在该字符串中的各字母(即“A—Z”,“a—z”)的个数(区分大小写)。

输入格式:
一个长度不超过100的非空字符串。字符串中不会出现空白符、换行符。

输出格式:
字符串中出现的字母的统计信息,每个字母的统计信息占一行,按照字母的ASCII码的顺序输出。

输入样例:
AAAsdf&^%DF879as
输出样例:
注意单词“time”不论单复数,一律输出复数形式“times”

The character A has presented 3 times.
The character D has presented 1 times.
The character F has presented 1 times.
The character a has presented 1 times.
The character d has presented 1 times.
The character f has presented 1 times.
The character s has presented 2 times.

#include<stdio.h>
 
int main()
{
	char s[101] ={0};
	scanf("%s", s);
	int i; 
	int x_cnt[26]= {0} ;
	int d_cnt[26]={0} ;
	char D = 'A';
	char x = 'a' ;
	i=0 ; 
	while(s[i] != '\0')
		{
			if((s[i] <='z')&&(s[i]>='a'))
				{
				   x_cnt[s[i] - 97] ++ ;	
				}
			if((s[i] <= 'Z')&&(s[i] >= 'A'))
				{
					d_cnt[s[i] - 65] ++ ;
				}
			i++;
		}
	int j ;
	for ( j = 0;j < 26 ; j++)
		{
			if (d_cnt[j] > 0)
				{
					printf("The character %c has presented %d times.\n",D + j , d_cnt[j] );
				}
		}
	for (j = 0 ;j < 26 ; j++)
		{
			if (x_cnt[j] >0)
				{
					printf("The character %c has presented %d times.\n",x + j , x_cnt[j] );
				}
		}
	return 0;
}

句子输出

实验9_4_句子输出 (100 分)
请按要求输出字符串。

输入格式:
第一行为一个整数n(0<n<=10),表示将要输入的字符串的个数。后边n行,每行一个字符串(长度不超过30,且不包含空格),第n+2行为n个用空格分隔的整数,这n个整数为0到n-1,代表输出字符串的顺序。如果第一个数字为1,则代表第1(从0开始计数)个输入的字符串第1(从1开始计数)个输出。第二数字为0,则代表则代表第0(从0开始计数)个输入的字符串第2(从1开始计数)个输出。后边依此类推。

输出格式:
共n行,每行一个字符串,输出顺序为输入中最后一行指定的顺序。。

输入样例:
3
world
Hello
!
1 0 2
输出样例:
Hello
world
!

#include<stdio.h>


int main()
{
	int n ;
	scanf("%d", &n);
	int i;
	char s[10][31] = {0} ;
	for ( i =0 ; i<n ;i++)
		{
			scanf("%s", s[i]);
		}
	int cnt[10] ;
	int j ;
	for (j =0 ;j <n ;j ++)
		{
			scanf("%d",&cnt[j]);
		}
	for ( j =0 ; j< n; j++)
		{
			printf("%s\n",s[cnt[j]]) ;
		}
	return 0;
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

影不在遗忘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值