C语言刷题,每天一题2020年5月

技术交流QQ群:658522731

配套讲解视频:https://www.bilibili.com/video/BV1yT4y137r2/

2020年5月6日

题型:选择题
题目:下面程序的运行结果是:( )

#include <studio.h>
main()
{
	char a[]="morning",t;
	int i,j=0;
	for(i=1;i<7;i++) if(a[j]<a[i]) j=i;
	t=a[j];  a[j]=a[7];
	a[7]=t; puts(a);
}

A) mogninr B)mo C)morning D)mornin

解答:选B
题目都有内在逻辑,通过对for循环的观察。可以得出 j 记录的是字符数组中,ASCII编码最大的字符的下标,本题中为‘r’,下标为2。
而for循环后面的操作,是将数组中下标为 j 和下标为7的字符互换。“morning”一共七个字母,下标为0-6,但付给字符串数组的时候,会增加一个结束符’\0’。因此,‘r’和‘\0’互换,a为mo\0ningr。
输出字符串时,预定要’\0’将会停止。因此最终的执行结果为 mo

C语言刷题课:每日一题

2020年5月7日

题型:编程题
题目:有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

解答:可以直接使用穷举法,通过三个for循环列出所有的可能性,总个数为 C 4 1 C 4 1 C 4 1 = 4 4 4 = 64 , i f C 4 1 C 3 1 C 2 1 = 4 3 2 = 24 C^1_4C^1_4C^1_4=4*4*4=64,再通过if语句进行过滤,过滤后个数为C^1_4C^1_3C^1_2=4*3*2=24 ,这里的概率公式不需要了解,可以作为程序对错的一个很好的检验。

#include<stdio.h>
int main(){
    int i,j,k;
	int n=0;//个数
    printf("\n");
    for(i=1;i<5;i++) 
        for(j=1;j<5;j++) 
            for (k=1;k<5;k++) 
				// 过滤条件:i,j,互不相等
                if (i!=k&&i!=j&&j!=k) 
                    printf("%2d:%d,%d,%d\n",++n,i,j,k);	

	printf("总共个数为:%d",n);
}

C语言刷题课:每日一题

2020年5月8日

题型:编程题
题目:企业发放的奖金根据利润提成。

  • 利润(I)低于或等于10万元时,奖金可提10%;
  • 利润高于10万元,低于20万元时,低于10万元的部分按10%提成;高于10万元的部分,可提成7.5%;
  • 20万到40万之间时,高于20万元的部分,可提成5%;
  • 40万到60万之间时高于40万元的部分,可提成3%;
  • 60万到100万之间时,高于60万元的部分,可提成1.5%;
  • 高于100万元时,超过100万元的部分按1%提成;
    从键盘输入当月利润I,求应发放奖金总数?

解答:本题可以直接使用if,if else的嵌套,列出所有可能性。算出结果。但该方法不够灵活,不够智能。无法满足需求的变化。
通过分析不难发现,奖金的提成比例与利润(I)的等级划分一一对应,将他们的值放在两个数组里,通过循环从数组中按下标取值进行计算,可以使得代码简洁,并且可以满足需求的变化。具体代码如下:

#include<stdio.h>
float profits[]={0,10,20,40,60,100};//提成标准线,前面加一个0,方便后面计算等级间的差额
float rate[]={0,0.1,0.075,0.05,0.03,0.015,0.01};//提成比例,前面加一个0,与profits数组保持一致
int size_rate=sizeof(rate)/sizeof(float);
int size_profits=sizeof(profits)/sizeof(float);
float countBonus(float I){
	int i;
	float bonus=0;
	float delta_profit;
//计算最高等级奖金
	if(I>profits[size_profits-1]){
		bonus=(I-profits[size_profits-1])*rate[size_rate-1];
		I=profits[size_profits-1];
	//    printf("超过最高标准部分%f:bonus=%f\n",I-profits[size_profits-1],bonus);
	}
//计算其他等级奖金
	for(i=1;i<size_rate;i++){
		delta_profit=profits[i]-profits[i-1];
		if(I<=delta_profit){
			bonus+=I*rate[i];
	//		printf("%f %f bonus=%f\n",rate[i],I,bonus);
			break;
		}else{	
			bonus+=delta_profit*rate[i];
			I-=delta_profit;	
		}
	//	printf("%f %f bonus=%f\n",rate[i],profits[i]-profits[i-1],bonus);
	}
	return bonus;
}
int main(){
	float bonus;
	float I;//利润
	printf("输入利润:");
	scanf("%f",&I);
	bonus=countBonus(I);
	printf("%f\n",bonus);
	return 0;
} 

