C语言练习题---初学者

文章目录

声明

适合初学者学习
适合跟着课程学习,复习时,再拿这些题练手也中
有设置题目目录,查找时更方便
大多从谭浩强课本上摘取的,算是基础经典老题吧!
有些是搜集的题
例题是围绕着目录来撰写的
代码是本人自己编写的,或许也有其他方法
某些源代码可以扩展,使取数范围更广,只需改动代码中特定数的范围即可
学习目录:

  • 熟悉C语言程序编辑与调试环境
  • 顺序结构程序设计
  • 选择结构程序设计
  • 循环结构程序设计
  • 函数
  • 数组
  • 指针
  • 结构体

那么开始吧!

1、打印出 Hello World

输入:无
输出:Hello World
代码:

#include<stdio.h>
int main()
{
printf("Hello World");
return 0;
}

2、打印出图形

第一行和第四行各有九个*
例式:
在这里插入图片描述
代码:

#include<stdio.h>
int main(){
	printf("*********\nOK!\nHello!\n*********");
	return 0;
}

注:在printf打印时" "里的内容只能在一行,切记不能内容不能换行,但是在后面输出目标格式时可以换行,如:

printf("*********
**************");   //出错
printf("%d *** %f *** %d",a,
b,c);    //可以

3、求两个整数之和

#include<stdio.h>
main()
{
	int a,b;
	scanf("%d %d",&a,&b);
	printf("%d",a+b);
	return 0;
}

4、求三个数的最大值

输入:三个数值,格式:3,4,5
输出:三个数的最大值,格式:max=5

#include<stdio.h>
main()
{
	int a,b,c,max;
	scanf("%d,%d,%d",&a,&b,&c);
	if(a>b) max=a;
	else max=b;
	if(max<c) max=c;
	printf("max=%d",max);
	return 0;
}

5、两个数的交换

#include<stdio.h>
main()
{
	int a,b,z;
	scanf("%d %d",&a,&b);
	printf("a=%d b=%d\n",a,b);
	z=a;a=b;b=z;
	printf("a=%d b=%d\n"a,b);
	return 0;
}

不使用第三个变量,实现两个数的对调:

#include<stdio.h>
main()
{
	int a,b;
	scanf("%d %d",&a,&b);
	printf("a=%d b=%d\n",a,b);
	a=a+b;
	b=a-b;
	a=a-b;
	printf("a=%d b=%d\n",a,b);
}

6、有三个数a,b,c,要求按从大到小输出

#include<stdio.h>
main()
{
	int a,b,c,z;
	scanf("%d %d %d",&a,&b,&c);
	if(a<b){
	    z=a;a=b;b=z;}
	    if(a<c){
	    z=a,a=c,c=z;}
	if(b<c){
	    z=b;b=c;c=z;}
	printf("%d %d %d",a,b,c);
}

7、对多个数实现从大到小排序

法一(选择法):

#include<stdio.h>
main()
{
	int n,a[50];
	int i,j,mx,num;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	    scanf("%d",&a[i]);
	for(i=0;i<n;i++){
	    mx=i;
	    for(j=i+1;j<n;j++){
	    if(a[mx]<a[j]) mx=j;}
	    num=a[i];a[i]=a[mx];a[mx]=num;
	}
	for(i=0;i<n;i++)
	printf("%d ",a[i]);
}

法二(气泡法):

#include<stdio.h>
main()
{
	int n,a[20];
	int i,j,z;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	    scanf("%d",&a[i]);
	for(i=;i<n;i++)
	    for(j=0;j<n-i;j++)
	    if(a[j]<a[j+1]){
	    z=a[j];a[j]=a[j+1];a[j+1]=z;}
	for(i=0;i<n;i++)
	printf("%d ",a[i]);
}

8、数字的分离

输入:一个三位数
输出:输出该数字的百位,十位,个位,数字之间用一个空格隔开

#include<stdio.h>
main()
{
	int num,a,b,c;
	scanf("%d",&num);
	a=num/100;
	b=num/10%10;
	c=num%10;
	printf("%d %d %d",a,b,c);
}

9、判断一个数n能否同时被3和5整除

#include<stdio.h>
main()
{
	int n;
	scanf("%d",&n);
	if(n%3==0&&n%5==0)
	    printf("Yes\n");
	else printf("No\n");
	return 0;
}

10、求两个数m,n的最大公约数

【方法】:辗转相除法

#include<stdio.h>
main()
{
	int m,n,team;
	scanf("%d %d",&m,&n);
	if(m<=0||n<=0)return -1;
	while(n!=0){
	    team=m%n;
	    m=n;
	    n=team;}
	printf("%d\n",m);
	return 0;
}

11、求两个数m,n的最小公倍数

法一:【思路】:运用for循环,一个数一个数的找,直到对两数取余都为0

#include<stdio.h>
main()
{
int m,n,i;
scanf("%d %d",&m,&n);
for(i=m;i>0;i++)
    if(i%m==0&&i%n==0)
        break;
printf("%d,%d的最小公倍数:%d",m,n,i);
return 0;
}

法二:【思路】:先找到两数的最大公约数

#include<stdio.h>
main()
{
	int gcd(int a,int b);
	int m,n,c,d;
	scanf("%d %d",&m,&n);
	c=gcd(m,n);
	d=m*n;
	c=d/c;
	printf("%d,%d的最小公倍数:%d\n",m,n,c);
	}
	int gcd(int a,int b)
	{
	int t;
	while(b!=0){
	    t=a%b;
	    a=b;
	    b=t;}
	return a;
}

12、输出1800~2020年中是闰年的年份

  • 能被4整除但不能被100整除
  • 能被400整除
#include<stdio.h>
main()
{
	int i,j;
	for(i=1800,j=0;i<=2020;i++)
	    if((i%4==0&&i%100!=0)||(i%400==0)){
	        printf("%d ",i);
	        j++;
	if(j%5==0&&j!=0) printf("\n");}
	printf("\n");
	return 0;
}

13、求ax2+bx+c=0的根,分别考虑d=b2-4ac 大于0,等于0和小于0这三种情况

#include<stdio.h>
#include<math.h>
main()
{
	int a,b,c,d;
	float x1,x2;
	printf("输入三个数a b c\n");
	scanf("%d %d %d",&a,&b,&c);
	d=b*b-4*a*c;
	if(d<0) printf("方程无根\n");
	else if(d>=0){
	    x1=(-1*b+sqrt(d*1.0))/(2*a);
	    x2=(-1*b-sqrt(d*1.0))/(2*a);
	if(d=0) printf("x1=x2=%.2f",x1);
	else printf("x1=%.2f x2=%.2f",x1,x2);}
}

注:sqrt函数括号内数值为小数,否则会出错
说明:此代码将a,b,c的值默认为整数,修改下代码可将数值改为小数类型

------switch多分支选择结构------

14、运费问题

某快递公司根据投送目的第距离公司的远近,将全国划分为5个区域:

  • 0区:同城
  • 1区:临近两省
  • 2区:1500公里(含)以内
  • 3区:1500—2500公里
  • 4区:2500公里以上
    快递费按照邮件重量计算,由起重费用、续费费用两部分构成,具体计算方法如下:
    (1)起重(首重)1公斤按起重资费计算(不足1公斤,按1公斤计算),超过首重的重量,按公斤(不足1公斤,按1公斤计算)收取续重费;
    (2)同城起重资费10元,续重3元/公斤;
    (3)寄往1区的邮件,起重资费10元,续重4元;
    (4)寄往其他地区的邮件,起重资费统一为15元。续重:
    2区:5元/公斤;3区:6.5元/公斤;4区:10/公斤。
    输入:区域编码 重量
    输出:运费
    计算结果保留两位小数
    邮件重量应大于0公斤,区域编码不能超过0–4的范围,否则输出:输入有误。
#include<stdio.h>
main()
{
	int area,wt;
	float weight,sum;
	int b;
	printf("输入区域0-4 输入重量:\n");
	scanf("%d %f",&area,&weight);
	if(area<0||area>4||weight<=0){
		printf("输入有误");
		return 0;
	}
	b=weight;
	if(weight<1)
	    wt=1;
	else if(weight-b>0)
	    wt=b+1;
	else wt=b;
	wt-=1;  
	switch(area){
		case 0:sum=10+wt*3;break;
		case 1:sum=10+wt*4;break;
		case 2:sum=15+wt*5;break;
		case 3:sum=15+wt*6.5;break;
		case 4:sum=15+wt*10;break;
	}
	printf("运费:%.2f\n",sum);
	return 0;
}

15、学生成绩等级换算

要求:给出一百分制成绩,要求输出成绩等级A、B、C、D、E。 90分以上为A;80-89分为B;70-79分为C;60-69分为D;60分以下为E。如果输入数据不在0~100范围内,请输出一行:“Score error!”。

#include<stdio.h>
main()
{
	float score;
	int s;
	scanf("%f",&score);
	s=score/10;
	switch(s){
	case 10:
	case 9:printf("A\n");break;
	case 8:printf("B\n");break;
	case 7:printf("C\n");break;
	case 6:printf("D\n");break;
	case 5:
	//跟上面返回结果一样
	case 4:
	case 3:
	case 2:
	case 1:
	case 0:printf("E\n");break;
	default :printf("Score error!");}
}

------第五章 循环结构------

16、算法,求1-1/2+1/3-1/4+……+1/99-1/100的值

#include<stdio.h>
main()
{
	int sign=1;
	double d=2.0,sum=1.0,term;
	while(d<=100){
	    sign*=-1;
	    term=sign/d;
	    sum+=term;
	    d++;}
	printf("值:%lf\n",sum);
}

17、求分数序列的和

描述:有一个分数序列 2/1,3/2,5/3,8/5,13/8,······ 求出这个数列的前N项和,结果保留三位小数。

#include<stdio.h>
main()
{
	int i,p,q,r,N;
	double team,sum=0;
	scanf("%d",&N);
	p=2;q=1;
	for(i=1;i<=N;i++){
	    team=p*1.0/q;
	    sum+=team;
	    r=p;p+=q;q=r;}
	printf("%.3lf\n",sum);
	return 0;
}

18、字母转换

要求:输入一个字符,判别它是否为大写字母,如果是,将它转换成小写字母;如果不是,不转换,然后输出最后得到的字符。

#include<stdio.h>
main()
{
	char ch;
	ch=getchar();
	ch=(ch>='A'&&ch<='Z')?(ch+32):ch;
	putchar(ch);
	printf("\n");
	return 0;
}

19、输入一行字符,分别统计出其中英文字母、空格、数字、和其他字符的个数

#include<stdio.h>
#include<string.h>
main()
{
	char a[30];
	int english=0,black=0,num=0,other=0;
	int i,n;
	gets(a);
	n=strlen(a);
	for(i=0;i<n;i++)
		if(a[i]<='z'&&a[i]>='a'||a[i]<='Z'&&a[i]>='A')
		    english++;
		else if(a[i]<='9'&&a[i]>='0')
		    num++;
		else if(a[i]==' ')
		    black++;
		else other++;
	printf("英文字母:%d\n空格:%d\n数字:%d\n其他:%d\n",english,black,num,other);
	return 0;
}

20、将100~200之间的素数输出

素数:只能被1和其本身整除

#include<stdio.h>
main()
{
	int i,j,k;
	for(i=100,k=0;i<=200;i++)
	    for(j=2;j<i;j++){
	        if(i%j==0) break;
	    if(j==i-1){
	        k++;
	        printf("%d",i);
	        if(k%5==0&&k!=0)      //k累计到5的倍数,换行
	            printf("\n");
	        else printf("   ");}
	}
	printf("\n");
	return 0;
}

简化:

#include<stdio.h>
#include<math.h>
main()
{
	int i,j,k,m;
	for(i=101,k=0;i<=200;i+=2){    //省略了判断偶数
	    m=sqrt(i*1.0);      //判断素数可只需取到数的开方
	    for(j=2;j<=m;j++)
	        if(i%j==0) break;
	    if(j>m){           //若j>m,表示i未能被整除
	        k++;
	        printf("%d",i);
	        if(k%5==0&&k!=0)
	        	printf("\n");
	        else printf("   ");}
	}
	return 0;
}

注意:math函数中sqrt():对x取开方,但x必须为小数,否则出错。

21、小球的自由落体运动

描述:一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 结果保留两位小数。

  • 输入:从键盘输入M和N
  • 输出:它在第N次落地时反弹多高?共经过多少米? 保留两位小数,空格隔开,放在一行。
#include<stdio.h>
main()
{
	float M;
	int N,i;
	double high,sum=0;
	scanf("%f %d",&M,&N);
	sum+=M;
	for(i=1;i<N;i++){
	    M/=2;
	    sum+=M*2;}
	high=M/2;
	printf("%.2lf %.2lf\n",high,sum);
	return 0;
}

22、猴子吃桃

**描述:猴子第1天摘下若干个桃子 ,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,有多吃了一个。以后每天早上都吃了其前一天剩下的一半零一个。到第十天早上在想吃时,就只剩下一个桃子了。求第1天共摘多少个桃子。

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

23、求Sn=a+aa+aaa+aaaa+…aaa(n个a)

描述:键盘输入正整数a和n,编程 s=a+aa+aaa+aaaa+aa…a(n个a)的值。

#include<stdio.h>
main()
{
	int a,n,i,k,team,sum=0;
	scanf("%d %d",&a,&n);
	for(i=1,k=10;i<=n;i++,k*=10){
	    team=(k-1)/9*a;
	    sum+=team;}
	printf("Sn=%d\n",sum);
	return 0;
}

24、求 1!+2!+3!+4!+5!+…+n!

#include<stdio.h>
main()
{
	int i,j,n,team,sum=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
	    team=1;
	    for(j=1;j<=i;j++)
	        team*=j;
	    sum+=team;}
	printf("%d\n",sum);
	return 0;
}

