欢迎来到C语言的世界
博客主页:卿云阁欢迎关注点赞收藏⭐️留言
本文由卿云阁原创!
本阶段属于锻体阶段,希望各位仙友顺利完成突破
首发时间:2021年1月21日
✉️希望可以和大家一起完成进阶之路!
作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
目录
0️⃣基础习题(一)
1️⃣基础习题(二)
2️⃣基础习题(三)
3️⃣循环结构程序设计
4️⃣一维数组程序设计
5️⃣二维数组的应用
6️⃣字符数组程序设计
7️⃣指针
8️⃣其他经典习题(一)
9️⃣经典习题(二)
0️⃣✨✨✨基础习题(一)✨✨✨1.编一个程序,输入 x 的值,按公式,计算y的值并输出。
#include#include int main() { float x,y; printf("请输x的值:"); scanf("%f",&x); if(x<=0) y=x+5; else { if(x<7) y=2*x-1; else y=2*x-sqrt(x); } printf("y的值:=%fn",y); return 0; } 2.某公司依据业绩发放不同比例的奖金。业绩达不到10万元的奖金数为业绩的1%;达到10万元但少于20万元的奖金数为业绩的1.5%;达到20万元但少于40万元的奖金数为业绩的2%;达到40万元但少于60万元的奖金数为业绩的2.5%;60万元以上的为3%,编程实现输入一个员工的业绩,输出奖金数。要求用if-else和switch两种语句编写两个不同的程序
#include#include int main() { int a,b; printf("员工的业绩a=:"); scanf("%d", &a); if (a <= 100000) { b = a * 0.1; } else if (a <= 200000) { b =a * 0.15; } else if (a <= 400000) { b = a * 0.2; } else if (a <= 600000) { b = a * 0.25; } else { b = a * 0.3; } printf("奖金数=%dn", b); return 0; } #include #include int main() { int a; printf("员工的业绩a=:"); scanf("%d", &a); switch(a/100000) { case 0: printf("奖金数=%d",a * 0.1); break; case 1: case 2: printf("奖金数=%d",a * 0.15); break; case 3: case 4: printf("奖金数=%d",a * 0.2); break; case 5: case 6: printf("奖金数=%d",a * 0.25); break; default: printf("奖金数=%d",a * 0.3); break; } return 0; } 3. 输入三个double型的数,把它们由小到大输出。
#includeint main() { double a,b,c,temp; printf("请任意输入三个数:n"); scanf("%lf%lf%lf",&a,&b,&c); printf("排序前的三个数为:%lf %lf %lfn",a,b,c); if(a>b) { temp=a; a=b; b=temp; } if(a>c) { temp=a; a=c; c=temp; } if(b>c) { temp=b; b=c; c=temp; } printf("排序后的三个数为:%lf %lf %lfn",a,b,c); } 4. 用if-else语句的嵌套实现下面分类输出,x,y,z值由键盘输入。
当x>y,z>0,则输出“A类”
当x>y,z<=0,则输出“B类”
当x
0 ,则输出“C类”当x
,则输出“D类” #includeint main() { int x,y,z; printf("请任意输入三个数:n"); scanf("%d%d%d",&x,&y,&z); if(x>y) {if(z>0) printf("A类"); else printf("B类"); } else {if(z>0) printf("C类"); else printf("D类"); } return 0; } 5. 输入A-Z、a-z或0-9当中的任一个字符,判断它是大写字母、小写字母还是数字。
#includeint main(void) { int a; printf("请输入任意a:n"); scanf("%c", &a); if(a >= '0' && a <= '9'){ printf("a是一个数字。"); } if (a >= 'A' && a <= 'G') { printf("str是一个大写字母。"); } if (a >= 'a' && a <= 'z') { printf("str是一个小写字母。"); } } 6. 从键盘输入月份,然后根据月份用switch语句输出季节名。
#includeint main(void) { int m; printf("月份:"); scanf("%d",&m); switch (m) { case 1: case 2: printf("冬天"); break; case 3: case 4: case 5: printf("春天"); break; case 6: case 7: case 8: printf("夏天"); break; case 9: case 10: case 11: printf("秋天"); break; case 12: printf("冬天"); break; } return 0; } 7. 输入一个1到10的整数,输出一个以这个数字开始的成语,如果输入的数超出1-10的范围,则输出“输入数据错误!”。要求用switch语句实现
#includeint main(void) { int m; printf("1到10的整数:"); scanf("%d",&m); switch (m) { case 1: printf("一帆风顺"); break; case 2: printf("二龙戏珠"); break; case 3: printf("三阳开泰"); break; case 4: printf("四平八稳"); break; case 5: printf("五福临门"); break; case 6: printf("六六大顺"); break; case 7: printf("七星报喜"); break; case 8: printf("八面威风"); break; case 9: printf("九九回一"); break; case 10: printf("十全十美"); break; default: printf("输入数据错误"); } return 0; } 8. 输入一个年份,判断它是不是闰年。符合下列两个条件之一的为闰年:(1)年份能被4整除,且不能被100整除。(2)能被400整除。
#includeint main(void) { int n; printf("请输入要判断的年份:"); scanf("%d",&n); if ((n % 4 == 0 && n % 100 != 0) || n % 400 == 0) printf("%d年是闰年!n",n); else printf("%d年不是闰年!n", n); return 0; } 9. 输入年、月、日三个数据,用switch语句输出该日期是该年的第几天。
#includestruct Date { int year; int month; int day; }; int main() { struct Date date; printf("请输入年、月、日:n"); scanf("%d%d%d",&date.year,&date.month,&date.day); int days; switch(date.month) { case 1:days=date.day;break; case 2:days=date.day+31;break; case 3:days=date.day+59;break; case 4:days=date.day+90;break; case 5:days=date.day+120;break; case 6:days=date.day+151;break; case 7:days=date.day+181;break; case 8:days=date.day+212;break; case 9:days=date.day+243;break; case 10:days=date.day+273;break; case 11:days=date.day+304;break; case 12:days=date.day+334;break; } if((date.year%4==0&&date.year%100!=0||date.year%400==0)&&date.month>=3)//闰年三月份以后多一天 days+=1; printf("%d年%d月%d日是%d年的第%d天n",date.year,date.month,date.day,date.year,days); return 0; } 10.有一个奖励分配,分为A,B,C,D四个等级。其中B等级又分三个等级1,2,3。A等级奖励为10万,B等级1,2,3分别为8万,7万5,6万5,C等级6万,D等级为3万。编程输入等级后,输出相应等级的奖励数
#includeint main() { char a; int b; printf("员工的等级=:"); scanf("%c", &a); if(a='B') { printf("等级=:"); scanf("%d", &b); switch(b) { case 1: printf("奖励为8万"); break; case 2: printf("奖励为7.5万"); break; case 3: printf("奖励为6.5万"); break; default: printf("输入错误"); break; } } else switch(a) { case 'A': printf("奖励为10万"); break; case 'C': printf("奖励为6万"); break; case 'D': printf("奖励为3万"); break; default: printf("输入错误"); break; } return 0; }
1️⃣✨✨✨基础习题(二)✨✨✨1. 写一个程序,功能是从键盘接收三个英文字母,并按输入顺序的反向输出出来,然后,换行输出这三个字符ASCII码值的和。要求用getchar接收字符,用putchar输出字符
#includeint main() { char a,b,c; printf("请输入三个字符:"); a=getchar(); b=getchar(); c=getchar(); printf("输出顺序:"); putchar(c); putchar(b); putchar(a); printf("n"); printf("%这三个字符ASCII码值的和:%dn",a+b+c); return 0; } 2. 输入一个圆的圆心坐标(定义两个变量,分别接收两个坐标)以及圆周上一个点的坐标(全部为float型数据),编程计算并输出这个圆的面积。
#include#include int main() { float x1,x2,y1,y2,r,area; printf("请输入圆的圆心坐标:x1= ,y1= n"); scanf("%lf%lf",&x1,&y1); printf("圆周上一个点的坐标:x2= ,y2= n"); scanf("%lf%lf",&x2,&y2); r=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); printf("圆的半径为:r=%fn",r); area=3.14*r*r; printf("圆的面积为:area=%fn",area); return 0; } 3. 输入一个平面点的坐标以及一条直线方程y=a*x+b中的a和b,计算这个平面点到直线的距离,并输出,精确到小数点后两位。
提示:如果用到绝对值的计算,程序代码中要把math.h包含进来,求绝对值的函数为fabs(x)。
#include#include int main() { float x,y,z,a,b,d; printf("请输入坐标:x= ,y= n"); scanf("%lf%lf",&x,&y); printf("请输入:a= ,b= n"); scanf("%lf%lf",&a,&b); d=fabs(a*x-y+b)/sqrt(a*a+1); printf("这个平面点到直线的距离:d=%0.2fn",d); return 0; } 4.编程从键盘中输入3*3的行列式的9个元素值,计算并输出该行列式的值
#includeint main() { int a,b,c,d,e,f,g,h,i,sum; printf("请输入行列式的元素:,n"); scanf("%d%d%d%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f,&g,&h,&i); printf("行列式为:n"); printf("*%d %d %d*n",a,b,c); printf("*%d %d %d*n",d,e,f); printf("*%d %d %d*n",g,h,i); sum=a*e*i+d*h*c+g*b*f-c*e*g-b*d*i-a*f*h; printf("该行列式的值sum=%dn",sum); return 0; } 5. 编程从键盘中输入一个二元一次方程组中a,b,c,d,e,f这六个数据,求x,y的值并输出。
提示:把a,b,c都乘以e,把d,e,f都乘以b,那么,。输入数据时,要确保(a*e-d*b)的值不为0。
#includeint main() { int a,b,c,e,f,x,y; float d,d1,d2; printf("请输入相关的值:n"); scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f); d1=c*e-b*f; d2=a*f-c*d; d=a*e-b*d; printf("d1=%fn",d1); printf("d2=%fn",d2); printf("d=%fn",d); x=d1/d; y=d2/d; printf("x=%fn",x); printf("y=%fn",y); return 0; } 6. 华氏温度F与摄氏温度c的转换公式为,请编程输入一个华氏温度,并输出其对就的摄氏温度。
#includeint main() { float F,C; printf("请输入您需要转换的华氏温度:"); scanf("%f",&F); C = (F-32)*5/9.0; printf("其对应的摄氏温度为:%.2f n",C); }
2️⃣✨✨✨基础习题(三)✨✨✨1.下面的程序计算由键盘输入的任意两个整数的平均值:
#includeint main(void) { int a,b; float avg; scanf("%d%d",&a,&b); avg=a+b/2; printf("The average is :%f ",avg); return 0; } 2.
要将"China"译成密码,译码规律是:用原来字母后面的第3个字母代替原来的字母。例如,字母"A"后面第 4个字母是"E",用"E"代替"A"。因此,"China"应译为"Fklqd"。请编一程序,用赋初值的方法使 c1、c2、c3、c4、c5五个变量的值分别为'C'、'h'、'i'、'n'、'a',经过运算,使c1、c2、c3、c4、c5分别变为'F'、'k'、'l'、'q'、'd',并输出。输入程序,并运行该程序。分析是否符合要求。
#includeint main() { char c1 = 'C',c2 = 'h',c3 = 'i', c4 = 'n',c5 = 'a'; c1+=3; c2+=3; c3+=3; c5+=3; c4+=3; printf("%c%c%c%c%c%c",c1,c2,c3,c4,c5); return 0; } 3.分析表达式的值
#includeint main() { int a=1,b=2,c=3; printf("%d", a+1!=b ); return 0; } #includeint main() { short a=4,b=3; printf("%d",a && b ); return 0; } #includeint main() { unsigned count=0; double num=1.1; _Bool x=0; printf("%d%lf%d",count && 1 ); return 0; } #includeint main() { int a,b; printf("%d", a=b=4*6 ); return 0; } #includeint main() { int a=4,b=3,c=9; printf("%dn", a=1+a>b?c:c+b); printf("%d",a); printf("%d",a>b++?b+12:a); return 0; } 4.表达式f=(3.0,4.0,5.0),(2.0,1.0,0.0)计算完成后,整个表达式的值是多少,变量f的值是多少?
#includeint main() { float f; f=(3.0,4.0,5.0),(2.0,1.0,0.0); printf("%fn",(3.0,4.0,5.0),(2.0,1.0,0.0) ); printf("%f",f); return 0; } 4.有定义int a=12,b=5;
1.则a+a/b的值是多少?
有定义char a='A'; int b=10; 则表达式a/b的值是多少?
有定义char a='A'; int b=10; 则表达式a*1.0f/b的值是多少?
#includeint main() { int a=12,b=5; printf("%dn",a+a/b ); return 0; } #include int main() { char a='A'; int b=10; printf("%dn",a/b); return 0; } #include int main() { char a='A'; int b=10; printf("%dn",a*1.0f/b); return 0; } 5.在程序中,定义一个复数变量和一个布尔变量,赋值后输出
#include#include int main() { _Bool a = 1; complex double s1 = 1.0 + 2.0*I; printf("a==%d, n", a); printf("s1的实部为%f, 虚部为%f, 模为%fn", creal(s1), cimag(s1)); return 0; }
3️⃣✨✨✨循环结构程序设计✨✨✨1.计算sum的值。
#includeint main(void) { int i,j; double sum; for (i = 1, sum = 0; i <= 20; i++) { int fac=1; //加你的代码,fac 赋初值 1; for (j = 1; j <= i; j++) //求i的阶乘 fac*=j; //加你的代码求变量fac 连乘求积; sum+=1.0/fac; //变量 sum 累加fac的倒数,这里要注意整数与整数相除结果为整数; } printf("sum=%f",sum); } 一个单循环 #include int main(void) { int j; double sum; double fac=1; //加你的代码,fac 赋初值 1; for (j = 1; j <= 20; j++) //求i的阶乘 { fac*=j; //加你的代码求变量fac 连乘求积; sum+=1.0/fac; //变量 sum 累加fac的倒数,这里要注意整数与整数相除结果为整数; } printf("sum=%f",sum); }
2.编程求100~300之间的素数和。
#include "stdio.h" #include "math.h" int main(void) { int i,j,sum; //加代码定义变量; for(i=100;i<=300;i++)//加代码,把外层循环变量 i 从 100 递增到 300 { int flag = 0; //标志变量赋 0; for(j=2;j=sqrt(i)) sum+=i; } //如果标志变量为 0 (是素数),进行求和; printf("sum=%d",sum);//输出求和结果; return 0; }
3.编程输出以下图形。
*
***
*****
#include "stdio.h" int main(void) { int i,j,k; for(i=0; i<=2; i++) { for(j=0; j<=i; j++) printf("*"); printf("n"); } return 0; }****** ******** *
****** ***** *****
****** *** *********
****** * *************
#include "stdio.h" int main(void) { int i,j,k; for(i=0; i<=3; i++) { for(j=0; j<=5; j++) printf("*"); printf("n"); } return 0; }#includeint main() { int i,j,k; for(i=1;i<=4;i++) { for(j=6;j>2*i-2;j--) //打印*三角形左侧每行空格 { printf(" "); } for(k=1;k<=4*i-3;k++) //打印每行* { printf("*"); } printf("n"); } return 0; } #include "stdio.h" #includeint main(void) { int i=1,j,k,r=5; //r表示行数 for(i=-1*r;i<=r;i++) { for(k=1;k<=abs(i);k++) //输出一行前的空格 { printf(" "); } //下面输出一行中的所有*。 for(j=1;j<= 2 *(5-abs(i))+1;j++) { printf("*"); } printf("n"); } return 0; }
4.在1~20中,找出满足其和为30的三个的正整数(可以相同)。
#include "stdio.h" int main(void) { int i,j,k; for(i=1;i<=20;i++) { for(k=1;k<=20;k++) { for(j=1;j<=20;j++) { if(i+k+j==20) printf("i=%d k=%d j=%dn",i,k,j); } } } return 0; }
5.利用两重循环,输出80~100所有整数的两个因子,如果此整数是质数,则直接输出“质数”。
#include "stdio.h" int main(void) { int i,j,k,num; for(num=20;num<=80;num++) { for(i=2;i<=num-1;i++) if(num % i==0) { printf("该素数=%d 因子a=%d 因子b=%dn",num,i,num/i); break; } if(i>num-1) printf("该质数=%dn",num); } return 0; }
6. 用两重循环利用积分的原理,求一个半径为r的圆的面积。要求用for语句、while语句和do语句分别实现,r值由输入得到。
#include "stdio.h" #include "math.h" int main() { int r; //定义r为半径 double i,s; double s1=0; //定义赋值s printf("请输入r="); scanf("%d",&r); //输入任意整数值做半径 for(i=0;i<=r;i+=0.00000001) { s1+=0.00000001*2*sqrt(r*r-i*i); s=2*s1; } printf("面积s=%fn",s); return 0; } while语句 #include "stdio.h" #include "math.h" int main() { int r; //定义r为半径 double i,s; i=0; double s1=0; //定义赋值s printf("请输入r="); scanf("%d",&r); //输入任意整数值做半径 do { s1+=0.00000001*2*sqrt(r*r-i*i); s=2*s1; i+=0.00000001; }while(i<=r); printf("面积s=%fn",s); return 0; } do语句 #include "stdio.h" #include "math.h" int main() { int r; //定义r为半径 double i,s; i=0; double s1=0; //定义赋值s printf("请输入r="); scanf("%d",&r); //输入任意整数值做半径 while(i<=r) { s1+=0.00000001*2*sqrt(r*r-i*i); s=2*s1; i+=0.00000001; } printf("面积s=%fn",s); return 0; }
4️⃣✨✨✨一维数组程序设计✨✨ ✨1.下列程序均可以为一维数组元素赋值,请输入程序并运行。比较各方法的不同。
1.在定义数组的同时对数组初始化,并理解数组名变量的值。
#include "stdio.h" int main(void) { int a[4] ={5,4,9,21}; printf("n%d%d%d%dn",a[0],a[1],a[2],a[3]); printf("%ldn",a); return 0; } //解释数组名是一个地址,它可以不可以被赋值 // 数组名是一个地址
用语句为一维数组元素进行赋值。
#include"stdio.h" int main(void) { int a[5]; a[0]=22; a[1]=24; a[2]=26; a[3]=28; printf("n%d %d %d %d %dn",a[0],a[1],a[2],a[3],a[4]); return 0; }//解释输出a[4]的结果。a[4]没有被赋值,此时a[4]=0
用循环结构为每个数组元素赋值,输出该数组的每一个元素的值#include "stdio.h"
int main(void) { int i,a[5]; for(i=0; i<5; i++) scanf("%d",&a[i]); printf("n"); for(i=0; i<5; i++) printf("%d ",a[i]); printf("n"); printf("%ld %ldn",a,&a[0]); return 0; } //&a[i]是地址,a[i]是地址里存储的值 //a和&a[0]都是首元素的地址
2.编写一程序,为一维数组a中的元素赋值,并按照逆序输出。
#include"stdio.h" int main(void) { int i, a[10]; //定义循环变量i和一维数组a for(i=0;i<=9;i++) scanf("%d",&a[i]); for(i=9;i>=0;i--) printf("%d ",a[i]); printf("n"); printf("%ld n",&a[0]); printf("%ld n",&a[1]); printf("%ld n",&a[2]); printf("n"); return 0; } While #include"stdio.h" int main(void) { int a[10]; //定义循环变量i和一维数组a int j=9; int i=0; while(i<=9) { scanf("%d",&a[i]); i++;} while(j>=0) { printf("%d ",a[j]); j--;} printf("n"); printf("%ld n",&a[0]); printf("%ld n",&a[1]); printf("%ld n",&a[2]); printf("n"); return 0; }
3.编写程序,输出一维数组arr中的元素最小值及其下标。
编程提示:
1.定义一个变量min,它的类型与定义数组时用的类型一致,用它来存放数组各元素的最小值,min=arr[0],然后定义一个unsigned变量pos,初始化为0。即从数组第零个元素开始判断。
2.通过循环,依次判断数组中的每一个元素arr[i]是否小于arr[pos],如果小于,则将把i值赋给pos,将arr[i]赋给arr[pos]。
3.循环结束后,pos则为最小值下标,arr[pos]为最小值,并输出
#include"stdio.h" int main(void) { int i=0; int arr[10]={9,8,7,6,1,3,5,18,2,4}; int min=arr[0]; unsigned pos=0; printf("for 循环n"); for(i=0;i<11;i++) if (arr[i]
4.分别求出一维数组中下标为偶数和奇数的元素之和,并输出。
编程提示:
1.定义一个数组arr并初始化。假设定义的元素个数为N(N大小等于4)。
2.定义两个整型变量evensum和oddsum,用于存放下标为偶数和奇数的元素和,并把它们均初始化为0。
3.定义一个变量k,如果N为奇数,令K=N-1,否则K=N;从数组的第0个元素开始,每次循环变量i递增2,则循环结束一直到i
4.循环结束后,如果N为奇数,则执行evensum+=arr[i];
5.输出evensum和oddsum元素之和。
#include "stdio.h" int main(void) { int N=4; int k; int i, evensum=0,oddsum=0; int arr[N]; for(i=0;i
5️⃣✨✨✨二维数组的应用✨✨✨1.二维数组的初始化,即给二维数组的各个元素赋初值。下面的几个程序都能为数组元素赋值,请输入程序并运行,比较这些赋值方法有何异同。
1.在定义数组的同时对数组元素分行初始化。
int main(void) { int i,j,a[3][3]= {{21,22,23} , {24,25,26} }; int b[3][3]={1,2,3,4,5,6}; for(i=0; i<3; i++) { for(j=0; j<3; j++) printf("%d ",a[i][j]); printf("n"); } printf("n"); for(i=0; i<3; i++) { for(j=0; j<3; j++) printf("%d ",b[i][j]); printf("n"); } return 0; }
2.分别使用受指定的初始化器、以及与顺序下标初始化器结合的方式初始化一个二维数组arr[100][100]。并计算它们当中各元素的和。
#include "stdio.h" int main(void) { int i,j; int a[100][100]= { [0] = {[0] = 11}, [1] = {[1] = 22}, }; int b[3][3]={1,2,3,4,5,6,7,8,9,}; int sum_a=0,sum_b=0; for(i=0; i<100; i++) { for(j=0; j<100; j++) { sum_a+= a[i][j]; } } for(i=0; i<3; i++) { for(j=0; j<3; j++) { sum_b+= b[i][j]; } } printf("sum_a=%d n",sum_a); printf("sum_b=%d n",sum_b); return 0; }
3.求一个4×4矩阵的主对角线元素之和,填空并运行程序。
编程提示:
1.定义一个4行4列的二维数组a。
2.可利用双重循环的嵌套为该二维数组的各个数组元素赋值,一般格式为:
for(i=0; i<4; i++)
for(j=0; j<4; j++)
scanf("%d",&a[i][j]); //注意这里的a中数据变量的接收。.
编程用一个循环分别求一个方阵中主对角线和辅对角线上各数据的和。主对角线上数据下标的特征是:行下标和列下标相同。辅对角线上数据下标的特征是:行下标和列下标的和为方阵的行数-1。
#include "stdio.h" int main(void) { int a[4][4]= {{11,12,13,14} , {15,16,17,18} , {13,19,10,12} , {14,12,9,8} }; int i,Msum=0,Asum=0; int j=3; printf("n主对角线的元素值分别为:n"); for(i=0; i<4; i++) { printf("a[%d][%d]=%-3d", i, i, a[i][i]); Msum += a[i][i]; } printf("n其元素的和值为:%dn", Msum ); printf("n辅对角线的元素值分别为:n"); for(i=0; i<4; i++) { printf("a[%d][%d]=%-3d", i, i+j, a[i][i+j]); Asum += a[i][i+j]; j-=2; } printf("n其元素的和值为:%dn", Asum); return 0; }
4.杨辉三角的每行行首与每行结尾的数都为1,而且,每个数等于其左上及其右上二数的和,杨辉三角的第n行是(a+b)n的展开系数。编程打印杨辉三角(要求打印出9行)
#include "stdio.h" int main(void) { int N=9; int a[9][9]= {[0]={1},[1]={1,1}},i,j; for(i=2; i
5.一幅数字图像,通常是用二维矩阵存放其各像素点上的颜色值的,我们常说的灰度图像就是用一个二维矩阵存放各像素点上亮度值,并且各亮度值均是0~255之间的整数,试编程输出一幅灰度图像中各亮度值的概率(共256个概率值)。
实例:
假设一幅图像中的亮度值 ,则亮度为25出现的概率是3/9,亮度为34和45出现的概率均为2/9,亮度12和23出现的概率均为1/9。其余在0~255之间的概率值均为0。编程思路:假设图像用二维数组表示为int img[M][N],可以定义一个一维数组float p[256],并全部初始化为0。然后用二重循环遍历图像矩阵的每一个值,并执行p[img[i][j]]++;,则最后亮度值为i的概率就可以用p[i]/(M*N);计算。
#include "stdio.h" int main(void) { int img[3][3]={25,34,45,12,25,34,45,23,25}; int i,j,k,l; float p[256]={}; for(i=0;i<3;i++) for(j=0;j<3;j++) for(k=0;k<3;k++) for(l=0;l<3;l++) if(img[i][j]==img[k][l]) { p[img[i][j]]++; } for(i=0;i<3;i++) for(j=0;j<3;j++) printf("%d:%fn",img[i][j],p[img[i][j]]/12); return 0; }
6️⃣✨✨✨字符数组程序设计✨✨✨1.输入并运行下面的程序,观察程序运行的结果,并分析原因
#include "stdio.h" int main(void) { char a[10]={ 'I', ' ' , 'a' , 'm', ' ', 'a', ' ', 'b' , 'o', 'y'}; printf("%sn",a); return 0; }#include "stdio.h" int main(void) { char a[11]={ 'I', ' ' , 'a' , 'm', ' ', 'a', ' ', 'b' , 'o', 'y'}; printf("%sn",a); return 0; }2.编程输入一行字符,字符个数不超过50个,分别统计出其中英文大、小写字母、空格及其它字符的个数,并输出。
编程提示:
1.定义一个一维字符数组str[50],然后定义四个unsigned型变量,初始化为0,分别用于统计大小字母、空格及其它字符的个数。
2.因为有空格,所以用串函数gets来获取从键盘中输入的字符串。注意不要用 scanf函数接收字符串数据。
3.用一个循环遍历str串的每一个字符,在循环体对每一种类型的字符进行个数统计,如果该字符是对应的字符,则相应的计数变量加1。
4.当循环运行结束,输出各计数器的值。
#includeint main() { char str[80]; //存放字符 int i; int b[5]={0}; //存放统计的个数 printf("please input a stringn"); gets(str); for(i=0;str[i]!='';i++) { if(str[i]>='a'&&str[i]<='z') //统计小写字母个数 b[0]++; else if(str[i]>='A'&&str[i]<='Z')//统计大写字母个数 b[1]++; else if(str[i]>='0'&&str[i]<='9') //统计数字个数 b[2]++; else if(str[i]==' ') //统计空格个数 b[3]++; else b[4]++; //统计其他字符个数 } printf("小写字母:%dn",b[0]); printf("大写字母:%dn",b[1]); printf("数字:%dn",b[2]); printf("空格:%dn",b[3]); printf("其他字符:%dn",b[4]); return 0; } 3.编写一个程序,实现将字符串2连接到字符串1的后面并输出,请补充完整。不能用strcat函数。
提示:先用一个循环找到字符串1的结尾处,即'',然后用一个循环把字符串2连接到字符串1的后面。用一个循环把字符串2的每一个字符顺序赋给字符串1从len开始往后的空间。循环结束后,把字符''赋到字符串1的最后,以便形成字符串。
#include "stdio.h" int main(void) { char str1[80]="This Is a ",str2[80]="c Program"; printf("String1 is: %sn",str1); printf("String2 is: %sn",str2); int i, len=0; for(len=0;str1[len]!= '';len++); for(i=0;str2[i]!= '';i++) str1[len+i]=str2[i]; printf("Result is: %sn",str1); return 0; }
4.一个二维字符数组中,存放了10个单词,每行一个单词,试编程实现把些单词按英文词典的格式排序。
#include#include int main() { char string[10][50],temp[50]; printf("请输入六个单词:n"); for(int i=0;i<6;i++) scanf("%s",string[i]); for(int i=0;i<5;i++) for(int j=i+1;j<6;j++) if (strcmp(string[i],string[j])==1) { strcmp(temp,string[i]); strcmp(string[i],string[j]); strcmp(string[j],temp); } printf("排序好:n"); for(int i=0;i<6;i++) puts(string[i]); return 0; }
7️⃣✨✨✨指针✨✨✨1.在main函数中输入两个整数,并使其从大到小输出,用指针变量实现数的比较。
#includeint main(void) { int a,b; int *pa=&a,*pb=&b,*temp=0; printf("please input two integers:n"); scanf("%d%d",pa,pb); if(a 2.编写一个函数,当主调函数调用它时,可以使主调函数中的两个变量实现数据互换。写出验证的程序代码。
#includevoid swap(int *p1, int *p2) { int temp; temp=*p1; *p1=*p2; *p2=temp; } int main(void) { int a,b; scanf("%d,%d",&a,&b); swap(&a,&b); printf("n%d,%dn",a,b); return 0; } 3.用指针和++运算符输出一维数组的全部元素。
#include
int main(void)
{
int a[3]={1,2,3};
int *p;
for(p=a;p
printf("%dn",*p);
return 0;
}
4.定义一个二维字符数组,输入三个字符串,并按大到小的顺序输出。用指向字符的指针进行处理
#include#include void sort(char *p,char *q,char *r) { void swap(char *p,char *q); if(strcmp(p,q)>0) { swap(p,q); } if(strcmp(p,r)>0) { swap(p,r); } if(strcmp(q,r)>0) { swap(q,r); } } void swap(char *p,char *q) { char t[20]; strcpy(t,p); strcpy(p,q); strcpy(q,t); } void print(char **a) { int i; for(i=0;i<3;i++) { printf("%sn",*(a+i)); } } void main() { void sort(char *p,char *q,char *r); void print(char **a); char a[3][30]; char *str[3]; int i; for(i =0;i<3;i++) { str[i] = a[i]; } for(i=0;i<3;i++) { scanf("%s",str[i]); } sort(str[0],str[1],str[2]); print(str); } 5.定义一个函数,用指向一维数组的指针作为参数,求出一个二维数组中各列的和,并把结果存放在一个一维数组中,带回到main函数中,并输出。
#includeint sum1(float (*arr)[3],float sum[],int row)//row接收二维数组的行数。 { int col,i; for(col=0;col<3;col++) for(i=0;i |
6.有一个一维数组arr,其元素个数为5*N个,类型为float,把这些元素顺序分成5个一组,取出每一个组的第一元素的首地址,存放到一个一维指针数组float* ptr[N]的元素中,并利用ptr数组输出arr中每一组开始元素的值。
#includeint main() { float arr[5][5]={1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5}; float *ptr[5]; for(int i=0;i<5;i++) { ptr[i]=arr+i; printf("%f ", *ptr[i]); } return 0; } 7.定义两个函数,一个函数求一个字符串长度并返回,别一个函数求一个字符串中英文字母的个数并返回。要求用“函数指针”调用这两个函数,结果在主函数中输出。
#includeunsigned Mystrlen(char *str) { unsigned i=0; for(i=0;str[i]!='';i++); return i; } unsigned charNUm(char *str) { unsigned num=0; for(int i=0;str[i]!='';i++) { if((str[i]>='a' && str[i]<='z') || (str[i]>='A' && str[i]<='Z')) num++; } return num; } int main(void) { unsigned (*fun)(char *); char str[100]="fieldfkeijdslfsd dfidf w"; int len,Num; fun=Mystrlen; //把函数的地址值赋给指针变量。这里可以赋值是因为fun //和Mystrlen作为指针指向的函数类型一致。 len=(*fun)(str); //调用函数。 fun=charNUm; Num=(*fun)(str); printf("len=%dn",len); printf("Num=%dn",Num); return 0; }
8️⃣✨✨✨其他经典习题(一)✨✨✨1.定义一个函数,用指向一维数组的指针作为参数,求出一个二维数组中各列的和,并把结果存放在一个一维数组中,带回到main函数中,并输出。
编程提示:要用一维数组存放各列和,可以在main函数中定义一个与二维数组列数一样多的一维数组,并把数组名作为参数传给调用函数。
假设main函数中定义的二维数组为:float martrix[M][N],则一维数组就可以定义为colsum[N],记得赋初值为0。所定义的函数形参为float (*arr)[N],float sum[],int row。row接收二维数组的行数。
所定义的函数中,用一个二重循环来求各列的值:
for(col=1;col
for(i=0;i
|
sum[col]+=arr[i][col];
第i行第col列的值有非常多的写法,arr[i][col]只是一种,大家可以灵活去写。例如写成(*(arr+i))[col]、*(*(arr+i)+col)、col[*(arr+i)]都可以。
#includeint sum1(float (*arr)[3],float sum[],int row)//row接收二维数组的行数。 { int col,i; for(col=0;col<3;col++) for(i=0;i |
2.利用指针数组实现对数组的排序
#includeint main(void) { int a[3]={1,2,3}; int *arr[3]; for(int i=0;i<3;i++) arr[i]=a+i; for(int i=0;i<2;i++) for(int j=0;j<2-i;j++) { int *tem; if(*arr[j]<*arr[j+1]) tem=arr[j]; arr[j]=arr[j+1]; arr[j+1]=tem; } for(int i=0;i<3;i++) printf("%d ",*arr[i]); return 0; }
3.
C语言中存放一个小数,其精确到的位数有限,如double型数据有效位数为15到16位,这还是整个数据的有效位数,小数位还没有这个位数。如果要计算一个数,要求计算出的结果精确到小数点后1000位,如何做到呢?比如计算20.0/7,要求输出其结果,并保留到小数点后100位,这可以用一个循环来做,具体思路是:第一步:定义并赋值int x=20,y=7;第二步:输出k=x/y和一个小数点。第三步:循环执行x=(x-k*y)*10;k=x/y;并输出k。
#includeint main() { int x=20,y=7; int c,i=0,h,k; c=x/y; printf("%d.",c); while(i<100) { x=(x-k*y)*10; k=x/y; printf("%d",k); i++; } printf("/n"); return 0; } 4.二维数组名可作为实参传给形参,形参有一种定义方式是 “数据类型 变量名[][列数]”。
二维数组名作为地址,在这个地址中存放的数据类型,是它的元素的类型,即一维数组类型。
一维数组名作为地址,在这个地址中存放的数据类型,就是它的变量的数据类型。 前面讲过,数组名在两种情况下,直接指定整个数组。即&数组名, sizeof(数组名),其它情况下,均是以地址的形式存在。
定义一个函数,功能是计算一个4*3的二维矩阵中所有数据的和,并在main函数中调用,假设这个矩阵中的数据都是int型
#includeint arraySum(int A[][3],int row) { int i,j,sum=0; for(i=0;i |
int arraySum(int A[][3],int row):
这里的形参A,是一个装地址的变量,
所装地址中,存放的是一个由3个int型数据组成的一维数组类型。因此,如果要调用这个函数,实参的对应类型也最好是这种有3个int的一维数组类型。
要保证数据类型相同。
5.数组作为函数参数传参
如果要用一个函数去处理主调函数中的一维数组,其形参形式为:
返回类型 函数名(其它形参,主调函数中定义数组时的类型 形参名[],其它形参)
主调函数中实参为数组名。
形参数组名实质上是一个存放地址的变量,这个变量中存放的是定义形参时指定的数据类型。
#includeint MyStrlen(char mystr[]) //形参 { int len=0; for(len=0; mystr[len]!='';len++); //条件成立执行的是空语句 return len; } int main(void) { char str[100]; //定义一个字符数组 gets(str); //输入字符存入数组 printf("%dn",MyStrlen(str)); //输出 return 0; }
注意:1.空格也是字符。
2.str[i]=i[str]
本质:str+i
3.gets(str)找到地址,顺序放置。
6.
函数参数(非常详细)(交换实参的值)
(1)
#includevoid exchange(int a,int b) //定义函数,形参为a、b,并实现a、b互换。 { int temp; temp=a; a=b; b=temp; printf("a=%d,b=%dn",a,b); } int main(void) { int a=10,b=20; exchange (a,b); //调用函数,执行两数互换。 printf("a=%d,b=%dn",a,b); return 0; } (2)
#includevoid exchange(int a[],int b[]) //改动点 { int temp; temp=a[0]; //改动点 a[0]=b[0]; //改动点 b[0]=temp; //改动点 } int main(void) { int a=10,b=20; exchange (&a,&b); //改动点 printf("a=%d,b=%dn",a,b); return 0; } (3)
#includevoid exchange(int a[],int b[]) //改动点 { int temp; temp=a[0]; //改动点 a[0]=b[0]; //改动点 b[0]=temp; //改动点 printf("a=%d,b=%dn",a,b); } int main(void) { int a=10; int b=20; exchange (&a,&b); //改动点 printf("a=%d,b=%dn",a,b); return 0; } 6.图形与参数的分析
#include#include int main(void) { int r=23,n,h,x,i; // for(n=0;n =0;i--) {if((i+1)%11<5)printf("*"); else printf(" "); } printf("n"); } for(n=r-2;n>=0;n--) { h=r-n; x=n; for(i=0;i<=r-x+10;i++)printf(" "); for(i=0;i<=x;i++) {if((i+1)%11<5)printf("*"); else printf(" "); } for(i=x-1;i>=0;i--) {if((i+1)%11<5)printf("*"); else printf(" "); } printf("n"); } //类似输出图形的下半部分 return 0; } 7.求两个数的最大公约数
如果数a能被数b整除,a就叫做b的倍数,b就叫做a的约数。15能够被3或5整除,因此15是3的倍数,也是5的倍数。约数和倍数都表示一个整数与另一个整数的关系,不能单独存在。如只能说16是某数的倍数,2是某数的约数,而不能孤立地说16是倍数,2是约数。
几个整数中公有的约数,叫做这几个数的;其中最大的一个,叫做这几个数的最大公约数。例如:12、16的公约数有1、2、4,其中最大的一个是4,4是12与16的最大公约数,一般记为(12,16)=4。12、15、18的最大公约数是3,记为(12,15,18)=3。
几个自然数公有的倍数,叫做这几个数的公倍数,其中最小的一个自然数,叫做这几个数的最小公倍数。例如:4的倍数有4、8、12、16,……,6的倍数有6、12、18、24,……,4和6的公倍数有12、24,……,其中最小的是12,一般记为[4,6]=12。12、15、18的最小公倍数是180。记为[12,15,18]=180。若干个互质数的最小公倍数为它们的乘积的绝对值。
编程提示: 求最大公约数的方法有三种:
1.从两个数中较小数的开始向下判断,如果找到一个整数能同时整除m和n,则终止循环,这个数就是m和n的最大公约数。
#include "stdio.h" int main(void) { int m,n,i; printf("请输入m="); scanf("%d",&m); printf("请输入m="); scanf("%d",&m); i= (m>n)?n:m; for(i;i!=1;i--) if(m%i==0&&n%i==0) { printf("m和n的最大公约数i=%d",i); break; } }从整数2开始向上找,直至m和n中较小的数,每找到一个能同时被m和n整除的整数,将其存入一个变量中,当循环结束时,变量中存放的即为最大公约数。如果循环结果后,循环变量的值大于那个较小的数,则最大公约数为1(为什么?)。设n为m和n中较小的数,则如下程序段可实现:
#include "stdio.h" int main(void) { int m,i,n; printf("请输入m="); scanf("%d",&m); printf("请输入n="); scanf("%d",&n); n= (m>n)?n:m; int k,x; for(k=1; k<=n; k++) if(m%k==0 && i%k==0) { x=k; } printf("m和i的最大公约数x=%d",x); }辗转相除法。这种算法将求m和n(要求m>=n)的最大公约数问题转化为求其中的除数和两个数相除所得余数的公约数问题。即先求出m除以n的余数,然后以除数作为被除数,以余数作为除数,继续进行同样的运算,当余数为0时,此时的除数即为m和n的最大公约数。
#include "stdio.h" int main(void) { int m,n,b; printf("注意m是较大的数n"); printf("请输入m="); scanf("%d",&m); printf("请输入n="); scanf("%d",&n); b = m % n; while (b != 0) { m = n; n = b; b = m % n; } printf("m和n的最大公约数=%d",n); return 0; }
9️⃣✨✨✨经典习题(二)✨✨✨0.计算序列 1 - 1/4 + 1/7 - 1/10 + ...
#includeint main() { float s=0; int a,i=1; for (i=1;i<=2022;i+=3) { if(i%2==0) a=-a; s+=(1.0*a)/i; } printf("%fn",s); return 0; } 1.有红黄绿三种颜色的球,其中红球3个,黄球3个,绿球6个。现将这12个球混放在一个盒子中,从中任意摸出8个球,编程计算摸出球的各种颜色的搭配
#includeint main() { int m; int n; int j; int count; for(m=0;m<4;m++) for(n=0;n<4;n++) for(j=0;j<7;j++) if(m+n+j==8) count++; printf("%d",count); return 0; } 2.20790所有因子之和(不包括1和本身)
#includeint main() { int i; int sum=0; for(i=2;i<20790;i++) if(20790%i==0) sum+=i; printf("%d",sum); return 0; } 3.1002+1013……12002
#includeint main() { int i; int sum=0; for(i=1002;i<+12002;i+=11) sum+=i; printf("%d",sum); return 0; } 4.求2011~9999之间的素数平均值
#includeint main() { int i,j,count=0,sum=0; float ave; for(i = 2011;i<10000;i++) { for(j = 2; j<=i; j++) { if (i%j==0) break; } sum+=i; count ++; } ave = sum*1.0 / count; printf("The average is %0.2fn", ave); return 0; } 5.某公司2010年年产A产品11.5万件,公司生产能力每年提高9.8%,求出A产品产量能超过30万件的年份。
#include#include int main() { int y,year,w; for(y=0; ;y++) { w=11.5*pow(1+0.098,y); if(w>=30) { year=y+2011; break; } } year=y+2011; printf("year=%d",year); return 0; } 6.有36个人搬36块砖其中男人一次搬4块女人一次搬3块2个小孩抬一块砖要求一次全班晚会男女小孩各几人.(要求男,女,小孩都要有)
#include#include int main() { int i,j,m; for(i=1;i<36;i++) for(j=1;j<36;j++) for(m=1;m<36;m++) if(i+j+m==36 && 4*i+3*j+0.5*m==36) { printf("i=%d j=%d m=%dn",i,j,m); break; } return 0; } 7.爱因斯坦曾出过这样一道数学题:有一条长阶梯,若每步跨2阶,最后剩下1阶;若每步跨3阶,最后剩下2阶;若每步跨5阶,最后剩下4阶;若每步跨6阶,则最后剩下5阶;只有每步跨7阶,最后才正好1阶不剩。
#includeint main() { int x; for(x=1; ;x++) if (x % 2 == 1 && x % 3 == 2 && x % 5 == 4 && x % 6 == 5 && x % 7 == 0) { printf("x = %dn", x); break; } return 0; } 8.已知数列F(n) 当n等于1或n等于2时, F等于1 当n大于2,F(n) =(F(n-1)+F(n-2))%10000(求该数列前40项的和,要求使用循环实现.
#includeint main() { int i,j,n,k=1,s=0; for(i=1;i<=40;i++) { if(i==1||i==2) n=1; else { n=(j+k)%10000; j=k; k=n; } s+=n; } printf("s=%dn",s); return 0; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)