程序:能够实现特定功能的指令序列的集合,这些指令序列描述了计算机求解某一问题的工作步骤
指令:计算机可以识别的命令
程序设计:给出解决特定问题的程序的过程,是软件构造活动中的重要组成部分。
程序设计往往以某种程序设计语言为工具,给出用这种语言编写的程序。
程序员:专业的程序设计人员
结构化程序设计语言:C
面向对象程序设计语言:Java、C++、C#.....
良好的编程风格对于程序学习来说起这事半功倍的效果,希望大家在学习程序语言的时候一定要意识到。
#include
int main()
{
printf("Hello World!\n");
return 0;
}
#include
int Add(int x,int y);
int main()
{
int x,y,z;
scanf("%d%d",&x,&y);
z=Add(x,y);
printf("%d",z);
return 0;
}
int Add(int x,int y)
{
return x+y;
}
英语字母
数字
空白符
特殊字符
单词:程序设计语言的词法单位
int
C语言中标识符的构成规则:
以字母或下划线_开始
由字母、下划线_或数字组成
大写字母和小写字母代表不同的标识符
1.表达式
2.语句
3.函数:库函数、自定义函数
1.程序的结构
2.预处理指令:以#开头的命令
预处理:将程序翻译成机器指令之前,对程序进行的某些编辑处理,如滤掉注释、文件包含等。
#include
:将某个库文件包含到程序中,包含了库文件就可以直接调用该文件中的所有库函数。
3.注释
4.main
函数
5.输入输出操作
scanf("%d",&x);
printf("%d",x);
交互式集成开发环境(Integrated Design Environment ,IDE)
C语言采用编译的方式,即先由编译程序(也称编译器)把源程序翻译成目标程序,然后再由计算机执行目标程序。
调试:在程序中查找错误并修改错误的过程
符号常量:大写字母表示 PI
变量:num、studentName
函数:Max、PrintTri
自定义数据类型:StudentType DateType
全局变量:Gnum、Gsecret
//
/**/
int main(){
return 0;
}
int main()
{
return 0;
}
/*程序设计实例——鸡兔同笼问题*/
#include
int main()
{
int M,N;
int chicken,rabbit;
scanf("%d%d",&M,&N);
for(chicken=0;chicken<=M;chicken++)
{
rabbit=M-chicken;
if(2*chicken+4*rabbit==N)break;
}
if(chicken<=M)
printf("%d %d",chicken,rabbit);
else
printf("NO ANSWER");
return 0;
}
#include
#define PI 3.14
int main()
{
int radius; double area;
radius=10;
area=PI*radius*radius;
printf("%6.2f\n",area);
return 0;
}
位(bit)
字节(byte):8位二进制
每个存储单元的编号称为存储地址(简称地址)
(int)4个字节 n位二进制能够表示的整数范围-2(n-1)~(2(n-1)-1)
溢出:如果运算结果超出了系统能够表示的整数范围,则运算会得到错误的结果。
(float) 4个字节 10^(-38)~10^(38)
(double) 8个字节 10^(-308)~10^(308)
char ch='a';
ch-32='A';
char ch='5';
ch-'0'=其对应的数值
常量 1.数值型常量 1.1整型常量 eg:123
1.2实型常量 eg:3.14
2.字符型常量 1.1字符常量 eg:'a'
1.2字符串常量 eg:"abc"
转义字符:以反斜线\开头,其含义是将反斜线后面的字符转换成另外的含义。
1.用#define定义符号常量
#define PI 3.14
2.用const定义符号常量
const double PI=3.14;
地址:变量所在存储单元的地址
变量名:变量所在存储单元的助记符
变量值:存储在相应存储单元中的数据,即该变量所具有的值
类型:变量所属的数据类型
int a;
a=1;
int a=1;
a=a+10;
#include
int main()
{
int x=3,y=5,z=8;
int sum;
sum=x+y+z;
printf("%6.2f\n",(double)sum/3);
return 0;
}
#include
int main()
{
int year=2014;
if((year%4==0&&year%100!=0)||(year%400==0))
printf("yes");
else
printf("no");
return 0;
}
由关系运算符、运算对象和圆括号组成的式子称为关系表达式。
由逻辑运算符、运算对象和圆括号组成的式子称为逻辑表达式。
用赋值运算符将变量和表达式连接起来的式子称为赋值表达式。
int i=2,j=3,k;
k=i>j?i:j;
char->short->int->long->float->double
(类型说明符) (表达式)
():强制类型转换符
double x=3.6,y=3.8;
int a;
a=x+y;
a=(int)(x+y);
a=(int)x+y;//变量x的数据类型仍然是floa型,变量x的值仍然是3.6
tips:无论是自动转换还是强制转换,都只是为了执行本次运算而对数据的类型进行临时性的转换,是将某个数据的值转换成一个中间量,不改变原数据的类型。
#include //二位数的逆值
int main()
{
int num,x,y,numDevo;
scanf("%d",&num);
x=num%10;
y=num/10;
numDevo=x*10+y;
printf("%d",numDevo);
return 0;
}
printf("%d %d %5.2f\n",x,y,(double)x/y);
复合语句:由一对花括号括起来的若干条语句组成。
{ temp=x;x=y;y=temp; }
#include //水仙花数
int main()
{
int x,x1,x2,x3,y;
scanf("%d",&x);
x1=x%10;y=x/10;
x2=y%10;x3=y/10;
if(x1*x1*x1+x2*x2*x2+x3*x3*x3==x)
printf("yes");
else
printf("no");
return 0;
}
1.单分支的选择结构(if语句)
max=x;
if(max<y)
max=y;
2.双分支的选择结构(if-else语句)
if(x>=y)
max=x;
else
max=y;
tips:
判等运算符== :
赋值运算符= :语句if(i=0)…则是先把0赋值给变量i,然后测试赋值表达式的结果是否为0。此时,表达式的运算结果一定为假。
3.分支结构的嵌套
if(x>y)
{
if(y>z) x=0;
}
else
x=1;
switch语句(开关语句或选择语句)
switch((int)score/10)
{
case 10 :
case 9 : grade='A';break;
case 8 : grade='B';break;
case 7 : grade='C';break;
case 6 : grade='D';break;
default : grade='E';break;
}
循环条件
循环体
循环变量
#inlcude //欧几里得算法,算最大公约数
int mian()
{
int m,n,r;
scanf("%d%d",&m,&n);
r=m%n;
while(r!=0)
{
m=n;n=r;r=m%n;
}
printf("%d\n",n);
return 0;
}
while (表达式)
/* 计算n!*/
result=1;i=1;
while(i<=n)
{
result=result*i;
i++;
}
do
{
语句;
}while(表达式);
/* 计算n!*/
result=1;i=1;
do
{
result=result*i;
i++;
}while(i<=n);
for(表达式1;表达式2;表达式3)
循环的初值 循环条件 循环变量的修正
{
语句;
}
/* 计算n! */
for(result=1,i=1;i<=n;i++)
result=result*i;
i=0;
for(;i<n;i++)
.......
for(i=0;;i++)
{
if(i>=n) break;
}
for(i=0;i<n;)
{
i++;
}
/*整数的逆值*/
#include
int main()
{
int x,y=0,unit;
scanf("%d",&x);
while(x!=0)
{
unit=x%10;
y=y*10+unit;
x=x/10;
}
printf("%d\n",y);
return 0;
}
/*计算整数中所含数字的位数*/
#include
int main()
{
int x,digits=0;
scanf("%d",&x);
do
{
digits++;
x=x/10;
}while(x!=0);
printf("%d\n",digits);
return 0;
}
/*计算2+4+6+...+100的值*/
#include
int mian()
{
int sum=0,i;
for(i=2;i<=100;i=i+2)
{
sum=sum+i;
}
printf("%d\n",sum);
return 0;
}
4.3.5 循环结构的嵌套
/*九九乘法表的打印*/
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
printf("%d*%d=%2d",j,i,i*j);
printf("\n");
}
/*素数判定*/
#include
int main()
{
int x,i;
scanf("%d",&x);
for(i=2;i<x;i++)
{
if(x%i==0)
break;
}
if(i<x)
printf("yes");
else
printf("no");
return 0;
}
/*从键盘上输入10个整数,判断是否含有负数*/
for(flag=0,i=1;i<=10;i++)
{
scanf("%d",&x);
if(x<0)
{
flag=1;break;
}
}
if(flag==1)
printf("yes");
else
printf("no");
/*从键盘上输入10个整数,输出其中的负数*/
for(count=0,i=1;i<=10;i++)
{
scanf("%d",&x);
if(x>=0)continue;
printf("%4d",x);
count++;
}
printf("\n%d\n",count);
/*将三个整数由小到大输出*/
#include
int main()
{
int x,y,z,temp;
scanf("%d%d%d",&x,&y,&z);
if(x>y)
{
temp=x;x=y;y=temp;
}
if(z<x)
{
temp=z;z=y;y=x;x=temp;
}
else if(z<y)
{
temp=y;y=z;z=temp;
}
printf("%3d%3d%3d\n",x,y,z);
return 0;
}
/*今年已经过去多久了*/
#include
int main()
{
int yy,mm,dd;
int i,days,sumDay=0;
scanf("%d%d%d",&yy,&mm,&dd);
for(i=1;i<mm;i++)
{
switch(i)
{
case 1: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;
case 2: days=28;
if((yy%4==0&&yy%100!=0)||(yy%400==0))
days++;
break;
}
sumDay=sumDay+days;
}
printf("%d\n",sumDay);
return 0;
}
/*百元买百鸡*/
#include
int main()
{
int x,y,z;
int count=0;
for(x=0;x<=20;x++)
{
for(y=0;y<=33;y++)
{
z=100-x-y;
if((z%3==0)&&(5*x+3*y+z/3==100))
{
count++;
printf("%d %d %d",x,y,z);
}
}
}
if(count==0)
printf("this problem have not answer");
return 0;
}
/*哥德巴赫猜想*/
#include
int main()
{
int n,n1,n2,i;
scanf("%d",&n);//输入一个偶数
for(n1=2;n1<=n/2;n1++)
{
n2=n-n1;
for(i=2;i<n1;i++)
{
if(n1%i==0)
break;
}
if(i<n1)
continue;
for(i=2;i<n2;i++)
{
if(n2%i==0)
break;
}
if(i>=n2)
break;
}
printf("%d=%d+%d",n,n1,n2);
return 0;
}
/*引例5.1 舞林大会*/
#include
#define N 5
int main()
{
double a[N];
double sum=0,max=0,min=10;
int i;
for(i=0;i<N;i++)
{
scanf("%lf",&a[i]);
sum=sum+a[i];
if(max<a[i]) max=a[i];
if(min>a[i]) min=a[i];//并不知道其最小值是多少,但可以从最大值来开始比较,效果一样
}
printf("%4.lf\n",(sum-max-min)/(N-2));
return 0;
}
1.数组的定义:
基类型 数组变量名【整型常量表达式】;
数组元素的类型 数组名 数组长度
//合法的一维数组定义
int a[10];
double b[5];
char c[80];//数组长度不能是变量
const int N=10;
int a[N];//N是符号常量,相当于int a[10]
2.一维数组元素的引用:
数组变量名【整型表达式】
数组下标
3.一维数组的初始化
基类型 数组变量名【整型常量表达式】={初值表};
缺省则为初值个数
int a[10]={0,1,2,3,4,5,6,7,8,9};
int a[10]={0,1,2,3,4};//相当于int a[10]={0,1,2,3,4,0,0,0,0,0};
int a[10]={0};
int a[]={0,1,2,3,4};//省略数组长度
1.输入/输出操作
int a[10],i;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
int i,a[10]={1,2,3,4,5,6,7,8,9,10};
for(i=0;i<10;i++)
printf("%d",a[i]);
2.赋值操作
//在C语言中,除了在数组初始化时对数组进行整体赋值,就没有提供数组整体赋值的语句
//中的库函数memcpy,
//memcpy(a,b,sizeof(b)) 把数组b复制给数组a
int a[10],i;
for(i=0;i<10;i++)
a[i]=2*i; //为数组元素赋值需要注意数组下标不能越界(编译器通常不提供数组下标越界检查)
3.其他操作
本质上,数组元素是一个简单变量,因此,数组元素的使用方法与同类型简单变量的使用方法相同
int a[10];
a[0]=1;a[1]=2;
a[2]=a[0]+a[1]*5;
/*例5.1*/
#include
#define n 5
int main()
{
int r[n]={2,4,8,5,6},i,x;
scanf("%d",&x);
for(i=0;i<n;i++)
if(r[i]==x) break;
if(i<n)
printf("yes");
else
printf("no");
return 0;
}
/*引例5.2 哥尼斯堡七桥问题*/
#include
int main()
{
int mat[4][4]={{0,1,2,2},{1,0,1,1},{2,1,0,0},{2,1,0,0}};
int i,j,count=0,degree;
for(i=0;i<4;i++)
{
degree=0;
for(j=0;j<4;j++)
{
degree=degree+mat[i][j];
}
if(degree%2!=0)
count++;
}
if(count==0)
printf("it have a way");
else
printf("no way");
return 0;
}
1.二维数组的定义
基类型 数组变量名【整型常量表达式】【整型常量表达式】;
数组元素的类型 数组名 行数 列数
int a[10][5];
double b[5][10];
char ch[5][80];
2.二维数组元素的引用
3.二维数组的初始化
int a[2][3]={1,2,3,4,5,6};
int b[2][3]={1,2};
int c[2][3]={{1},{2}};
int d[2][3]={0};
1.输入输出操作
2.赋值操作
3.其他操作
/*例5.2*/
#include
int main()
{
int a[10][10],max,i,j,m,n;
scanf("%d%d",&m,&n);
printf("%d",m*n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
max=a[0][0];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if(max<a[i][j])
max=a[i][j];
printf("%d",max);
return 0;
}
/*实例1——折半查找*/
#include
#define N 5
int main()
{
int r[N],k,i;
int low=0,high=N-1,mid;
for(i=0;i<N;i++)
scanf("%d",&r[i]);
scanf("%d",&k);
while(low<=high)
{
mid=(low+high)/2;
if(k<r[mid]) high=mid-1;
else if(k>r[mid]) low=mid+1;
else break;
}
if(low>high)
printf("the answer is wrong");
else
printf("%d",mid+1);//物理序号+1
}
/*实例2——合并有序数组*/
#include
#define M 5
#define N 6
int main()
{
int A[M]={1,3,5,6,8},B[N]={1,2,5,7,8,9},C[M+N];
int i=0,j=0,k=0;
while(i<M&&j<N)
if(A[i]<B[j]) C[k++]=A[i++];
else C[k++]=B[j++];
while(i<M)
C[k++]=A[i++];
while(j<N)
C[k++]=B[j++];
for(k=0;k<M+N;K++)
printf("%3d",C[k]);
return 0;
}
/*实例3——对角线元素之和*/
#include
int main()
{
int a[10][10],i,j,n,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++)
sum=sum+a[i][i];
for(i=0;i<n;i++)
sum=sum+a[i][9-i];
printf("%d",sum);
return 0;
}
/* 引例6.1 欧几里得算法 */
#include
int ComFactor(int m,int n);
int main()
{
int x,y,factor;
scanf("%d%d",&x,&y);
factor=ComFactor(x,y);
printf("the max gcd is %d\n",factor);
return 0;
}
int ComFactor(int m,int n)
{
int r;
r=m%n;
while(r!=0)
{
m=n;
n=r;
r=m%n;
}
return 0;
}
类型标识符 函数名(形参表) 函数原型(函数头)
{
语句 函数体,可以为空,但花括号不能省略
}
有返回值函数在函数执行结束后向调用者返回一个执行结果,称为函数的返回值。
int Fun(int x,int y)
{
int z;
z=x*x+2*x*y+y*y;
return z;
}
Tips: 如果形参表中有多个参数,每个形参前面的类型必须分别写明,
int Fun(int x,int y)不能写成int Fun(int x,y)
如果形参表为空,良好的编程习惯是将形参制定为void ,以明确该函数为无参函数。 int Fun(void)
2.无返回值函数
无返回值函数只完成某种特定的数据处理,函数执行后无须向调用者返回执行结果。
无返回值函数在函数定义时必须将返回值的类型说明为void(空类型),函数体中的return语句只结束函数的执行。
void Table99(void)
{
int i,j;
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
{
for(j=1;j<=i;j++)
printf("%d×%d=%2d",j,i,i*j);
printf("\n");
}
}
return;
}
函数体可以为空,即函数体中可以没有任何语句,称为空函数。
void Table99(void)
{
}
Tips: 空函数对于较大规模程序的编写、调试和扩充很有用。对于较大程序不能写出所有函数再进行调试,对于那些还没有具体内容的函数可以只写出空函数,需要扩充函数功能时或相应函数调试完后再补上具体内容。
通常把调用其他函数的函数称为主调函数,被调用的函数称为被调用函数。
实际参数表
函数名(实参表)————>括号不能省略
/* 例6.3 */
#include
int Fun(int x)
{
int y;
y=x*x+2*x+1;
return y;
}
int main()
{
int a=10,b;
b=Fun(5);
printf("%d",b);
b=Fun(a);
printf("%d",b);
b=Fun(a+8.5);
printf("b");
return 0;
}
C语言规定:函数必须先定义后调用。
Tips:如果在所有函数之前声明函数原型,则该函数原型的作用域是整个程序,即在程序的任何位置都可以调用这个函数;
如果在某个函数内部声明函数原型,则该函数原型的作用域只在这个函数内部。
#include
int Fun(int x);
int main()
{
int a=10,b;
b=Fun(a);
printf("%d",b);
return 0;
}
int Fun(int x)
{
int y;
y=x*x+2*x+1;
return y;
}
Tips:尽管编译器不关心函数原型中形参的名字,在函数声明时,最好不要忽略形参的名字,因为形参的名字可以注释每个形参的目的,并且提醒编程人员在函数调用时如何安排实参的顺序。
编译系统提供了大量库函数用于实现常见的基本功能。
/* 引例 6.2 素数判定 */
#include
#include
int Prime(int x);
int main()
{
int a;
scanf("%d",&a);
if(Prime(a)==1)
printf("%d是素数\n",a);
else
printf("%d不是素数\n",a);
return 0;
}
int Prime(int x)
{
int i,n;
n=sqrt(x);
for(i=2;i<=n;i++)
{
if(x%i==0)
return 0;
}
return 1;
}
在C语言的编译系统中,库函数一般按功能(例如数学函数、字符串处理函数等)组织在相应的头文件中。
在使用库函数时,需要在程序中包含该库函数所在的头文件。
C语言提供了#include文件包含预处理指令,将一个头文件包含到源程序文件中。
1.字符数据的输入输出函数
int getchar(void)
eg:
char ch;
ch=getchar();
为了正确接收从键盘输入的字符,一般在调用getchar函数之前要清空键盘缓冲区。
C语言提供了清空键盘缓冲区函数fflush(stdin),其函数原型在头文件stdio.h中。
int putchar(表达式)
char ch='A';
putchar(ch);
putchar(ch+1);
putchar('\n');
2.格式化输入输出函数
int scanf("格式控制",地址列表)
int a; scanf("%d",&a);
int a; scanf("%x",&a);
int a; scanf("%o",&a);
float x; scanf("%f",&x);
double x; scanf("%lf",&x);
int printf("格式控制",输出列表)
int rand(void) :产生并返回一个随机整数。
void srand(unsigned int seed): 提供用于rand函数的随机种子值
unsigned int time(NULL):获得当前系统时间,其中NULL是在头文件stdio.h中定义的符号常量,其ASC11码值为0。