25、输出所有的“水仙花数”

描述:“水仙花数”是指一个3位数,其中各位数字的立方和等于其本身。例如:153是一个水仙数,因为153=13+53+33

#include<stdio.h>
main()
{
	int i,a,b,c;
	for(i=100;i<1000;i++){
	    a=i/100;
	    b=i/10%10;
	    c=i%10;
	    if(i==a*a*a+b*b*b+c*c*c)
	        printf("%-5d",i);
	}
	printf("\n");
	return 0;
}

26、完数

描述:一个数如果恰好等于它的因子之和,这个数就成为“完数”。例:6的因子为1,2,3,而6=1+2+3,因此6是完数。找出1000以内的所有完数,并按以下格式输出其因子:
6 its factors are 1,2,3

#include<stdio.h>
main()
{
	int i,j,k,sum;
	int a[10][20],m,n;
	for(i=2;i<=1000;i++){
	    m=n=0;
	    sum=0;
	    for(j=1,k=0;j<i;j++)
	        if(i%j==0){
	            sum+=j;
	            a[m][n++]=j;}
	    if(i==sum){
	        printf("%d its factors are %d",i,a[m][0]);
	        for(k=1;k<=n-1;k++)
	            printf(",%d",a[m][k]);
	        printf("\n");
	        m++;}
	}
	return 0;
}