C语言刷题课:每日一题

2020年5月9日

题型:编程题
题目:有一个正整数数组,包含N个元素,要求编程求出其中的素数之和以及所有素数的平均值。
(素数:即在正整数中,除了1与本身之外没有其他约数的数,1除外)

解答:n 如果不能被 2 到 n-1 整除,那么 n 就是一个素数。还可以简化,只需要判断从2 ~ n \sqrt{n}

#include <stdio.h>
#include <math.h>
#define N 100
#define TRUE 1
#define FALSE 0
int isPrime(int n){
	int prime=TRUE,j;
	if(n==1) return FALSE;
	for(j=2;j<=(int)sqrt((double)n);j++)
		if((n%j)==0){
			prime=FALSE;
			break;
		}
	return prime;
}
int main(int argc,char *argv[]){
	int a[N],count=0,i,sum=0;
	//初始化数组
	for(i=0;i<N;i++) a[i]=i+1;
	for(i=0;i<N;i++)
		if(isPrime(a[i])){
			printf("素数:%d\n",a[i]);
			count++;
			sum+=a[i];
		}

	printf("素数数量:= %d \n",count);
	printf("素数综和:= %d \n",sum);
	printf("平 均 值:= %.2f \n",sum/(float)count);

	return 0;
}

C语言刷题课:每日一题

2020年5月10日

题型:选择题
题目: 若有以下定义和语句,且0≤i<10则对数组元素的错误引用是 。
int a[10]={1,2,3,4,5,6,7,8,9,10},*p,i;
p=a;
A. *(a+i) B. a[p-a] C. p+i D. *(&a[i])

解答:
A:a是int数组,a+i等于a[i]的地址,前面加上取地址符,可以取到a[i]的值
B:a为数组的地址,是一个常量。p是指针变量,变量的值是地址。所以p和a都是地址,p-a=0,B可以取到a[0]的值。
C:p为指针变量,里面存放的是地址的值,i是int类型的值。结果只是纯粹的数值相加,没有对元素的取值。所以这个选项是错误的。
D:*与&抵消,值为a[i]
答案为C

C语言刷题课:每日一题

2020年5月11日

题型:编程题
题目: 任意输入 3 个整数,编程实现对这 3 个整数由小到大进行排序。(后面将扩展到冒泡排序法) 。

解答:题目本身很简单,只需要做两两比较,先确定最小的一个,再比较剩下的两个。

#include <stdio.h>
int main(){
    int a,b,c,t; 
    printf("Please input a,b,c:\n"); 
    scanf("%d,%d,%d",&a,&b,&c);  
    if(a>b) {
        t = a;a = b;b = t;
    }
    if(a>c){
        t = a;a = c; c = t;
    }
    if(b>c){
        t = b; b = c;c = t;
    }
    printf("The order of the number is:\n");
    printf("%d,%d,%d",a,b,c);
    return 0;
}

下面列出冒泡排序法的实现代码

#include <stdio.h>
int i,j,t;   
void orderTwo(int* a, int* b){
	if(*a<*b) return;
	t=*a;*a=*b;*b=t;
}
void orderArrary(int * array, int n){
	for(i=0;i<n;i++)
		for(j=i+1;j<n;j++)
			orderTwo(&array[i],&array[j]);
}
int main(){
    int nums[10]={1,12,3,4,15,6,7,8,19,10};  
    printf("The order of the number is:\n");
	orderArrary(nums,sizeof(nums)/sizeof(int));
    for(i=0;i<sizeof(nums)/sizeof(int);i++)
		printf("%d,",nums[i]);
    return 0;
}

