相信各位刚刚学习计算机的同学都有一种被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; //函数执行完毕时返回函数值
} //函数结束的标志
#include<stdio.h>
int main()
{
int a,b,sum;
a=123;
b=456;
sum=a+b;
printf("sum is %d\n",sum);
return 0;
}
#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:输入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;
}
#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;
}
#include <stdio.h>
int main()
{
double a=1.0;
printf("%f\n",a/3);
return 0;
}
#include <stdio.h>
int main()
{
float a;
a=10000/3.0;
printf("%f\n",a);
return 0;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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语言的分享我会持续更新的,敬请期待。