27、输出图案1

   *
  ***
 *****
  ***
   * 

【个人备注;要使用代码打出这个图案,使用循环,找出规律一行一行来,先是要打出左空格,接着是*,然后再是空格。】

#include<stdio.h>
#include<math.h>
main()
{
	int i,j;
	for(i=1;i<=7;i++){
	    for(j=1;j<=abs(4-i);j++)
	        printf(" ");
	    for(j=1;j<=7-(abs(4-i)*2);j++)
	        printf("*");
	    for(j=1;j<=abs(4-i);j++)
	        printf(" ");
	    printf("\n");
	}
	return 0;
}    

想法:若要使想打印出n行菱形图案,可将代码中数字换成n(输入的数)

------第六章 数组------

28、将一个二维数组行个列的元素互换,存到另一个二维数组中

#include<stdio.h>
main()
{
	int a[10][20],b[10][20];
	int m,n,i,j;
	printf("输入数组的行和列\n");
	scanf("%d %d",&m,&n);
	for(i=0;i<m;i++)
	    for(j=0;j<n;j++)
	        scanf("%d",&a[i][j]);
	for(i=0;i<m;i++)
	    for(j=0;j<n;j++)
	        b[j][i]=a[i][j];
	for(i=0;i<n;i++){
	    for(j=0;j<m;j++)
	        printf("%-5d",b[i][j]);
	    printf("\n");
	}
	return 0;
}

29、矩阵中找值

描述:有一个m*n的矩阵,要求求出其中值最大的那个元素的值,以及其所在的行号和列号。

#include<stdio.h>
main()
{
	int m,n,a[10][20];
	int i,j,x,y;
	scanf("%d %d",&m,&n);
	for(i=0;i<m;i++)
	    for(j=0;j<n;j++)
	        scanf("%d",&a[i][j]);
	x=y=0;
	for(i=0;i<m;i++)
	    for(j=0;j<n;j++)
	        if(a[i][j]>a[x][y]){
	            x=i;y=j;}
	printf("max=%d\nrow=%d\ncolum=%d",a[x][y],x,y);
	return 0;
}

30、矩阵下三角问题

