技术交流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循环列出所有的可能性,总个数为 ,这里的概率公式不需要了解,可以作为程序对错的一个很好的检验。
#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 ~
#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天… 观察规律。发现 。通过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。