C语言练习题

1.保密电文:某电报局的电文保密规律是将每个英文字母变成其后的第4个字母,例如A变成E,a变成e。最后四个字母(W, X,Y,Z或w,x,y,z)变成前四个字母(A,B,C,D或a,b,c,d)。电文中的非字母字符不变。
要求:

输入一行字符串,输出改变的字符串。

程序分析:

本程序将26个小写字母和26个大写字母转换为ASCll码。
ASCll码对照表:
C语言练习题_第1张图片
图片来源:http://tool.oschina.net/commons?type=4
由对照表得知英文字母的ASCll码都在(65–90和97–122)之间,所以只需要判断输入的字母是否在这个顺序之间,如果在此区间内,则对此数字的ascll码加上4,例如:a的acsll码为97,加4变为e。
而对于W,X,Y,Z和w,x,y,z则需要另行判断对其ascll码减去22得到修改后的字母。

题目程序:

#include
int main()
{
	char n[1000];
	int i;
	gets(n);
	for(i=0;n[i]!='\0';i++)
	{
		//判断字母否为26个英文字母
		if(((65<=(int)n[i])&&((int)n[i]<=90))||((97<=(int)n[i])&&((int)n[i]<=122)))
		{
		//判断是否为a--v或A--V
			if(((65<=(int)n[i])&&((int)n[i]<87))||((97<=(int)n[i])&&((int)n[i]<119)))
		{
			n[i]=n[i]+4;
			printf("%c",n[i]);
		}
		//判断是w--z和W--Z
			else 
			if(((87<=(int)n[i])&&((int)n[i]<=90))||((119<=(int)n[i])&&((int)n[i]<=122)))
		{
			n[i]=n[i]-22;
			printf("%c",n[i]);
		 } 	
	}
	//非字母时原样输出
		 else
		 {
		 	printf("%c",n[i]);
		 }
	 } 	
	return 0;
}
程序截图:

C语言练习题_第2张图片

2.猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了二分之一,还不过瘾,又多吃了一个。第二天在上又将剩下的桃子吃掉二分之一,又不过瘾又多吃了一个。以后每天早上都吃了前一天剩下的二分之一零一个。到第N天早上再想吃时,见只剩下一个桃子了。求第一天共摘了多少个桃子。

要求:输入N,输出桃子总数
程序分析:

程序中需要的变量有:
天数 int N,桃子总数 int sum。
并且根据题意变量都是整型(int)。

求解思路:
根据总共的天数反向求解桃子的个数,桃子每天减少公式为:2*(sum+1)。	

题目程序:

#include
int main()
{
	int sum=1,N,i;
	printf("请输入天数N\n");
	scanf("%d",&N);
	for(i=0;i<N-1;i++)
	{
		sum=2*(sum+1;
	}
	printf("桃子总数为:%d\n",sum);
	return 0;
 } 

运行结果:
C语言练习题_第3张图片

3.回文素数问题。输入一个n,输出n以内的所有回文素数,即即是素数,又是回文数(数字从前往后,从后往前看一样)例如:373,232。
要求:

输入大于10的正整数n。
输出n以内的所有回文素数。

程序分析:

首先从数字1开始遍历直到n,对每个数字进行判断,是否为回文素数,若符合要求则输出。

题目程序:

#include  
int sushu(int n) //判断素数
{ 
     int i; 
     int x; 
     for(i=2; i<=n/2; i++) 
     {     
          x=1; 
          if(n%i==0)   
          { 
              x=0; 
          } 
     } 
     if(x) 
     { 
          return n; 
     } 
     else  
     { 
          return 0; 
     } 
} 
int huiwenshu(int m) //判断回文数
{ 
    int i=0; 
    int j; 
    int num; 
    int a[5]; 
    if(m>=10)    
    { 
        num=m; 
        while(m)  
        { 
            a[i++]=m%10; 
            m=m/10; 
        } 
        for(j=i-1; j>=0; j--)   
        { 
            if(a[j]!= num%10)  
            { 
                return 0;   
            } 
            num=num/10; 
        } 
        return 1; 
    } 
    else 
    { 
         return 0; 
    } 
}
int main() 
{ 
    int i,n;
    printf("请输入大于10的数字:\n");
	scanf("%d",&n); 
    for(i=2; i<n; i++) 
    { 
       if( sushu(i) && huiwenshu(sushu(i) ) ) 
       { 
           printf("%d是回文素数\n", i); 
       } 
    } 
    return 0; 
} 

运行结果:

C语言练习题_第4张图片

4.C语言实验–整数的溢出:小明在做整数加法计算时,发现选择不同的整数类型得到的计算结果不一样,经过研究她发现了一个简单规律,可以根据计算结果推出程序用到的数据类型。请根据给出的测试数据,推算出程序用到的整数类型,并用该类型编写相应的假发程序。

例如:
输入:32767 和 32767
输出:-2

程序分析:

本题考验程序的溢出问题,
首先解释一下什么是溢出:数据类型超过了计算机字长的界限而出现的数据溢出,也就是计算机装不下咱的数据然后把装不下的数据扔了出来。
题目中输入两个32767进行加法运算,其结果为65534.
而short类型的数据范围在-32768~32767之间。当你输入的数据大于32767那么计算机就会对你的数据进行溢出表现为:
在这里插入图片描述
在这里插入图片描述
所以在编写程序时要着重考虑变量的取值范围。

题目程序:

#include
int main()
{
    int a,b;
    short sum;
    scanf("%d %d",&a,&b);
    sum=a+b;
    printf("%d",sum);
    return 0;
}
}
5.用数字造数字:输入一个3位以上的整数,求其中最大的两个数字之和与最小的数字之和之间的差。
例如:输入8729,输出8,即(9+8)-(2+7)=8.
要求:

输入一个三位以上的整数。
输出最大的两个数字之和与最小的数字之和之间的差。

题目程序:
#include
int main()
{
	int n,m;
	int a,b,c,d,e;
	printf("请输入一个三位以上的整数:\n");
	scanf("%d",&n);
	a=n/1000;//千位
	b=(n-a*1000)/100;//
	c=(n-a*1000-b*100)/10;
	d=(n-a*1000-b*100-c*10); 
		
	if(a<b)
	{
	e=a;
	a=b;
	b=e;
	}
	if(a<c)
	{
	e=a;
	a=c;
	c=e;
	}
	if(a<d)
	{
	e=a;
	a=d;
	d=e;
	}
	if(b<c)
	{
	e=b;
	b=c;
	c=e;
	}
	if(b<d)
	{
	e=b;
	b=d;
	d=e;
	}
	if(c<d)
	{
	e=c;
	c=d;
	d=e;
	}
	n=(a+b)-(c+d);
	printf("%d",n);
	return 0;
}
程序结果:

C语言练习题_第5张图片

你可能感兴趣的:(C语言)