描述:输入一个n*n的二维矩阵(n<10),求矩阵下三角(左下直角三角)元素的和

  • 输入:输入数据只有一组,首先在第一行输入n,接下来输入二维矩阵,即有n行,每行输入n个整数,以空格间隔。
  • 输出:输出矩阵下三角元素之和,占一行。
#include<stdio.h>
main()
{
	int a[10][10];
	int i,j,n,sum=0;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	    for(j=0;j<n;j++)
	        if(j==n-1)              //设置输入格式(也可不设置哈,在输入时,数之间也是需要空格的。)
	            scanf("%d",&a[i][j]);
	        else
	            scanf("%d ",&a[i][j]);
	for(i=0;i<n;i++)
	    for(j=0;j<n;j++)
	        if(i>=j)
	            sum+=a[i][j];
	printf("%d\n",sum);
	return 0;
}

31、矩阵运算1

描述:求一个n*n的整型矩阵对角线之和。

#include<stdio.h>
main()
{
	int n,i,j,a[10][10];
	int sum=0;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	    for(j=0;j<n;j++)
	        scanf("%d",&a[i][j]);
	for(i=0;i<n;i++)
	    for(j=0;j<n;j++)
	        if(i==j||i+j==n-1)
	            sum+=a[i][j];                      
	printf("sum=%d\n",sum);
	return 0;
}        

32、矩阵运算2

描述:对N*N矩阵,以主对角线为对称线,将对称元素相加并将其结果放在下三角元素中,右上角元素置0

  • 输入:第一行数字表示矩阵大小N,接下来的N行为矩阵的各个元素值,各个数值之间用空格隔开。
  • 输出:输出运算后的矩阵,有N行,后一个数值相对于前一个数值向后平移5个单位。
#include<stdio.h>
main()
{
	int a[10][10],N;
	int i,j;
	scanf("%d",&N);
	for(i=0;i<N;i++)
	    for(j=0;j<N;j++)
	        if(j==N-1)
	            scanf("%d",&a[i][j]);
	        else
	            scanf("%d ",&a[i][j]);
	printf("\n");            
	for(i=0;i<N;i++)
	    for(j=0;j<N;j++){
	        if(i>j)
	            a[i][j]+=a[j][i];
	        if(i<j)
	            a[i][j]=0;}
	for(i=0;i<N;i++){
	    for(j=0;j<N;j++)
	        if(j==N-1)
	            printf("%d",a[i][j]);
	        else
	            printf("%-5d",a[i][j]);
	    printf("\n");
	}
	return 0;
}                    

33、统计单词

描述:输入一行数组,统计其中有多少个单词,单词之间用一个空格分隔开。

#include<stdio.h>
#include<string.h>
main()
{
	char string[81];
	int i,num=0,word=0;
	char c;
	gets(string);
	for(i=0;(c=string[i])!='\0';i++)
	    if(c==' ') word=0;
	    else if(word==0){
	        word=1;
	        num++;}
	printf("Tere are %d words in this line.\n",num);
	return 0;
}    

34、有3个字符串,找出其中最大者

#include<stdio.h>
#include<string.h>
main()
{
	char str[3][20],string[20];
	int i;
	for(i=0;i<3;i++)
	    gets(str[i]);
	if(strcmp(str[0],str[1])>0)
	    strcpy(string,str[0]);
	else
	    strcpy(string,str[1]);
	if(strcmp(str[2],string)>0)
	    strcpy(string,str[2]);
	printf("\nthe largest string is:\n%s\n",string);
	return 0;
}         

35、按序插数

描述:输入一个从小到大的数组,要求再输入一个数后,按原来排序的规律将它插入数组中。

  • 输入:第一行输入有序数组,退出输入数组时,输入0,回车;第二行输入插入的数。
  • 输出:打印出新的数组
#include<stdio.h>
main()
{
	int a[20];
	int i,n,num,place;
	for(i=0,n=0;i>=0;i++){
	    scanf("%d",&a[i]);
	    if(a[i]==0) break;
	    n++;}
	scanf("%d",&num);
	for(i=0;i<n;i++)
	    if(a[i]<num)
	        place=i;
	    else break;   
	for(i=n-1;i>place;i--)
	   a[i+1]=a[i];
	a[place+1]=num;
	for(i=0;i<n+1;i++)
	    printf("%-5d",a[i]);
	return 0;
}        

36、倒叙存放

描述:将一个数组的值按逆序重新存放,例,原来顺序为9,7,6,4,1。要求改为1,4,6,7,9。

  • 输入:第一行输入n,即n个数,第二行输入n个数
  • 输出:输出改变后的数组
#include<stdio.h>
main()
{
	int n,a[20];
	int i,j,team;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	    scanf("%d",&a[i]);
	for(i=1;i<n;i++)
	    for(j=0;j<n-i;j++){
	        team=a[j];
	        a[j]=a[j+1];
	        a[j+1]=team;}
	for(i=0;i<n;i++)
	    printf("%-4d",a[i]);
	printf("\n");
	return 0;
}     

37、杨辉三角

**输出以下的杨辉三角形:(输出n行)
在这里插入图片描述

  • 输入:第一行:n,表示有n行杨辉三角
  • 输出:n行的杨辉三角形,数字向后平移8个单位
#include<stdio.h>
main()
{
	int i,j,n;
	int a[30][30];
	scanf("%d",&n);
	for(i=0;i<n;i++)
	    for(j=0;j<=i;j++){
	        if(i==j||j==0) a[i][j]=1;
	        else if(i>=2)
	            a[i][j]=a[i-1][j-1]+a[i-1][j];}
	for(i=0;i<n;i++){
	    for(j=0;j<=i;j++){
	        if(i==j) printf("%d",a[i][j]);
	        else printf("%-8d",a[i][j]);}
	        printf("\n");
	}
	return 0;
}

38、鞍点