C语言刷题课:每日一题

2020年5月12日

题型:编程题
题目: 输入一行字符串,输出字符串中单词的个数
列如:输入:hello the world,输出:3

解答:可以扫描整个字符串,通过判断空格的数量判断单词的数量。例如在while((ch=getchar())!=’\n’)循环中嵌套 if(ch==’ ')语句。这里我们采用strtok实现同样的功能,strtok在现实工作或课程设计中是一个非常有用的函数。

#include <stdio.h>
#include <string.h>
int main(){
	int i,count=0,word=0;
	char str[128]="\0", * token;
	const char s[2] = " ";
	printf("输入一行字符:\n");
	gets(str);
	token=strtok(str,s);	
	while(token!=NULL){	
		count++;
		for(i=0;i<strlen(token);i++)
			if(('z'>=token[i]&&token[i]>='a')||('A'<=token[i]&&token[i]<='Z'))
				continue;
			else
				token[i]=' ';
		puts(token);
		//当第一个参数为NULL时,表示沿用上一次剩下的字符串
		token=strtok(NULL,s);
	}
	printf("总共有 %d 个单词\n",count);
	return 0;
}

C语言刷题课:每日一题

2020年5月13日

题型:选择题
题目:
对于下面的C语言声明描述,正确的是( )
char(*p)[16]
A:p是长度为16的字符指针数组
B:p是包含16个字符的字符串
C:p是指向长度为16的字符数组的指针
D:p是长度为16的字符数组

解答:首选看p是指针还是数组,这个可以通过符号的优先级来判断,虽然[]的优先级高于*,但是与p包含在()中,所以是用来修饰p的。因此p是一个指针。指针的需求是什么?指针需要指向一个内容,把(*p)拿掉,剩下的就是指向的类型。也就是char[16].
所以选C

C语言刷题课:每日一题

2020年5月14日

题型:编程题
题目: 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将第一天剩下的桃子吃掉一半,有多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。
到第 10 天早上想再吃时,发现只剩下一个桃子了。编写程序求猴子第一天摘了多少个桃子。

解答:可以先列出第10天,第9天,第8天… 观察规律。发现 X n 1 = ( X n + 1 ) 2 X_{n-1}=(X_n+1)*2 。通过for循环把上一次的结果拿到本次进行计算即可。

#include <stdio.h>
#define DAYS 10
int countPeachesOfDayN(int dayNNext){
	return 2*(dayNNext+1);
}
int main(){
	int i=DAYS,count=1;
	printf("第%d天:%d\n",DAYS,count);
	i--;
	for(;i>=1;i--){
		count=countPeachesOfDayN(count);
		printf("第%d天:%d\n",i,count);
	}
	return 0;
}

也可以简化为下面的方式,我个人还是喜欢上面这种。

#include <stdio.h>
int main(){
	int i,count=1;
	for(i=9;i>=1;i--)
		count=2*(count+1);
	printf("第%d天:%d\n",i,count);
	return 0;
}

C语言刷题课:每日一题

2020年5月14日

题型:选择题
题目: 以下程序的输出结果是:

fun(int y){
	if(y>0) fun(y-1);
	printf("%d",y);
}
main(){
	int x=4;
	fun(x);
}

A. 0 1 3 4 5 6
B. 4 3 2 1
C. 0 1 2 3 4
D. 5 4 3 2 1 0

解答:这是一道简单的递归题。fun(4)的完成,需要fun(3)的完成,fun(3)的完成又需要f(2)的完成。以此类推,知道fun(0)。 完成顺序与调用顺序正好相反,所以答案为C。

猜你喜欢

转载自blog.csdn.net/weixin_41958234/article/details/105943335