C语言总结

相信各位刚刚学习计算机的同学都有一种被C语言支配的感觉,而C语言也是大部分程序员学习编程的第一门课程,作为其他语言的基础,可见C语言的重要。

从大一开学到现在 ,大家关于C语言的学习也有一段时间了,本人略有心得,其中有关C语言的一些案例、作业、课后习题借这个平台写出来与大家分享一下(教材为谭浩强老师的C程序设计第五版),如有错误,望大家及时指正。

第1章 程序设计和C语言

例1:在屏幕上输出一行信息“Hello Wrold.
例2:将a,b两个数相加并输出其和sum
例3:比较两个数的大小,输出最大值

例1:在屏幕上输出一行信息“Hello Wrold.”

#include<stdio.h>                       //这是编译预处理指
int main()                              //定义函数
{                                       //函数开始的标志
    printf("Hellow World.\n");          //输出所指定的一行信息
	return 0;		                    //函数执行完毕时返回函数值
}                                       //函数结束的标志

运行结果:
在这里插入图片描述

例2:将a,b两个数相加并输出其和sum

#include<stdio.h>
int main()
{
    int a,b,sum;
    a=123;	
    b=456;
    sum=a+b;
    printf("sum is %d\n",sum);
    return 0;
}

运行结果:
在这里插入图片描述

例3:比较两个数的大小,输出最大值

#include <stdio.h>
int main()
{
	int max,a,b;
	printf("请输入两个数:");
	scanf("%d%d",&a,&b);
	max=a>b?a:b;
	printf("最大值为:%d\n",max);
	return 0;
}

运行结果:
在这里插入图片描述
好了,有关程序的简单例题就给大家分享到这里,接下来就该给大家说一下算法了。

第2章 算法——程序的灵魂

例1:计算5!
例2:求多项式(1-1/2+1/3-1/4+…+1/99-1/100)的值

例1:计算5!

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

运行结果:
在这里插入图片描述

例2:求多项式(1-1/2+1/3-1/4+…+1/99-1/100)的值

#include <stdio.h>
int main()
{
	int sign=1;
	double deno=2.0,sum=1.0,term;
	while(deno<=100)
	{
		sign=-sign;
		term=sign/deno;
		sum=sum+term;
		deno=deno+1;
	}
	printf("%f\n",sum);
	return 0;
}

运行结果:
在这里插入图片描述

第3章 最简单的C程序设计——顺序程序结构

关于算法与结构的重要性,著名的计算机科学家Nikiklaus Wirth提出的一个公式非常好

程序=算法+数据结构

这个公式对于过程化程序来说依然适用。
其中算法可以用流程图来表示,编辑程序前先用流程图把算法表述清,就会感觉这个程序十分清楚明了,思路清晰。

而关于编写C语言程序,我们必须具备以下的知识和能力:

  1. 有正确的解题思路
  2. 掌握语法
  3. 用结构化程序设计方案

例1:将华氏温度转换为摄氏温度和绝对温度
例2:计算存款利息
例3:输入3个双精度实数,分别求出它们的和、平均值、平方和以及平方和的开方,并输出各个值。
例4:输入一个3位整数,求出该数每个位上的数字之和
例5:给出三角形的三边长,求三角形面积
例6:用%f输出实数,只能得到6位小数
例7:float型数据的有效位数
例8:先后输出BOY三个字符
例9:从键盘输入一个大写字母,在显示器上显示对应的小写字母

例1:将华氏温度转换为摄氏温度和绝对温度的公式分别为:
c= 5/9(f-32) (摄氏温度)
k=273.16+c(绝对温度)
当给出f时,求其相应摄氏温度和绝对温度。
测试数据:① f=34
② f=100

流程图:
在这里插入图片描述
程序:

#include <stdio.h>
int main()
{
	double f,c,k;
    printf("请输入华氏温度:");
    scanf("%lf",&f);
    printf("摄氏温度为:%lf\n",c=5/9*(f-32));
    printf("绝对温度为:%lf\n",k=273.16+c);
    return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述
这就是一个有关流程图的简单案例,希望大家做有关算法的题之前先画画流程图,对做题是非常有帮助的。

例2:计算存款利息
一年活期,年利率为0.36%
一年定期,年利率为2.25%
半年定期,年利率为1.98%

#include <stdio.h>
int main()
{
	float p0=1000,r1=0.0036,r2=0.0225,r3=0.0198,p1,p2,p3;
	p1=p0*(1+r1);
	p2=p0*(1+r2);
	p3=p0*(1+r3/2)*(1+r3/2);
	printf("p1=%f\np2=%f\np3=%f\n",p1,p2,p3);
	return 0;
}

运行结果:
在这里插入图片描述

例3:输入3个双精度实数,分别求出它们的和、平均值、平方和以及平方和的开方,并输出所求出各个值。

#include <stdio.h>
#include <math.h>                                                          //程序中用到数学函数pow,sqrt,应包含头文件math.h
int main()           
{
    double a,b,c;
    printf("请输入三个双精度实数:");
    scanf("%lf%lf%lf",&a,&b,&c);
    printf("三个数和为:%lf\n",a+b+c);
    printf("三个数平均值为:%lf\n",(a+b+c)/3);
    printf("三个数平方和为:%lf\n",pow(a,2)+pow(b,2)+pow(c,2));             //pow(a,n)表示a的n次方
    printf("三个数平方和的开方为:%lf\n",sqrt(pow(a,2)+pow(b,2)+pow(c,2))); //sqrt(a)表示a开方
    return 0;
}


例4:输入一个3位整数,求出该数每个位上的数字之和。如123,每个位上的数字和就是1+2+3=6。
解题思路:
在这里插入图片描述
程序:

#include <stdio.h>
int main()
{
  	int x,a,b,c;
    printf("请输入一个三位数:");
    scanf("%d",&x);
    a=x/100;
    b=x/10%10;
    c=x%10;
    printf("该数每个位上的数字之和为:%d\n",a+b+c);
    return 0;
}

运行结果:
在这里插入图片描述

例5:给出三角形的三边长,求三角形面积

#include <stdio.h>
#include <math.h>
int main()
{
	double a,b,c,s,area;
	a=3.67;
	b=5.43;
	c=5.21;
	s=(a+b+c)/2;
	area=sqrt(s*(s-a)*(s-b)*(s-c));
	printf("a=%f\tb=%f\t%f\n",a,b,c);
	printf("area=%f\n",area);
	return 0;
}

运行结果:
在这里插入图片描述

例6:用%f输出实数,只能得到6位小数

#include <stdio.h>
int main()
{
	double a=1.0;
	printf("%f\n",a/3);
	return 0;
}

运行结果:
在这里插入图片描述

例7:float型数据的有效位数

#include <stdio.h>
int main()
{
	float a;
	a=10000/3.0;
	printf("%f\n",a);
	return 0;
}

运行结果:
在这里插入图片描述

例8:先后输出BOY三个字符

#include <stdio.h>
int main()
{
	char a='B',b='O',c='Y';
	putchar(a);
	putchar(b);
	putchar(c);
	putchar('\n');
	return 0;
}

运行结果:
在这里插入图片描述

例9:从键盘输入一个大写字母,在显示器上显示对应的小写字母

#include <stdio.h>
int main()
{
	char c1,c2;
	c1=getchar();
	c2=c1+32;
	putchar(c2);
	putchar('\n');
	return 0;
}

运行结果:
在这里插入图片描述

这些例题就向大家展示了算法与程序相结合的魅力,而接下来要看的就是另一种结构的应用了。

第4章 选择结构程序设计

例1:输入一个字符,判断它如果是小写字母输出其对应大写字母;如果是大写字母输出其对应小写字母;如果是数字输出数字本身;如果是空格,输出“space”;如果不是上述情况,输出“other”。
例2:有三个数a、b、c,由键盘输入,要求按由小到大的顺序输出
例3:输入一个数,判断它能否被3或者被5整除, 如至少能被这两个数中的一个整除则将此数打印出来,否则不打印,编出程序。
例4:输入1到7之间的某个数,输出表示一星期中相应的某一天的单词:Monday、 Tuesday等等
例5:给出一百分制成绩,要求输出成绩等级‘A’,‘B’,‘C’,‘D’,‘E’,90分以上为‘A’,80~89分为‘B’,70~79分为‘C’,60~69分为‘D’,60分以下为‘E’
例6:输入一个字符,判别它是否为大写字母,如果是,将它转换成小写字母,如果不是,不转换。然后输出最后得到的字符
例7:运输公司对用户计算运输费用。路程越远,运费越低
例8:求ax^2++bx+c=0方程的解
例9:用switch语句处理菜单命令

例1:输入一个字符,判断它如果是小写字母输出其对应大写字母;如果是大写字母输出其对应小写字母;如果是数字输出数字本身;如果是空格,输出“space”;如果不是上述情况,输出“other”。

#include <stdio.h>
int main()
{
	char word;                           
	scanf("%c",&word);
	if(word>=65&&word<97)				//判断如果所输入的字符所对应的ASCII值在65-97之间,输出其小写字母
	{
		printf("小写为:%c\n",word+32);
	}
	else if(word>=97&&word<123)			//判断如果所输入的字符所对应的ASCII值在97-122之间,输出其大写字母
	{
		printf("大写为:%c\n",word-32);
	}
	else if(word==32)					//判断如果所输入的字符所对应的ASCII值等于32,输出space
	{
		printf("space\n");
	}
	else								//判断如果所输入的字符所对应的ASCII值不满足上述条件,输出other
	{
		printf("other\n");
	}
	return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

例2:有三个数a、b、c,由键盘输入,要求按由小到大的顺序输出

#include <stdio.h>
int main()
{
	float a,b,c,t;
	printf("请输入三个数:");
	scanf("%f,%f,%f",&a,&b,&c);
	if(a>b)								//借助变量t实现变量a和变量b互换值
	{
		t=a;
		a=b;
		b=t;
	}									//互换后,a小于或等于b
	if(a>c)								//借助变量t实现变量a和变量c互换值
	{
		t=a;
		a=c;
		c=t;
	}									//互换后,a小于或等于c
	if(b>c)								//借助变量t实现变量b和变量c互换值
	{
		t=b;
		b=c;
		c=t;
	}									//互换后,b小于或等于c
	printf("%5.2f,%5.2f,%5.2f",a,b,c);	//顺序输出a,b,c的值
	return 0;
}

运行结果:
在这里插入图片描述

例3:输入一个数,判断它能否被3或者被5整除, 如至少能被这两个数中的一个整除则将此数打印出来,否则不打印,编出程序。

#include <stdio.h>
int main()
{
	int a;
	printf("请输入:");
	scanf("%d",&a);
	if(a%3==0||a%5==0)					//判断当a取余3或a取余5成立时输出a的值
	{
		printf("%d\n",a);
	}
	return 0;
}	

运行结果:
在这里插入图片描述
在这里插入图片描述

例4:输入1到7之间的某个数,输出表示一星期中相应的某一天的单词:Monday、 Tuesday等等

#include <stdio.h>
int main()
{
    int n;
    printf("Please input an integer(1--7): ");
    scanf("%d",&n);
    printf("Today is ");
    switch(n)								//用switch进行选择,当n=1时,对应输出Monday...
    {  
    	case 1: printf("Monday.\n");break;
    	case 2: printf("Tuesday.\n");break;
    	case 3: printf("Wednesday.\n");break;
    	case 4: printf("Thursday.\n");break;
    	case 5: printf("Friday.\n");break;
    	case 6: printf("Saturday.\n");break; 
    	case 7: printf("Sunday.\n");break;
    	default :  printf("输入错误。\n");
    }
    return 0;
} 

运行结果:
在这里插入图片描述

例5:给出一百分制成绩,要求输出成绩等级‘A’,‘B’,‘C’,‘D’,‘E’,90分以上为‘A’,80~89分为‘B’,70~79分为‘C’,60~69分为‘D’,60分以下为‘E’

#include <stdio.h>
int main()
{
 	int score,rank;
    printf("Please input your score: ");
    scanf("%d",&score);
    rank=score/10;
    printf("Your score is ");
    switch(rank)
    {  
    	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; 
    	default:printf("E.\n"); 
    }
    return 0;
}

运行结果:
在这里插入图片描述

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

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

运行结果:
在这里插入图片描述
在这里插入图片描述

例7:运输公司对用户计算运输费用。路程越远,运费越低。标准如下:
           s<250         没有折扣
 250<=s<=500      %2折扣
 500<=s<=100      %5折扣
1000<=s<=2000   %8折扣
2000<=s<3000     %10折扣
3000<=s               %15折扣

#include <stdio.h>	
int main()
{
   int c,s;	
   float p,w,d,f;
   printf("please enter price,weight,discount:");	//提示输入的数据
   scanf("%f,%f,%d",&p,&w,&s);						//输入单价、重量、距离
   if(s>=3000)c=12;								//3000km以上为同一折扣
   else       c=s/250;								//3000km一下各段折扣不同,c的值不相同
   switch(c)
   {
   	case 0:d=0;break;
   	case 1:d=2;break;
   	case 2:
   	case 3:d=5;break;
   	case 4:
   	case 5:
   	case 6:
   	case 7:d=8;break;
   	case 8:
   	case 9:
   	case 10:
   	case 11:d=10;break;
   	case 12:d=15;break;
   }
   f=p*w*s*(1-d/100);
   printf("freight=%10.2f\n",f);
   return 0;
}

运行结果:
在这里插入图片描述

例8:求ax^2++bx+c=0方程的解

#include <stdio.h>
#include <math.h>
int main()
{
	double a,b,c,disc,x1,x2,realpart,imagpart;
	scanf("%lf,%lf,%lf",&a,&b,&c);
	printf("The equation");
	if(fabs(a)<=1e-6)
		printf("is not a quadratic\n");
	else
	{
		disc=b*b-4*a*c;
		if(fabs(disc)<=1e-6)
			printf("has two equal roots:%8.4f\n",-b/(2*a));
		else
			if(disc>1e-6)
			{
				x1=(-b+sqrt(disc))/(2*a);
				x2=(-b-sqrt(disc))/(2*a);
				printf("has distinct real roots:%8.4fand%8.4f\n",x1,x2);
			}
		else
		{
			realpart=-b/(2*a);							//realpart是复根的实部
			imagpart=sqrt(-disc)/(2*a);					//imagpart是复根的虚部
			printf("has complex roots:\n");
			printf("%8.4f+%8.4fi\n",realpart,imagpart);	//输出一个复数
			printf("%8.4f-%8.4fi\n",realpart,imagpart);	//输出另一个复数
		}
	
	}
	return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

例9:用switch语句处理菜单命令

#include<stdio.h>
int main()
{
	void action1(int,int),action2(int,int);
	char ch;
	int a=15,b=23;
	ch=getchar();
	switch(ch)
		{
			case 'a':
			case'A':action1(a,b);break;
			case'b':
			case'B':action2(a,b);break;
			default:putchar('\a'); 
		}
	return 0;
} 
void action1(int x,int y)
{
	printf("x+y=%d\n",x+y);
}
void action2(int x,int y)
{
	printf("x*y=%d\n",x*y);
}

运行结果:
在这里插入图片描述
在这里插入图片描述
这些例题就是有关于选择性结构的应用,其中包含的语句有if else;switch case,而在选择性结构中关系运算符和逻辑运算符极为重要
关系运算符:

< (小于)
<=(小于或等于)
>(大于)
>=(大于或等于)
这些运算符优先级相同
== (等于)
!=(不等于)
这些运算符优先级相同(但小于上方运算符优先级)

逻辑运算符:
在这里插入图片描述

第5章 循环结构程序设计

例1:计算2+4+6+8+…+98+100
例2:在全系1000名学生中矩形慈善募捐,当总数达到10万元时就结束,统计此时捐款的人数以及平均每人捐款的数目
例3:一球从100米高度自由落下,每次落地后反跳回原来高度的一半,再落下,求它在第十次落地时,共经过多少米?第十次反弹多高?
例4:打印出以下图形
例5:要求输出100~200的不能被3整除的数
例6:输出以下4*5矩阵
例7:用公式求π的近似值知道发现某一项的绝对值小于10的-6次方为止
例8:求Fibonacci(斐波那契)数列的前40个数
例9:输入一个大于3的整数n,判定它是否为素数。
例10:求100~200的全部素数
例11:译密码


例1:计算2+4+6+8+…+98+100

#include <stdio.h>
int main()
{
    int i,s=0;
    for(i=2;i<=100;i+=2)                 //用for循环,循环2-100,每次循环i的值自加2
    {
    	s+=i;                            //用s来求总和
    }
    printf("%d\n",s);
    return 0;
}

运行结果:
在这里插入图片描述

例2:在全系1000名学生中矩形慈善募捐,当总数达到10万元时就结束,统计此时捐款的人数以及平均每人捐款的数目

#include <stdio.h>
#define SUM 100000	
int main()
{
	float amount,aver,total;
	int i;
	for(i=1,total=0;i<=1000;i++)
	{
		printf("please enter amount:");
		scanf("%f",&amount);
		total=total+amount;
		if(total>=SUM)break;
	}
	aver=total/i;
	printf("num=%d\naver=%10.2f\n",i,aver);
	return 0;
}

运行结果:
在这里插入图片描述

例3:一球从100米高度自由落下,每次落地后反跳回原来高度的一半,再落下,求它在第十次落地时,共经过多少米?第十次反弹多高?

#include <stdio.h>
int main()
{ 
	float Sn=100.0,hn=Sn/2;					//定义两个变量Sn,hn并赋初值为Sn=100.0,hn=Sn/2
	int n;									//定义一个变量n
	for(n=2;n<=10;n++)						//给n赋初值为2,当n满足n<=10时
	{										
		Sn=Sn+hn*2;							//Sn=Sn+hn*2
		hn=hn/2;							//hn=hn/2,n自加
	}										//循环结束
	printf("第10次落地时共经过%f米\n",Sn);	//输出
	printf("第10次反弹%f米\n",hn);
	return 0;
}

运行结果:
在这里插入图片描述

例4:打印出以下图形
在这里插入图片描述
流程图:

在这里插入图片描述

#include <stdio.h>
int main()
{
    int i,j,k;							//定义变量i,j,k
    for(i=0;i<=3;i++)					//给i赋初值为0,i满足条件表达式i<=3时,循环开始,不满足时,不执行循环	
    {									//循环体开始
        for (j=0;j<=2-i;j++)			//给j赋初值为0,j满足条件表达式j<=2-i时,内循环1开始
        {
        	printf(" ");				//输出一个空格后j的值加1
        }								
        for (k=0;k<=2*i;k++)			//给k赋初值为0,k满足条件表达式k<=2*i时,内循环2开始
        {
        	printf("*");				//输出一个*后k的值加1
        }
        printf("\n");						//两个内循环1、2执行完后换行,i的值加1,再循环
    }									//循环结束
    for(i=0;i<=2;i++)					//给i赋初值为0,i满足条件表达式i<=2时,循环开始,不满足时,不执行循环
    {									//循环体开始
        	for (j=0;j<=i;j++)				//给j赋初值为0,j满足条件表达式j<i时,内循环1开始
    		{
        		printf(" ");				//输出一个空格后j的值加1
        	}
        	for (k=0;k<=4-2*i;k++)			//给k赋初值为0,k满足条件表达式k<=-2*i时,内循环2开始
        	{
        		printf("*");				//输出一个*后k的值加1
        	}
     		printf("\n");						//两个内循环1、2执行完后换行,i的值加1,再循环
     }									//循环结束
        	return 0;       	
}

运行结果:
在这里插入图片描述

例5:要求输出100~200的不能被3整除的数

#include<stdio.h>
int main()
{
	int n;
	for(n=100;n<=200;n++)
	{
		if(n%3==0)
			continue;
		printf("%d ",n);
	}
	printf("\n");
	return 0;
} 

运行结果:
在这里插入图片描述

例6:输出以下4*5矩阵

#include<stdio.h>
int main()
{
	int i,j,n=0;
	for(i=1;i<=4;i++)
		for(j=1;j<=5;j++,n++)
		{
			if(n%5==0) printf("\n");
			printf("%d\t",i*j);
		}
	printf("\n");
	return 0;
} 

运行结果:
在这里插入图片描述

例7:用公式求π的近似值知道发现某一项的绝对值小于10的-6次方为止

#include<stdio.h>
#include<math.h>
int main()
{
	int sign=1;
	double pi=0.0,n=1.0,term=1.0;
	while(fabs(term)>=1e-6)
		{
			pi=pi+term;
			n=n+2;
			sign=-sign;
			term=sign/n;
		}
	pi=pi*4;
	printf("pi=%10.8f\n",pi);
	return 0;
 } 

运行结果:
在这里插入图片描述

例8:求Fibonacci(斐波那契)数列的前40个数

#include<stdio.h>
int main()
{
	int f1=1,f2=1;
	int i;
	for(i=1;i<=20;i++)
	{
		printf("%12d %12d",f1,f2);
		if(i%2==0) printf("\n");
		f1=f1+f2;
		f2=f2+f1;
	}
	return 0;
} 

运行结果:
在这里插入图片描述

例9:输入一个大于3的整数n,判定它是否为素数。

#include<stdio.h>
int main()
{
	int i,n;                             
	printf("please enter a integer number,n=?");
	scanf("%d",&n);                    
	for(i=2;i<n;i++)                    
	if(n%i==0) break;	
	if(i<n) printf("%d is not a prime number.\n",n);       
	else printf("%d is a prime number.\n",n);            
	return 0;
} 

运行结果:
在这里插入图片描述

例10:求100~200的全部素数

#include<stdio.h>
#include<math.h>
int main()
{
	int n,k,i,m=0;
	for(n=101;n<=200;n=n+2)
 		{k=sqrt(n);
 		for(i=2;i<=k;i++)
 			if(n%i==0) break;
 		if(i>=k+1)
 			{printf("%d ",n);
 			m=m+1;
			}
		if(m%10==0) printf("\n");
		}
	printf("\n");
	return 0;
} 

运行结果:
在这里插入图片描述

例11:译密码

#include <stdio.h>
int main()
{
	char c;
	c=getchar();
	while(c!='\n')
	{
		if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
		{
			if((c>='W'&&c<='Z')||(c>='w'&&c<='z'))c=c-22;
			else c=c+4;	
		}
		printf("%c",c);
		c=getchar();
	}
	printf("\n");
	return 0;
}

运行结果:
在这里插入图片描述
有关循环结构的程序设计就先告一段落了,其实循环包含的语句也就是for;while;do…while,而改变循环执行状态的语句是break;continue。里面最难理解的一部分就是关于循环的嵌套,还是那句话,编写之前先画画流程图,会让你轻松不少。

第6章 利用数组处理批量数据

同学们,还在为处理诸多数据而苦恼吗,还在为要定义诸多变量而发愁吗!学了这章数组,我们就可以用数组来进行处理相同类型的批量数据。
数组也包括一维数组和二维数组,用 类型符 数组名[常量表达式] 来定义。
例1:对10个数组元素依次赋值为1,2,3,4,5,6,7,8,9,10,要求按顺序输出。
例2:当下面程序输入数据为 aid and时,s等于多少
例3:分析下面的程序,写出运行结果
例4:输入10个元素存入a[10]中,输出数组中最大元素的下标
例5:输入20个数,输出他们的平均值,输出与平均值之差的绝对值最小的数组元素
例6:输出行、列号之和为3的数组元素
例7:将一个数组中的元素按逆序重新存放
例8:有一行文字,要求删去某一个字符。此行文字和要删去的字符均由键盘输入,要删去的字符以字符形式输入
例9:找出10个字符串中的最大者
例10:冒泡排序
例11:矩阵重置
例12:输出一个已知的字符串
例13:输出一个菱形图
利用for循环拼接两个字符串:

例1:对10个数组元素依次赋值为1,2,3,4,5,6,7,8,9,10,要求按顺序输出。

#include <stdio.h>
int main()
{ 
	int i,a[10];
	for(i=1;i<=10;i++)			//对数组元素a[0]-a[9]赋值
	{
		a[i]=i;
	}
	for(i=1;i<=10;i++)			//输出a[0]-a[9]共10个数组元素		
	{
		printf("%d ",a[i]);
	}
	return 0;
}

运行结果:
在这里插入图片描述
a[0]~a[9]所存的元素为下图:
在这里插入图片描述
这就是数组储存元素的方式,数组元素的下标从0开始,如果用"int a[10];"定义数组,则最大的下标值为9,不存在a[10]。

例2:当下面程序输入数据为 aid and时,s等于多少

#include <stdio.h>
int main()
{ 
	int i,s;								//定义两个变量i,s
	char s1[100],s2[100];					//定义两个数组s1,s2
	printf("input string1:\n");				
	gets(s1);								//输入元素存入s1中
	printf("input string2:\n");  
	gets(s2);								//输入元素存入s2中
	i=0;
	while ((s1[i]==s2[i])&&(s1[i]!='\0'))	//当s1[i]等于s2[i]且s1[i]不等于0时执行循环
	i++;									//i自加
	if ((s1[i]=='\0')&&(s2[i]=='\0'))		//如果s[i]等于0且s2[i]等于0时
		s=0;								//s=0
	else									
		s=s1[i]-s2[i];						//否则s=s1[i]-s2[i]
	printf("%d\n",s);						//输出s
	return 0;
}

运行结果:
在这里插入图片描述

例3:分析下面的程序,写出运行结果

#include <stdio.h>
int  main()
{   
	int a[4][4],i,j,k;				//定义一个4行4列的二维数组a以及变量i,j,k
	for (i=0;i<4;i++)				//给i赋初值为0,当i<4时执行循环体
	{
		for (j=0;j<4;j++)			//给j赋初值为0,当j<4时执行循环体
		{	
			a[i][j]=i-j;			//a[i][j]=i-j
		}							//j自加
	}								//i自加
	for (i=0;i<4;i++)				//给i赋初值为0,当i<4时执行循环体
	{  
		for (j=0;j<=i;j++)			//给j赋初值为0,当j<i时执行循环体
		{
			printf("%4d",a[i][j]);	//输出a[i][j]
		}							//j自加
		printf("\n");				//换行
	}								//i自加
	return 0;						//结束
}

运行结果:
在这里插入图片描述

例4:输入10个元素存入a[10]中,输出数组中最大元素的下标

#include<stdio.h>
int main()
{	
    int a[10];                               //定义数组a
    int i,j=0;                               //定义两个变量i,j,给j赋初值为0
	printf("请输入10个元素:");		
    for(i=0;i<10;i++)			//向a中循环输入10个元素
	{
		scanf("%d",&a[i]);		//循环判断两个元素的大小	
		if(a[i]>a[j])			//此时j为0,用a[0]与a[1],a[2],a[3]...相比较,如果a[0]大于a[i]
		{
			j=i;			//让j=i后再循环,判断a[j],即a[i]与a[i]后面的数相对比
		}	
	}
	printf("数组中最大元素的下标为:%d\n",j);   //输出数组中最大元素的下标
	return 0;
}

运行结果:
在这里插入图片描述

例5:输入20个数,输出他们的平均值,输出与平均值之差的绝对值最小的数组元素

#include <stdio.h>	
int main()
{
	int i,k=0;											//定义两个整型变量i,k
	double s=0,j=0;										//定义两个双精度浮点型变量s,j,并给s,j赋值为0
	double a[20],b[20];									//定义两个可以存储小数的数组a,b并为a数组赋值						
	printf("请输入20个数:");
	for(i=0;i<20;i++)									//输入20个数,利用循环计算数组中所有数相加之和,存入j中
	{
		scanf("%lf",&a[i]);					
		j+=a[i];
	}
	s=j/20;												//计算平均值存入s中
	printf("数组平均值为:%.1lf\n",s);					//输出数组内数字相加后的平均值,定义为一位小数
	for(i=0;i<20;i++)									//利用循环求每个数与整个数组平均值的差并存入数组b中
	{
		b[i]=a[i]-s;						
		if(b[i]<0)										//如果b[i]小于0,则让其乘-1变为正数
		{
			b[i]*=-1;
		}
	}
	for(i=0;i<20;i++)									//循环20次
	{
		if(b[i]<b[k])									//判断数组b中20个数的大小,用b[0]与b[i](b[1],b[2],b[3]...)相比,若b[0]小于b[i]
		{
			k=i;										//将i的值赋给j后,用b[k]与b[i]相对比
		}
	}
	printf("与平均值之差的绝对值最小的数组元素:%d\n",k);	//输出k的值,即输出与平均值之差的绝对值最小的数组元素
	return 0;
}

运行结果:
在这里插入图片描述

例6:输出行、列号之和为3的数组元素

#include <stdio.h>
int main()
{	char ss[4][3]={'A','a','f','c','B','d','e','b','C','g','f','D'};
    int x,y,z;		        //定义三个整型变量
    for (x=0;x<4;x++)		//循环判断 定义c=a+b,当c=3时,输出数组的值
    {
		for (y=0;y<3;y++)
        {   
			z=x+y;
    	    if (z==3)
			{
				printf("%c\n",ss[x][y]);
			}
		}
	}
    return 0;
}

运行结果:
在这里插入图片描述

例7:将一个数组中的元素按逆序重新存放

#include <stdio.h>
#define N 10								//定义一个常量N
int main()
{
	char a[N];								//定义一个数组a
	int i,j;								//定义两个整型变量a,b
	printf("请输入10个数:");
	for(i=0;i<N;i++)						//循环输入N个数
	{
		scanf("%d",&a[i]);
	}
	for(i=0;i<N/2;i++)						//循环交换两个数字,如10和1,9和2,8和3...交换,所以循环N/2次,
	{										//由于数组的性质,第一个数对应a[0]...
		j=a[i];
		a[i]=a[N-i-1];
		a[N-i-1]=j;
	}
	printf("逆序后的数组为:");
	for(i=0;i<10;i++)						//输出逆序后的数组
	{
		printf("%d ",a[i]);
	}
	return 0;
}

运行结果:
在这里插入图片描述

例8:有一行文字,要求删去某一个字符。此行文字和要删去的字符均由键盘输入,要删去的字符以字符形式输入
思路:假设字符数组里存有a,b,c,d,e五个字符(e后还有\0)。删去c,得到a,b,d,e四个字符
即让d将c覆盖,e将d覆盖,(\0将e覆盖),此时数组内就变为了a,b,d,e。

#include <stdio.h>
int main()
{	
	int N,i,j=0,k=0;					//定义四个整型变量N,i,j,k,并为j,k赋初值为0
	char a[100];						//定义一个字符数组a
	char ch;							//定义一个字符变量ch
	printf("please input an sentence:");
	gets(a);							//输入数组a
	printf("Please enter the letter you want to delete: ");					
	scanf("%c",&ch);					//输入字符ch
	for(N=0;a[N]!='\0';N++)				//利用循环求字符的长度和数组中与ch相同的字符个数
	{
		if(a[N]==ch)
		{
			k++;
		}
	}
	for(i=0;i<N+k+1;i++)				//循环一直到\0后与k+1个
	{
		if(ch!=a[i])					//如果a[i]不等于所输字符
		{
			a[j]=a[i];					//让原位置的字符覆盖原位置字符,即原位置字符不变
			j++;
		}								//如果a[i]等于所输字符,则让i+1,即让后一位字符覆盖前一位字符							    	
	}									//直到最后将\0也赋给前值为止
	printf("%s\n",a);					//输出字符数组a
	return 0;
}

运行结果:
在这里插入图片描述

例9:找出10个字符串中的最大者

#include <stdio.h>
#define N 10													//定义两个常量N,M,用来控制数组s的大小
#define M 20
int main()
{
	char s[N][M],str[M];										//定义两个字符数组s,str(s的行和列数即N,M)
	int i,j;													//定义两个变量i,j
	printf("请输入10个字符串(每组字符串最长不超过%d个字符)\n",M);
	for (i=0;i<N;i++)											//循环将字符分别存进第一行、第二行‘第N行(因为只有M列,所以输入的字符串长度不能超过M)
	{
		printf("请输入第%d个字符串:",i+1);
		gets(s[i]);
		for(j=0;s[i][j]!='\0';j++);								//利用循环求所输入的字符串长度,并存入str数组内
		str[i]=j;				
		printf("第%d个字符串长度为:%d\n",i+1,j);
	}
	j=0;
	for(i=0;i<N;i++)											//求str数组内最大元素的下标,即所存入字符串长度的最大值为多少
	{
		if(str[i]>str[j])
		{
			j=i;
		}
	}
	printf("%d个字符串中的最大者为第%d个:\"%s\"",N,j+1,s[j]);	//输出10个字符串中的最大者
	return 0;
}

运行结果:
在这里插入图片描述

例10:冒泡排序

#include <stdio.h>
int main()
{
	int a[10];				//定义一个数组a用来储存数组
	int i,j,t;				//定义三个变量,i,j用来循环,t用来交换
	printf("input 10 numbers :");
	for(i=0;i<10;i++)		//为i赋初值为0,当i<10时循环执行
	{
		scanf("%d",&a[i]);	//循环输入10个数存入数组a中
	}
	for(j=0;j<9;j++)		//为j赋初值为0,当j<9时循环执行内循环
	{
		for(i=0;i<9-j;i++)	//为i赋初值为0,当i<9-j时循环执行
		{
			if(a[i]>a[i+1])	//判断a[i]与a[i+1]的大小,如果a[i]>a[i+1]就让二者交换
			{
				t=a[i];
				a[i]=a[i+1];
				a[i+1]=t;
			}				//此循环为了把最大的数值移动到最后一位并减少一次循环,下次循环最大的那个数不在参与
		}
	}
	printf("the sorted numbers :");
	for(i=0;i<10;i++)
	{
		printf("%d ",a[i]);	//循环输出数组a的数值
	}
	return 0;
}

运行结果:
在这里插入图片描述

例11:矩阵重置

#include <stdio.h>
int main()
{
	int a[2][3]={{1,2,3},{4,5,6}};
	int b[3][2],i,j;
	printf("array a:\n");
	for(i=0;i<=1;i++)
	{
		for(j=0;j<=2;j++)
		{
			printf("%5d",a[i][j]);
			b[j][i]=a[i][j];
		}
		printf("\n");
	}
	printf("array b:\n");
	for(i=0;i<=2;i++)
	{
		for(j=0;j<=1;j++)
		{
			printf("%5d",b[i][j]);
		}
		printf("\n");
	}
	return 0;
}

运行结果:
在这里插入图片描述

例12:输出一个已知的字符串

#include <stdio.h>	
int main()
{
	char c[15]={'I',' ','a','m',' ','a',' ','s','t','u','d','e','n','t','.'};
	int i;
	for(i=0;i<15;i++)
		printf("%c",c[i]);
	printf("\n");
	return 0;
}

运行结果:
在这里插入图片描述

例13:输出一个菱形图

#include <stdio.h>
int main()
{
	char diamond[][5]={{' ',' ','*'},{' ','*',' ','*'},{'*',' ',' ',' ','*'},{' ','*',' ','*'},{' ',' ','*'}};
	int i,j;
	for(i=0;i<5;i++)
	{
	for(j=0;j<5;j++)
	printf("%c",diamond[i][j]);
	printf("\n"); 
	}
	return 0;
}

运行结果:
在这里插入图片描述

利用for循环拼接两个字符串:

#include <stdio.h>
int main()
{
	char a[100];									//先定义两个数组,前面的数组长度要远大于第二个数组长度
	char b[5];
	int i,j;												
	printf("输入a字符串");							
	scanf("%s",a);									//字符串输入时不需要写地址符,输出时只需要写数组名不需要写方括号
	printf("输入b字符串"); 
	scanf("%s",b);
	for(i=0;a[i]!=0;i++);							//利用for循环求出输入a字符串的长度,循环只是为了求i的最终值因此不需要任何语句,在循环外输出i值即可
	for(j=0;b[j]!=0;j++)							
	{												
		a[i+j]=b[j];								//利用循环把b字符串里的字符放到a字符串剩余的内存即把b[j]放到a[i+j]里
	}														
	a[i+j]=0;																																								
	printf("拼接后的字符串为:%s\n",a);				//输出拼接后的字符串
	return 0;
}

运行结果:
在这里插入图片描述
分享了这么多数组的例题,相信大家对数组也应该有些了解了吧,下面来跟大家聊一聊关于“小黑盒”——函数的内容。

第7章 用函数实现模块化程序设计

大家现在在写程序时肯定习惯把所有的内容都装在一个主函数中,刚开始学习C语言时,这样做肯定没事,可随着我们学习的不断加深,所需要写的代码行也越来越多,全都写在主函数会使主函数变得庞杂、臃肿。这是,面对其中重复出现两次以上的语句,就该试试自定义一个函数来表示了,而由这一块一块的函数组成的完整程序,用得就是模块化程序设计思路
例1
例2
比如下面这个例子,设计个程序要求输出:
在这里插入图片描述

例1:

#include <stdio.h>
int main()
{
	void print_star();					//声明 print_star 函数
	void print_message();				//声明 print_message 函数
	void print_star();					//声明 print_star 函数
	print_star();						//调用 print_star 函数
	print_message();					//调用 print_message 函数
	print_star();						//调用 print_star 函数
	return 0;
}
void print_star()						//定义 print_star 函数
{
	printf("******************\n");		//输出一行 * 号
}
void print_message()					//定义 print_message 函数
{
	printf("  How do you do!\n");		//输出一行文字信息
}

运行结果:
在这里插入图片描述
其中函数就相当于是个“小黑盒”,你不用去管它里面是什么构造,只需要知道他能输出你想要的结果。
关于函数的定义,包括实参和形参,实参可以影响形参,而形参缺不能改变实参,这二者的关系是单向性的。

例2:

#include <stdio.h>
int main()
{
	int max(int x,int y);
	int a,b,c;
	printf("please enter two integer number:");
	scanf("%d,%d",&a,&b);
	c=max(a,b);
	printf("max is %d\n",c);
	return 0;
}
int max(int x,int y)
{
	int z;
	z=x>y?x:y;
	return z;
}

运行结果:
在这里插入图片描述
这里面a,b,c就是实参,x,y,z就是形参,a,b的值传给x,y,通过max函数的运算,最后返回z的值并赋给c,输出至屏幕。
函数的内容我所了解的也就这些。至此,大一上半学期的C语言结束,感谢大家观看我这不成熟的分享,还有一件事,有关C语言的分享我会持续更新的,敬请期待。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值