描述:找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点

  • 输入:第一行输入二维数组的行m和列n,接下来的m行输入数值
  • 输出:若有鞍点,格式为:鞍点[m][n]:(num);若无鞍点,则输出:没有鞍点。
#include<stdio.h>
main()
{
	int a[10][10],m,n;
	int i,j,k,h;
	int num,ft=0;
	scanf("%d %d",&m,&n);
	for(i=0;i<m;i++)
	    for(j=0;j<n;j++)
	        scanf("%d",&a[i][j]);
	for(i=0;i<m;i++){
	    for(j=0;j<n;j++){
	        num=a[i][j];
	        for(k=0;k<=n-1;k++)    
	            if(num<a[i][k])    //判断在行中是否取得最大
	                break;
	        for(h=0;h<=m-1;h++)
	            if(num>a[h][j])    //判断在列中是否取得最小
	                break;
	        if(h==m&&k==n){
	            printf("鞍点[%d][%d]:%d\n",i,j,num);
	            ft=1;}
	    }
	    if(ft==1) break;           //若是有鞍点了,提早结束循环
	}    
	if(ft=0) printf("没有鞍点\n");
	return 0;            
}          

39、找数值

有n个数从m由大到小顺序存放在一个数组中,输入一个数,要求用折半法找出该数是数组中第即个元素的值。如果该数不在数组中,则输出“无此数”。

  • 输入:第一行两个数m n,分别代表最大数,数组个数,第二行则输入要查找的数值。
  • 输出:格式:“num是数组中第x个元素的值”,若无,则输出“无此数”。
#include<stdio.h>
main()
{
	int a[30],m,n;
	int i,j,d,ft=0,num;
	scanf("%d %d",&m,&n);
	printf("查找的数:");
	scanf("%d",&num);
	for(i=0;i<n;i++){         //对数组赋值
	    a[i]=m;
	    m--;}
	/*for(i=0;i<n;i++)        //可以把数组的数值打出来
	    printf("%d ",a[i]);
	printf("\n");*/
	d=n/2;
	if(num>a[d]){
	    for(i=0;i<d;i++)
	        if(num==a[i]){
	            printf("%d是数组中第%d个元素的值\n",num,i);
	            ft=1;
	            break;}
	}            
	else{
	    for(j=d;j<n;j++)
	        if(num==a[j]){
	            printf("%d是数组中第%d个元素的值\n",num,j);
	            ft=1;
	            break;}
	}            
	if(ft==0)
	    printf("无此数");
	return 0;
}                          

40、输出图案2

输出以下图案
在这里插入图片描述

#include<stdio.h>
main()
{
	int a[20][5],n;
	int i,j,k;
	scanf("%d",&n);
	for(i=0;i<n;i++){
	    for(j=0;j<i;j++)
	        printf(" ");
	    for(k=0;k<4;k++)    
	        printf("* ");    //使得前四个*后都有个空格
	    printf("*");         //使得最后一个(第五个)*后没有空格    
	    printf("\n");
	}
	return 0;
}    

变换:可将每一行“ * ”的个数改变,自定义

41、电文(译成密码)

描述:有一行电文,已按下面规律译成密码:

A->Z    a->z
B->Y    b->y
C->X    c->x
...     ...
..      ..
.       .

即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求编程序将密码译回原文,并输出密码和原文。
格式:

  1. 密码个数:
  2. n(输入)
  3. 密码(输入)
  4. 密码文:
  5. 打印密码文
  6. 原文:
  7. 打印原文

示例:
在这里插入图片描述

#include<stdio.h>
main()
{
	char c[36];
	int i,n,t;
	printf("密码个数:\n");
	scanf("%d\n",&n);        //按要求设置格式
	for(i=0;i<n;i++)
	    scanf("%c",&c[i]);
	c[i]='\0';    
	printf("密码文:\n%s\n",c);
	for(i=0;i<n;i++){
	    if(c[i]<='Z'&&c[i]>='A'){
	        t=c[i]-64;        //查找是第几个字母
	        c[i]=27-t+64;}    //译码
	    else if(c[i]<='z'&&c[i]>='a'){
	        t=c[i]-96;        //同上
	        c[i]=27-t+96;}
	    else
	        continue;
	}
	printf("原文:\n%s\n",c);
	return 0;
}

------第七章 函数------

42、打印(函数)

想输出以下的结果,用函数调用实现

******************(18个*)
  How do you do!    
******************(18个*)
#include<stdio.h>

void print_star();        //声明函数
void print_message();

main()
{
	print_star();        //调用函数
	print_message();
	print_star();
	return 0;
}

void print_star()        //定义函数
{
	printf("******************\n");
}

void print_massage()
{
	printf("  How do you do!\n");
}

43、用函数找到大数

描述:输入两个数,要求输出其中值较大者。要求用函数来找到大数。

#include<stdio.h>

int max(int x,int y)
{
	int z;
	z=x>y? x:y;
	return(z);
}

main()
{
	int a,b;
	scanf("%d %d",&a,&b);
	printf("max=%d\n",max(a,b));
	return 0;
}

44、求和(函数)

输入两个实数,用一个函数求出他们的和

#include<stdio.h>

float add(float x,float y)
{
	return(x+y);       //省略再定义个变量,使其值为x和y的和
}

main()
{
	float a,b,sum;
	printf("Please enter a and b");
	scanf("%f %f",&a,&b);
	sum=add(a,b);
	printf("sum is %f\n",sum);
	return 0;
}

45、函数的嵌套

输入4个整数,找出其中最大的数。用函数嵌套调用来处理

#include<stdio.h>

int max2(int a,int b)
{
	return(a>b? a:b);
}

int max4(int a,int b,int c,int d)
{
	int m;
	m=max2(a,b);
	m=max2(m,c);
	m=max2(m,c);
	return(m);    //可结合为一句return(max2(max2(max(a,b),c),d))
}

main()
{
	int a,b,c,d,max;
	printf("Please enter 4 interage numbers:\n")
	scanf("%d %d %d %d",&a,&b,&c,&d);
	max=max4(a,b,c,d);
	printf("max=%d\n",max);
	return 0;
}

46、用递归法求n!

#include<stdio.h>

int fac(int n)
{
	int f;
	if(n<0)
	    printf("n<0,date error!");
	else if(n==0||n==1)
	    f=1;
	else f=fac(n-1)*n;
	return(f);
}

main()
{
	int n,sum;
	printf("input an integer number:");
	scanf("%d",&n);
	sum=fac(n);
	printf("%d! = %d\n",n,sum);
	return 0;
}

47、求平均成绩

描述:有一个一维数组score,存放10个学生成绩,求平均成绩

#include<stdio.h>

float average(float array[10])
{
	int i;
	float aver,sum=0;
	for(i=0;i<10;i++)
	    sum+=array[i];
	aver=sum/10;
	return(aver);
}

int main()
{
	float score[10],aver;
	int i;
	printf("Input 10 score:\n");
	for(i=0;i<10;i++)
	    scanf("%f",&score[i]);
	aver=average(score);
	printf("average score is:%5.2f\n",aver);
	return 0;
}    

48、有个m*n的矩阵,求所有元素中的最大值(函数)

#include<stdio.h>

int max_value(int array[][10],int m,int n)
{
	int i,j,max;
	max=array[0][0];
	for(i=0;i<m;i++)
	    for(j=0;j<n;j++)
	        if(array[i][j]>max)
	            max=array[i][j];
	return(max);
}

main()
{
	int a[10][10],m,n;
	int max,i,j;
	scanf("%d %d",&m,&n);
	for(i=0;i<m;i++)
	    for(j=0;j<n;j++)
	        scanf("%d",&a[i][j]);
	max=max_value(a,m,n);
	printf("Max is %d\n",max);
	return 0;
}            

49、最小公倍数和最大公约数(函数)

描述:写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。

#include<stdio.h>

int max_value(int a,int b)
{
	int t;
	while(b!=0){
	    t=a%b;
	    a=b;
	    b=t;}
	return(a);
}

int min_value(int a,int b)
{
	int c,d;
	c=max_value(a,b);
	d=a*b;
	return(d/c);
}

int main()
{
	int a,b;
	printf("Input two interage:\n");
	scanf("%d %d",&a,&b);
	if(a>0&&b>0){
	    printf("最大公约数:%d\n",max_value(a,b));
	    printf("最小公倍数:%d\n",min_value(a,b));}
	else
	    printf("Input is error!");    
	return 0;
}

50、方程根(函数)

描述:求方程 ax2+bx+c=0 的根,用三个函数分别求当:b2-4ac 大于0、等于0和小于0时的根并输出结果。从主函数输入 a,b,c 的值。(计算结果可保留两位小数)

#include<stdio.h>
#include<math.f>

void greater(float date,float a,float b)
{
	float x1,x2;
	x1=(-1*b+date)/(2*a);        //可以简化写,这样写容易看懂
	x2=(-1*b-date)/(2*a);
	printf("x1=%.2f\nx2=%.2f\n",x1,x2);
}
void equal(float a,float b)
{
	float x;
	x=-1*b/2/a;
	printf("x1=x2=%.2f\n",x);
}
void less()
{
	printf("此方程无根\n");
}

int main()
{
	float a,b,c,date;
	printf("enter a b c:\n");
	scanf("%f %f %f",&a,&b,&c);
	date=sqrt(b*b-4*a*c);
	if(date>0)
	    greater(date,a,b);
	else if(date==0)
	    equal(a,b);
	else
	    less();
	return 0;
}  

51、判断素数(函数)

描述:写一个判断素数的函数,在主函数输入有个整数,输出是否为素数的信息。

#include<stdio.h>
#include<math.h>

int ft=0;

int ft_value(int a)
{
	int i,m;
	if(a%2==0)
	    ft=1;    
	m=sqrt(a*1.0);
	for(i=3;i<=m;i+=2)
	    if(a%i==0){
	        ft=1;
	        break;}
	return(ft);
}
int main()
{
	int num;
	printf("Input one:\n");
	scanf("%d",&num);
	if(ft_value(num))
	    printf("%d是素数\n",num);
	else
	    printf("%d不是素数\n",num);
	return 0;
}           

52、字符串反序(函数)

描述:写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。

  • 输入:一行,字符串
  • 输出:一行,改变后的字符串
#include<stdio.h>
#include<string.h>
 
void value(char s1[30],char s2[30])
{
	int i,j,n;
	n=strlen(s1);
	for(i=0,j=n-1;i<n;i++)
	    s2[i]=s1[j--];
	s2[n]='\0';
}

int main()
{
	char a[30],b[30];
	gets(a);
	value(a,b);
	puts(b);
	return 0;
}

53、格式输出

描述:写一个函数,输入一个整数,要求输出这个数字字符,但每两个数字之间空一个空格,如输入1993,应输出“1 9 9 3”。

#include<stdio.h>

void formate(int a)
{
	int i,n,b[16];
	for(i=0,n=0;a!=0;i++){
	    b[i]=a%10;
	    a/=10;
	    n++;}
	for(i=n-1;i>=1;i--)
	    printf("%d ",b[i]);
	printf("%d\n",b[0]);
}

int main()
{
	int a;
	printf("enter one interage:\n");
	scanf("%d",&a);
	formate(a);
	return 0;
}

54、最长单词输出

描述:写一个函数,输入一行字符,将此字符中最长的单词输出

#include<stdio.h>
#include<string.h>

void output(char c[50])
{
	int i,n,count=0,p,len=0;
	n=strlen(c);
	for(i=0;i<=n;i++)
	    if(c[i]<='z'&&c[i]>='a'||c[i]<='Z'&&c[i]>='A')
	    count++;
	    else if(c[i]==' '||c[i]=='\0'){
	        if(len<count){
	            len=count;
	            p=i;}
	        count=0;}
	for(i=p-len;i<p;i++)
	    printf("%c",c[i]);
	printf("\n");    
}

int main()
{
	char s[50];
	gets(s);
	output(s);
	return 0;
}

55、n阶勒让德多项式

描述:用递归方法求n阶勒让德多项式的值,递归公式为:
在这里插入图片描述

#include<stdio.h>

double express(int x,int n)
{
	if(n==0)
	    return(1);
	else if(n==1)
	    return(x);
	else if(n>1)
	    return(((2*n-1)*x-express(x,n-1)-(n-1)*express(x,n-2))/n);
}

int main()
{
	int n;
	float x;
	printf("Input x and n:\n");
	scanf("%f %d",&x,&n);
	printf("sum=%.3lf\n",express(x,n));
	return 0;
}

说明:代码是按照题目来编的,但又搜了下勒让多项式值跟这个算出来的有出入,代码没有问题的,,,,,

56、整数转字符串

描述:用递归法将一个整数n转换成字符串。例如,输出483,应输出字符串“483”。n的位数不确定,可以是任意位数的整数

#include<stdio.h>
void convert(int n)
{
    int t;
    if((t=n/10)!=0)
        convert(t);
    putchar(n%10+'0');
}
int main()
{
    int num;
    scanf("%d",&num);
    if(num<0){
        printf("-");
        num*=-1;
    }
    printf("String:");
    convert(num);
    printf("\n");
    return 0;
}            

57、给出年、月、日,计算该日是该年的第几天

#include<stdio.h>

int days=0;

void add_month(int m)
{
    switch(m){
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:days+=31;break;
        case 4:
        case 6:
        case 9:
        case 11:days+=30;break;
    }
    if((m-=1)>=3)
        add_month(m);
}
void add_year(int y,int m)
{
    if(m>=2){
        if(y%400==0||y%4==0&&y%100!=0)
            days+=29;
        else
            days+=28;
    }
}

int main()
{
    int year,month,day;
    printf("输入日期(格式,例:2020/6/13):\n");
    scanf("%d/%d/%d/",&year,&month,&day);
    days+=day;
    add_month(month);
    add_year(year,month);
    printf("The %d day\n",days);
    return 0;
}    

------第八章 指针------

58、输入a,b两个整数,按先大后小的顺序输出a和n。(指针)

#include<stdio.h>
main()
{
    int *p1,*p2,*p,a,b;
    p1=&a;p2=&b;
    scanf("%d %d",p1,p2);
    if(a<b){
        p=p1;
        p1=p2;
        p2=p;}         //交换p1与p2的指向位置
    printf("a=%d  b=%d\n",a,b);
    printf("max=%d min=%d\n",*p1,*p2);
    return 0;
}    

59、指针变量作为函数参数实现两变量交换值

#include<stdio.h>
void swap(int *p1,int *p2)
{
    int t;
    t=*p1;
    *p1=*p2;
    *p2=t;
}
int main()
{
    int a,b,*p1=&a,*p2=&b;
    scanf("%d %d",p1,p2);
    swap(p1,p2);
    printf("->\n%d %d\n",a,b);
    return 0;
}        

60、通过指针变量输出整数组a的10个元素

#include<stdio.h>
int main()
{
    int *p,a[10];
    int i;
    p=a;                //p指向a[0]
    printf("input 10 integer:\n");
    for(i=0;i<10;i++)
        scanf("%d",p++);
    for(p=a;p<(a+10);p++)
        printf("%d ",*p);
    return 0;
}

61、将数组a中n个整数按相反顺序存放

#include<stdio.h>
int main()
{
    void change(int *a,int n);
    void input(int *,int);
    void output(int *a,int);
    int a[30],n;
    scanf("%d",&n);
    input(a,n);
    change(a,n);
    output(a,n);
    return 0;
}
void input(int *a,int n)              //输入数值函数
{
    int i;
    printf("The original array:\n");
    for(i=0;i<n;i++)
        scanf("%d",a++);
}
void output(int *a,int n)                 //输出数值函数
{
    int *p;
    for(p=a;p<a+n;p++)
        printf("%d ",*p);
}
void change(int *a,int n)               //形参a是指针变量
{
    int m,temp;
    int *i,*j;
    m=(n-1)/2;
    i=a;                //指向数组a的第一个数
    j=a+n-1;           //指向a数组最后一个数
    for(;i<=(a+m);i++,j--){
        temp=*i;
        *i=*j;
        *j=temp;}             //*i与*j交换
}

62、用指针方法对n个整数按由大到小顺序排序

#include<stdio.h>
int main()
{
    void sort(int x[],int n);
    int a[10],n;
    int i;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    sort(a,n);
    for(i=0;i<n;i++)
        printf("%d ",a[i]);
}
void sort(int x[],int n)
{
    int i,j,k,t;
    for(i=0;i<n-1;i++){
        k=i;
        for(j=i;j<n;j++)
            if(*(x+j)>*(x+k)) k=j;
        if(k!=i){
            t=*(x+i);
            *(x+i)=*(x+k);
            *(x+k)=t;}
    }
}

63、通过字符指针变量输出一个字符串

#include<stdio.h>
main()
{  
    char *string="I love China";                //定义字符串指针变量string并初始化
    printf("%s\n",string);                    //输出字符串
    return 0;
}

说明:C语言中只有字符变量,没有字符串变量;可用字符指针变量指向一个字符串变量

64、将字符串a复制为字符串b,然后输出字符串b

#include<stdio.h>
main()
{
    char a[]="I am a student",b[20];
    int i;
    for(i=0;*(a+i)!='\0';i++)
        *(b+i)=*(a+i);
    *(b+i)='\0';
    printf("%s\n",b);
    return 0;
}

65、移数

描述:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面个数,见下图。写一个函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数。
#在这里插入图片描述

#include<stdio.h>

void change(int n,int m,int p[])
{
    int i,j;
    int a[30],b[30];
    for(i=0;i<m;i++)
        a[i]=p[i];
    for(j=m,i=0;j<n;j++)
        b[i++]=p[j];
    for(i=0;i<n-m;i++)
        *(p+i)=b[i];
    for(j=0;j<m;j++,i++)
        *(p+i)=a[j];       
}
int main()
{
    int a[30],n,m,i;
    printf("整数个数:");
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",a+i);
    printf("移数:");
    scanf("%d",&m);
    change(n,m,a);
    for(i=0;i<n;i++)
        printf("%d ",*(a+i));
    printf("\n");
}

说明:这个要求只是将分开的两个片段重新结合,并没有实现移动的效果,下面这个代码实现把数值平移

#include<stdio.h>

void change(int n,int m,int p[])
{
    int i,j;
    int b[30];
    int *p1=p+n-1;
    for(i=0;i<m;i++)
        b[i]=*p1--;
    for(j=0;j<n-m;j++)
        b[i++]=p[j];
    for(i=0;i<n;i++)
        *(p+i)=*(b+i);       
}
int main()
{
    int a[30],n,m,i;
    printf("整数个数:");
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",a+i);
    printf("移动个数:");
    scanf("%d",&m);
    change(n,m,a);
    for(i=0;i<n;i++)
        printf("%d ",*(a+i));
    printf("\n");
}

66、报数

描述:有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。

  • 输入:初始人数n
  • 输出:最后一个人的初始编号
#include<stdio.h>
int main()
{
    int a[50],n,*p;
    int i,k,m;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        a[i]=i+1;                //对成员编号
    k=m=0;
    while(m<n-1){                //m为退出人数,即当退出(n-1)个人时,退出循环
        for(i=0;i<n;i++){
            if(*(a+i)!=0) k++;
            if(k==3){
                *(a+i)=0;
                k=0;
                m++;
            }
        }
    }
    for(p=a;p<(a+n);p++)
        if(*p!=0){
            printf("%d\n",*p);
            break;}
    return 0;
}

魔方阵

描述:输出“魔方阵,魔方阵:它的每一行、每一列和对角线之和均相等。例如三阶魔方阵和四阶魔方阵:
三阶和四阶魔方阵
求输出1~n2的自然数构成的魔方阵

#include<stdio.h>

void print(int a[][30],int n)    //打印矩阵函数
{
    int i,j;
    for(i=0;i<n;i++){
        for(j=0;j<n;j++)
            if(j==n-1)
                printf("%d",a[i][j]);
            else
                printf("%-4d",a[i][j]);
        printf("\n");
    }
}
void swap(int *x,int *y)    //x和y交换
{
    int t;
    t=*x; *x=*y; *y=t;
}
void one(int n)         //n为奇数(简捷连续填数法)
{
    int num,row,col;          //row:第一维(行);col:第二维(列)
    int a[30][30];
    for(row=0;row<n;row++)    
        for(col=0;col<n;col++)
            a[row][col]=0;    //初始化,数组中所有元素均置0
    num=1;row=0;col=n/2;
    a[row][col]=num;
    while(num<=n*n){
        num++;
        if(row==0&&col==n-1)    //达到右上角位置
            row++;
        else{
            row--; col++;
            if(row<0) row=n-1;
            if(col==n) col=0;
            if(a[row][col]!=0){
                row+=2;
                col--;}
            }
        a[row][col]=num;
    }
    print(a,n);
}
void two(int n)        //n为双偶数(双向反转方法)
{
    int row,col,k;
    int num,a[30][30];
    num=1; k=n/4;
    for(row=0;row<n;row++)
        for(col=0;col<n;col++)
            a[row][col]=num++;
    for(row=k;row<=k*3-1;row++)
        for(col=0;col<n/2;col++)
            swap(&a[row][col],&a[row][n-1-col]);
  for(col=k;col<=k*3-1;col++)
        for(row=0;row<n/2;row++)
            swap(&a[row][col],&a[n-1-row][col]);
  print(a,n);
}
void three(int n)        //n为单偶数(井字调整法)
{
    int row,col,k;
    int a[30][30],num=1;
    for(row=0;row<n;row++)
        for(col=0;col<n;col++)
            a[row][col]=num++;
    k=(n-2)/4;
    for(row=0;row<=k-1;row++)
        for(col=k+1;col<=3*k;col++){
            swap(&a[row][col],&a[n-1-row][n-1-col]);
            swap(&a[col][row],&a[n-1-col][n-1-row]);
        }
    for(col=0;col<=k-1;col++){
        swap(&a[k][col],&a[k][n-1-col]);    //井字分割线第k+1
        swap(&a[3*k+1][col],&a[3*k+1][n-1-col]);    //井字分割线3k+2
        swap(&a[k+1][col],&a[k+1][n-1-col]);    //第k+2行
    }
    for(col=k+1;col<=3*k;col++)
        swap(&a[k][col],&a[3*k+1][col]);
    for(row=0;row<n/2;row++)
        if(row!=k)
            swap(&a[row][k],&a[n-1-row][k]);
    swap(&a[k][0],&a[3*k+1][0]);
    for(col=k+1;col<n/2;col++)
        swap(&a[k][col],&a[k][n-1-col]);        
    for(col=k+1;row<=3*k;row++)
        if(row!=2*k)
            swap(&a[row][k],&a[row][3*k+1]);
    print(a,n);
}
        
int main()
{
    int n;
    printf("Input n:\n");
    scanf("%d",&n);
   if(n%2!=0)
        one(n);
    else if(n%4==0)
        two(n);
    else if((n-2)%4==0)
        three(n);
    return 0;
}            
  • 96
    点赞
  • 535
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值