第一篇:C语言程序设计基础知识要点
01.C程序基本结构
一、C语言的特点:
1、C语言源程序的基本组成单位是函数;一个C程序可由若干个函数组成,其中必须有且仅有一个以main命名的主函数,其余的函数名称可由编程者自行设定。,2、C程序的执行总是由main()函数的第一个可执行语句开始,到main()函数的最后一个可执行的语句结束;而其他函数都是在main()函数开始执行以后,通过其他函数的调用才得以运行。
3、C语言系统提供了丰富的库函数,用户在程序中需要调用某个库函数时,必须用#include编译预处理命令将描述该库函数的头文件包含进去。
二、C程序的书写格式:
1、语句可从分开放在任意多行内;
如:printf(“To C,”);
printf(“ or not to C:”);
与printf(“To C , or not to C:”);是等价的2、一行中可以有若干个语句;
如:a=123;b=345;
3、每个语句和数据定义的最后必须有一个分号;
三、C语言程序的运行:
1、编译(Compile):将C源程序文件翻译成能被计算机识别的二进制形式的“目标”文件;编译时,编译器将检查源程序每一条语句的语法错误。
2、建造(Bulid):
C语言程序示例:显示“Hello”
#include
int main(void)
{
printf(“Hello.n”);
return 0;
}
说明:#include
printf函数来自”标准输入输出库”,可以产生格式化输出;
n 告诉printf函数执行完信息显示后要进行换行操作;
return 0 表明程序终止时会向操作系统返回值0;
{ }来标出main()函数的起始和结束。
02.数据类型
一、C语言的特点:
1、C语言源程序的基本组成单位是函数;一个C程序可由若干个函数组成,其中必须有且仅有一个以main命名的主函数,其余的函数名称可由编程者自行设定。
2、C程序的执行总是由main()函数的第一个可执行语句开始,到main()函数的最后一个可执行的语句结束;而其他函数都是在main()函数开始执行以后,通过其他函数的调用才得以运行。
3、C语言系统提供了丰富的库函数,用户在程序中需要调用某个库函数时,必须用#include编译预处理命令将描述该库函数的头文件包含进去。
二、C程序的书写格式:
1、语句可从分开放在任意多行内;
如:printf(“To C,”);
printf(“ or not to C:”);
与printf(“To C , or not to C:”);是等价的2、一行中可以有若干个语句;
如:a=123;b=345;
3、每个语句和数据定义的最后必须有一个分号;
三、C语言程序的运行:
1、编译(Compile):将C源程序文件翻译成能被计算机识别的二进制形式的“目标”文件;编译时,编译器将检查源程序每一条语句的语法错误。
2、建造(Bulid):
C语言程序示例:显示“Hello”
#include
int main(void)
{
printf(“Hello.n”);
return 0;
}
说明:#include
printf函数来自”标准输入输出库”,可以产生格式化输出;
n 告诉printf函数执行完信息显示后要进行换行操作;
return 0 表明程序终止时会向操作系统返回值0;
{ }来标出main()函数的起始和结束。
03,运算符和表达式
1、算术运算符和表达式
+:加法运算符,如 3+5;
-:减法运算符,如 5-3;
*:乘法运算符,如 5*8;
/:除法运算符,如 3/6;参与运算量均为整型时,结果也为整型,舍去小数;若运算量中有一个是实型,则结果为双精度实型。
%:模运算符,也称“取余运算符”,用于计算两数相除后的余数,如 5%3=2;
2、赋值运算符和赋值表达式
赋值运算符:”=”,其作用是将一个表达式的值赋给一个变量;
其一般形式为:变量=表达式
如:
x=a+b;赋值表达式的功能是计算表达式的值再赋予左边的变量。赋值运算符具有右结合性。因此
a=b=c=5 可理解为
a=(b=(c=5));复合赋值运算符:+=、-=、*=、/=、%=、>>=、<<=、&=、^=、|=
构成复合赋值表达式的一般形式为:变量
双目运算符=表达式
它等价于:变量=变量 运算符 表达式
如:
a+=5
等价于a=a+5
x*=y+7
等价于x=x*(y+7)
r%=p
等价于r=r%p
3、类型转换
如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型换成左边的类型。具体规定如下:
1)实型赋予整型,舍去小数部分。前面的例子已经说明了这种情况。
2)整型赋予实型,数值不变,但将以浮点形式存放,即增加小数部分(小数部分的值为0)。
3)字符型赋予整型,由于字符型为一个字节,而整型为二个字节,故将字符的ASCII码值放到整型量的低八位中,高八位为0。整型赋予字符型,只把低八位赋予字符量。
4、自增、自减运算符:
自增运算符:“++”,功能是将变量的值加1; 自减运算符:“--”,功能是将变量的值减1;
可有以下几种形式:
++i
i自增1后再参与其它运算。
--i
i自减1后再参与其它运算。
i++
i参与运算后,i的值再自增1。
i--
i参与运算后,i的值再自减1。
注:
(1)”++”、”--“的操作对象只能是变量;
(2)”++”、”--“运算优先级相同,且结合方向自右向左;-i++应理解为-(i++),【例】自增、自减运算、#include
main()
{
int i=8;
printf(“%dn”,++i);/* i先加1,再输出i,输出结果为9 */
printf(“%dn”,--i);
/* i先减1,再输出i,结果为8 */
printf(“%dn”,i++);/* 先输出i,输出结果为8,i再加1,*/
printf(“%dn”,i--);/* 先输出i,输出结果为9,i再减1,*/
printf(“%dn”,-i++);/* 先加输出-i,输出结果为-8,i再加1 */
printf(“%dn”,-i--);/* 先输出-i,输出结果为-9,i再减1 */
}
5、求字节运算符
计算表达式的结果所占字节数或某种数据类型的定义字节数。
一般格式:sizeof(数据类型标识符)或
sizeof(表达式)
如: sizeof(float)的值为4,占4个字节;
sizeof(2*3)的值为2,占2个字节;
6、关系运算符和关系表达式
关系运算符:“<”(小于)、“<=”(小于等于)、”>”(大于)、”>=”(大于等于)、”==”(等于)、“!=”(不等于)关系表达式:若关系表达式成立,其值为“真”,否则为“假”;在C语言中,用0代表“假”,用1代表“真”;
7、逻辑运算符和逻辑表达式: 逻辑运算符: “!”(非)、“&&”(与)、“||”(或);运算优先级:!>&&>|| 逻辑表达式:用逻辑运算符将表达式连接起来的式子;逻辑表达式的结果仍然是逻辑量(“真”或“假”)
8、条件运算符:
一般格式: <表达式1>?<表达式2>:<表达式3>
先计算表达式1,若表达式1的值为真,则计算表达式2的值,且表达式2的值为整个条件表达式的值;否则,计算表达式3的值,且表达式3的值即为整个条件表达式的值。
9、逗号运算符和逗号表达式
逗号运算符:”,”作为运算符,其功能是将多个表达式组成一个表达式;
一般形式:表达式1,表达式2,…,表达式n
求解过程:先计算表达式1,再计算表达式2,依此计算表达式n,最终,表达式n的值即为整个表达式的值。
04.顺序结构
一、概述:
顺序语句按照语法形式分为:表达式语句、函数调用语句、复合语句、流程控制语句和空语句。
1、表达式语句:
语法格式:表达式;
如:a+4;
其中赋值语句为最典型的表达式语句,如:
a=5;
a=b+3;
特别提示:分号(;)是表达式语句中不可缺少的一部分。
2、函数调用语句:
如:printf(”I am a student!”);
其中:printf()为系统提供的函数,用于显示信息。
3、复合语句:
所谓“复合语句”即由一对“{}”括起来的一组语句,也称“块语句”或“分程序”。
一般形式为:
{
语句1
语句2
...语句n
}
如:
{
i++;
j=a+3;
printf(“%d,j=”,i,j);
}
特别提示:复合语句中的最后一条语句的分号不得缺少;复合语句的“}”之后不得有分号。
4、空语句:
“空语句”即为一个独立的分号。
如:
main()
{
...;
...}
二、数据的输入输出
C语言提供了一些输入输出函数,如printf()和scanf(),在程序中调用这些输入输出函数时,必须将标准输入输出头文件“stdio.h”包含到用户所编写的源程序中。
如:#include
其中:#include命令一般写在程序的开头位置。
1、格式输入输出
1、格式输出函数printf()
(1)一般格式: printf(格式字符串,输出列表)
其中:“格式字符串”包括“输出字符”和“格式控制字符”(由%和格式字符组成,指定输出项的输出格式)。
• d格式符:用于输出十进制整数;
%d:以十进制形式显示输出变量的值;
%5d:以十进制形式显示变量的值,且至少占用5个字符的空间,若不够5位数字,则左侧补空格;
%-5d:以十进制形式显示变量的值,且至少占用5个字符的空间,左对齐;
%5.3d:以十进制形式显示变量的值,且至少占用5个字符的空间并至少有3位数字,若不够3位数字,则左侧补0;
如:#include
main()
{
int i;
i=40;
printf(“%dn”,i);
printf(“%5dn”,i);
printf(“%-5dn”,i);
printf(“%5.3dn”,i);
}
• f格式符:用于以小数形式输出实数;
%10.3f:以定点十进制形式显示变量的值,且总共用10个字符,其中,整数位6位,小数位3位,小数点1位;
如:#include
main()
{
float x;
x=839.21f;
printf(“%10.3fn”,x);
}
• c格式符:用于输出一个字符;
如:
x=”a”,y =”b”,则 printf(%c %c“,x,y)的输出结果为:a b
若变量的值为整数,则输出该整数值为ASCII码的字符:
如 x=65,y=98,则 printf(“%c, %c”,x,y)的输出结果为: A, b;
同理,一个字符的数据也可以以整数的形式输出;
如 x=’a’,y=’B’,则printf(“%d,%d”,x,y)的输出结果为:97,66
• s格式符:用于输出一个字符串。
如:printf(“%s”,”I am a student!”)
• e,E格式符:用于以指数形式输出实数。
如:printf(“%e”, 123.456),则输出结果为:1.234560e+002;
• g,G格式符:用于输出实数,根据数值的大小自动选择f格式或e格式。
2、格式输入函数scanf()
(1)一般格式:
scanf(格式字符串,变量地址表)
其中:格式字符串使用双引号括起来的字符串,包括“普通字符”(按原样输入)、“格式控制字符”(由%和格式字符组成,用来标定输入数据的格式)。
变量地址表是由若干个变量地址组成的表列,可以是变量的地址,也可以使字符串的首地址。
• d格式:用于输入十进制整数;
如:scanf(“%d,%d”,&x,&y);则输入格式为:123,3456
•u格式:用于输入十进制无符号整数;
•f格式:用于输入以小数形式的实数;
如:scanf(“%f,%f”,&x,&y);则输入格式为:123.23,23.456
•c格式:用于输入一个字符;
如:scanf(“%c,%c”,&x,&y);则输入格式为:a,b
•s格式:用于输入一个字符串;
如:scanf(“%s”,a);假定a为字符数组,则输入格式为:abcdef
注:输入的字符串中间不能包含空格。
特别说明:
• 对于变量,”&”加变量名即为该变量的地址;如:&a、&b等分别表示变量a和变量b的地址;
•对于字符串数组或字符指针型变量,数组名和指针变量名本身即为其地址;
•可以在%和格式字符之间加表示位数的数字;如:scanf(“%5s”,p);表示只能输入5个字符给字符串指针p;
3、字符数据的输入输出:
(1)putchar()函数:是向标准输入输出设备输出一个字符;
其调用格式为:putchar(ch);其中:ch为一个字符变量或常量;
putchar()函数作用等同于 printf(“%c”,ch);
(2)getch()getche()和getchar()函数:
•getch():从键盘上读入一个字符,但不显示在屏幕上;
•getche():从键盘上读入一个字符,显示在屏幕上;
•getchar():从键盘上读入一个字符,并显示在屏幕上,但直到输入回车键时才结束输入,第一个字符为其函数的返回值。
05.选择结构
一、if语句:
一般格式:
if(表达式)语句;
表示:当“表达式”成立时,则执行“语句”;否则跳过“语句”;
如:if(a>b)printf(“a>b!”);
例:若用户输入的数为3的倍数,则显示”OK”
#include
main()
{
int a;
scanf(“%d”,&a);
if(a %3==0)printf(“OK”);
}
二、if-else 语句:
一般格式:
if(表达式)
语句1;
else
语句2;
例:给出用户输入的两个整数的较大者
#include
main()
{
int a,b;
scanf(“%d,%d”,&a,&b);
if(a>b)
printf(“the max=%d”,a);
else
printf(“ the max=%d”,b);
}
三、if语句的嵌套
1、if子句中嵌套:
• if(表达式1)
if(表达式2)语句1;
else 语句2;
else 语句3;
• if(表达式1)
{ if(表达式2)语句1;}
else 语句2;
2、else子句中嵌套
• if(表达式1)语句1;
else
if(表达式2)语句2;
else 语句3;
• if(表达式1)语句1;
else
if(表达式2)语句2;
3、嵌套一般格式:
if(表达式1)语句1;
else if(表达式2)语句2;
else if(表达式3)语句3;
…
else if(表达式n)语句n;
else 语句n+1;
例:将用户输入的成绩按以下规则转换成等级成绩:
分数: 90~100
等级:优
分数: 80~89
等级:良
分数: 70~79
等级:中
分数: 60~69
等级:及格
分数: 60以下
等级:不及格
# include
main()
{
int d;
printf(“输入分数:”);
scanf(“%d”,&d);
if(d>=90)printf(“优”);
else if(d>=80)printf(“ 良”);
else if(d>=70)printf(“ 中”);
else if(d>=60)printf(“ 及格”);
else printf(“ 不及格”);
}
四、条件语句:
表达式1 ? 表达式2 :表达式3
执行的过程:若表达式1的值为非0时,该条件语句的职位表达式2,否则为表达式3;
例:求一个整数的绝对值
#include
main()
{
int i,absi;
scanf(“%d”,&i);
absi=i>0 ? i :-i;
printf(“%d绝对值是%dn”,i,absi);
}
五、switch语句
switch(表达式)
{
case 常量表达式1:
语句1;
break;
case常量表达式2:
语句2;
break;
…
case常量表达式n:
语句n;
break;
default:
语句n+1;
}
例:商店卖货物,每一件3.5元,按购买的数量给与优惠:
购买100件,优惠5%;
购买200件以上,优惠6%;
购买300件以上,优惠8%;
购买400件以上,优惠10%;
购买500件以上,优惠15%;
#include
main()
{
int n;
float p,price;
scanf(”%d“,&n);
switch(n/100)
{
case 1:
p=0.05;
break;
case 2:
p=0.06;
break;
case 3:
p=0.08;
break;
case 4:
p=0.10;
break;
case 5:
p=0.15;
break;
}
price=3.5*n*(1-p);
printf(”%应付款=%7.2fn“,price);
}
06.循环结构
一、for语句:
一般格式: for(表达式1;表达式2;表达式3)语句;
表示:先计算表达式1的值,再计算表达式2的值,若表达式2的值为0,则跳出循环体,转去执行循环体后面的程序命令;若表达式2的值非0,则执行循环体中的语句,接着计算表达式3的值;而后,再从计算表达式2的值开始重复上诉操作,直到表达式2的值为0时结束。
例:计算sum=1+2+3+…+100的值”
#include
main()
{
int i,sum;
sum=0;
for(i=1;i<=100;i++)
sum=sum+i;
printf(“sum=%d”,sum);
}
二、while 语句:
一般格式:
while<表达式>
语句;
表示:先计算表达式的值,若为非0,则执行循环体语句,然后再计算表达式的值,重复上述过程,直到计算表达式的值为0时结束循环。
例:计算sum=1+2+3…+100的值
#include
main()
{
int i,sum;
i=1;
sum=0;
while(i<=100)
{
sum=sum+i;
i++;
}
printf(“sum=%d”,sum);
}
三、do-while语句
1、一般格式:
Do
语句;
While<表达式>;
表示:先执行一次循环语句,然后计算表达式的值,若表达式的值非0,则再执行循环语句,然后从计算表达式的值开始重复上述过程,直到计算表达式的值为0,循环结束。
例:计算sum=1+2+3…+100的值
#include
main()
{
int i,sum;
i=1;
sum=0;
do
{
sum=sum+i;
i++;
}while(i<=100);
printf(“sum=%d”,sum);
}
四、break和continue语句:
1、break语句:
使用break语句可以提前结束由while、for、do-while语句构成的循环,而去执行循环下面的语句。
例:判定用户输入的一个数是否为素数
#include
main()
{
int a,d;
printf(“请输入一个整数:”);
scanf(“%d”,&a);
for(d=2;d if(a%d==0) break;// 跳出当前的循环,执行循环后面的语句 if(d printf(“%d 不是素数”, a); else printf(“%d 是素数 “,a); } 2、continue: continue语句用于for、while、do-while语句中,其作用是结束本次循环,接着进入下一次是否执行循环的判断。例:输入10个非0的整数并求和。 #inclu de main() { int i,n=0,sum=0; while(n<10) { printf(“ 请输入整数:”); scanf(“%d”,&i); if(i==0) continue;// 若为0,则继续输入下一个数 sum+=i; n++; } printf(“%d”,sum); } 五、三种循环的比较: 1、三种循环可以处理同一个问题,一般情况下可以相互代替; 2、while和do-while循环语句只在while语句之后指定循环条件,在循环体内应包含使循环趋于结束的语句;for循环语句可以在<语句3>中包含使循环趋于结束的语句; 3、对于while和do-while循环语句,循环变量的初始化应在while和do-while语句之前完成;for循环语句可以在<表达式1>中进行; 4、while和for语句是先判断表达式,后执行循环;do-while循环语句是先执行循环,后判断表达式; 07数组 数组是一组具有同一名字、不同下标的变量。数组中带下标的变量称为数组元素,每个数组元素由数组名字和下标唯一地来确定;同一数组中的元素数据类型相同。一、一维数组: 1、定义:只有一个下标的数组。 2、定义格式: 类型说明符 数组名[常量表达式] 如: int a[3];//定义了一个一维数组,名称为a,数据类型为整型,含3个数组元素 a[0]、a[1]、a[2]; 说明: •类型说明符:是指数组的数据类型; •常量表达式:是一个值为正整数的表达式,用来表示该数组的元素的个数,即数组的大小; 3、数组的引用: 数组名[下标]; 如: a[2] 4、数组的初始化: •对数组的全部因素赋初值: 如: int a[3]={10,20,30};则该语句执行后,a[0]=10,a[1]=20,a[2]=30; • 对数组的部分元素赋初值: 如:int b[3]={12,11};则该语句执行后,b[0]=12,b[1]=11,a[2]=0; •对数组的全部元素赋初值时,也可将数组定义为一个不确定长度的数组: 如:int c[ ]={10,15,20};则该语句执行后,数组c的长度自动确定为3,c[0]=10,c[1]=15,c[2]=20; 例:将输入的10个整数按反序输出 #include main() { int a[10],i; printf(”请输入10个整数:“); for(i=0;i<10;i++) scanf(”%d“,&a[i]); printf(” 反序输出:“); for(i=9;i>=0;i--) printf(”%d“,a[i]); printf(”n“); } 例:计算Fibonacci数列的前20项 Fibonacci数列定义: f(1)=1 f(2)=1 f(n)=f(n-1)+f(n-2)(n>2) #include main() { int f[21],i; f[1]=1; f[2]=1; for(i=3;i<=20;i++) f[i]=f[i-1]+f[i-2]; for(i=1;i<=20;i++) { printf(”%8d“,f[i]); //每个数字占8位 if(i%5==0) printf(”n“); //按5个一行输出 } } 二、二维数组: 具有两个下标的数组为二维数组。 1、定义格式: 类型说明符 数组名[常量表达式][常量表达式] 如: int a[3][2];//定义了一个二维数组,名称数组名为a,含有6个元素:a[0][0]、a[0][1]、a[1][0]、a[1][1]、a[2][0]、a[2][1]; 说明: •第一个常量表达式指出的是数组的行数;第二个常量表达式指出的是数组的列数; •二维数组元素的顺序是:按行存放;即先顺序存放第一行的元素,再存放第二行的元素…以此类推; 其存储格式: a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] 2、二维数组的初始化: 同一维数组。 •分行为二维数组赋初值: int a[3][2]={{1,2},{3,4},{5,6}};则该语句执行后,a[0][0]=1, a[0][1]=2, a[1][0]=3,a[1][1]=4, a[2][0]=5, a[2][1]=6; •按数组在存储时的排列次序赋初值: int a[3][2]={1,2,3,4,5,6}; •对数组的部分元素赋初值: int a[3][2]={{1},{2,3},{4}}; •忽略第一维的长度,对二维数组赋初值: int a[][2]={1,2,3,4,5,6};该语句执行后,C语言系统自动计算出第一维的长度为6/2=3,同样有:a[0][0]=1, a[0][1]=2,a[1][0]=3,a[1][1]=4, a[2][0]=5, a[2][1]=6; 例:将两个2行3列的矩阵相加,并显示结果。 #include main() { int a[2][3]={1,3,5,7,9,11}; int b[2][3]={2,4,6,8,10,12}; int c[2][3],sum=0,i,j; for(i=0;i<2;i++) //i 表示第1行到第3行 for(j=0;j<3;j++) //j 表示第1列到第3列 c[i][j]=a[i][j]+b[i][j]; for(i=0;i<2;i++) for(j=0;j<3;j++) { printf(“%5d”,c[i][j]); if((j+1)%3==0)printf(“n”); } } 08字符数组 字符数组是用来存放字符的数组,字符数组中的一个元素存放一个字符。 1、字符数组的定义: char a[10]; 2、字符串:字符串是借助于字符数组来存放的,并规定以字符’ ’(占用存储空间,但不计入字符串的长度)为字符串的结束标记。 3、字符串处理函数: •scanf(“%s”,a);//以格式符%s输入字符串,输入的字符串自动以’ ’结尾;输入的字符数组名前不加”&”前缀; •printf(“%s”,a);//以格式符%s输出字符串,输出的字符串以’ ’结尾; •gets(a);//a为字符数组名,输入的字符可以包含’ ’字符; •puts(a);//a为字符数组名,输入的字符可以包含’ ’字符; •strcat(字符串1,字符串2);//把字符串2连接到字符串1后; •strcpy(字符数组1,字符串2);//把字符串2拷贝到字符数组1中; 如:str为字符数组,将字符常量赋予str: strcpy(str,”abcdef“); •strcmp(字符串1,字符串2);//比较两个字符串,若相等,则返回0,若字符串1>字符串2,则返回1,否则返回-1; 如:比较两个字符串str1、str2:if(strcmp(str1,str2)==1)printf(”str1>str2“); •strlen(字符数组);//返回字符数组中包含的字符串的长度; •strlwr(字符串);//将字符串的大写字符转换为小写; •strupr(字符串);//将字符串的小写字符转换为大写; 例:不使用strlen()函数,计算一个字符串的长度 #include main() { int i=0; char str[30]; printf(“ 输入一个字符串:”); gets(str); while(str[i]!=’ ’) i++; printf(“字符串长度为:%dn”,i); } 例:将一字符串逆转 #include #include main() { char str[20],temp; int i,j; printf(“输入一个字符串:”); gets(str); for(i=0;i { j=strlen(str)-1; temp=str[i]; str[i]=str[j-i]; str[j-i]=temp; } printf(“倒置的字符串为:%sn”,str); } 09指针 字符数组是用来存放字符的数组,字符数组中的一个元素存放一个字符。 1、字符数组的定义: char a[10]; 2、字符串:字符串是借助于字符数组来存放的,并规定以字符’ ’(占用存储空间,但不计入字符串的长度)为字符串的结束标记。 3、字符串处理函数: •scanf(“%s”,a);//以格式符%s输入字符串,输入的字符串自动以’ ’结尾;输入的字符数组名前不加”&”前缀; •printf(“%s”,a);//以格式符%s输出字符串,输出的字符串以’ ’结尾; •gets(a);//a为字符数组名,输入的字符可以包含’ ’字符; •puts(a);//a为字符数组名,输入的字符可以包含’ ’字符; •strcat(字符串1,字符串2);//把字符串2连接到字符串1后; •strcpy(字符数组1,字符串2);//把字符串2拷贝到字符数组1中; 如:str为字符数组,将字符常量赋予str: strcpy(str,”abcdef“); •strcmp(字符串1,字符串2);//比较两个字符串,若相等,则返回0,若字符串1>字符串2,则返回1,否则返回-1; 如:比较两个字符串str1、str2:if(strcmp(str1,str2)==1)printf(”str1>str2“); •strlen(字符数组);//返回字符数组中包含的字符串的长度; •strlwr(字符串);//将字符串的大写字符转换为小写; •strupr(字符串);//将字符串的小写字符转换为大写; 例:不使用strlen()函数,计算一个字符串的长度 #include main() { int i=0; char str[30]; printf(“ 输入一个字符串:”); gets(str); while(str[i]!=’ ’) i++; printf(“字符串长度为:%dn”,i); } 例:将一字符串逆转 #include #include main() { char str[20],temp; int i,j; printf(“输入一个字符串:”); gets(str); for(i=0;i { j=strlen(str)-1; temp=str[i]; str[i]=str[j-i]; str[j-i]=temp; } printf(“倒置的字符串为:%sn”,str); } 10函数 C程序是由函数组成的,有且只有一个主函数main(),由主函数调用其他函数,其他各函数也可以相互调用。 1、函数的定义: 一般格式: 类型说明 函数名(形式参数表) //函数头 { 说明部分; //函数体 执行部分; } 其中:类型说明:是指函数返回值的数据类型;默认为int; 函数名:为一标识符;代表了函数的入口地址; 形式参数表:是用逗号分隔的一组变量说明,指出每一个形式参数的类型和名称; 函数值的返回:有时,调用函数是为了计算一个结果,这是需要使用返回语句将就是结果返回给主调函数,此值即为函数的返回值; 一般格式:return(表达式); 其中,圆括号可以省略; 当函数不需要返回值时,可以写成:return; 例:编写一个函数power(),用于计算x的n次方的值 #include float power(float x,int n) { int i; float s; s=1; for(i=1;i<=n;i++) s=s*x; return(s); } 2、函数的调用: C语言中函数调用的一般格式: 函数名(实参表); 如:float f; f=power(3,10); 3、数组作为函数的参数 •数据元素作为函数实参 在函数调用时,把数组元素作为实参传递给形参,实现单向的值传递; 如:判别各个元素的值,大于0,则输出该值,小于或等于0,则输出0 #include void func(int x) { if(x>0) printf(“%4d”,x); else printf(“%2d”,0); } main() { int a[5],i; printf(“请输入5个数:”); for(i=0;i<5;i++) scanf(“%d”,&a[i]); for(i=0;i<5;i++) func(a[i]);//将数组元素作为实参传递 } •数组名作为函数参数 (1)使用数组名作为函数参数时,形参和实参是同类型的数组; (2)在主调函数和被调函数中分别定义数组; (3)数组名代表了数组的起始地址,数组名作为函数参数传递的是该数组的起始地址,而不是该数组元素的值; 例:将数组中的元素的和计算并显示出来。 #include func(int b[]) { int sum=0,i; for(i=0;i<10;i++) sum+=b[i]; return sum; } main() { int a[]={1,2,3,4,5,6,7,8,9,10},s; s=func(a); //将数组a组为参数传递给函数func printf(”s=%d“,s); } 4、内部函数和外部函数 • 内部函数:在定义函数时,在其类型名之前加“static”,则所定义的函数为内部函数,只能被所在的源文件中的函数调用,其他源文件若有同名的内部函数,互不干扰。 • 外部函数:在定义函数时,在其类型名之前加“extern”(也可省略),则所定义的函数为外部函数(也称全局函数),可被其他源程序的函数调用。 如:static int func_1() //内部函数 { ...} extern func_2() //外部函数 { ...} 综合测试 ~~~~~给定程序为:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上只剩一个桃子。求第一天共摘了多少桃子。由主函数输出第一天共摘桃子数。输出结果为1534。 #include 解析:根据题意,第n+1天剩下的桃子数为x(n+1),第n天剩下的桃子数为x(n),则满足:x(n)=2*(x(n+1)+1);第十天剩下1个桃子,可推算出第九天剩下的数量;可利用for循环,递推出其他天数剩下的桃子数: int fun(int n) { int x,i; x=1; //第十天剩下的数量 for(i=n-1;i>=1;i--)//从第九天开始推算 { x=2*(x+1); } return x;} ~~~~~~给定程序的功能是:从键盘输入10个整数求其中的最大值。#include for(i=0;i<10;i++) scanf(”%d“,&a[i]); max=fun(a,10); printf(”max=%d“,max);} int fun(int b[],int n){ } 解析:比较最大值的一般算法:设置一个变量max,第一步:将第一个数赋予max;第二步:利用for循环,将剩下的9个数依次与max相比较,每次比较,max均等于大的数; int fun(int b[],int n){ int max,i; max=b[0];//将第一个数赋予max for(i=1;i<=n-1;i++) //将剩下的9个数依次与max比较; if(max return max;} ~~~~~~~给定程序的功能是:将给定字符串中所有的小写字母转换成大写字母(大写字母A的ASCII码为65,小写字母a的ASCII码为97)。#include char a[]={”AgRbhLfFGjI“}; hs(a); printf(”%s“,a);} 解析:将给定字符串的每一个字符取出,判断是否介于'a'和'z'之间,若是,则将其转换为大写字符,即其ASC码值-32。void hs(char c[]){ unsigned int i; for(i=0;i if(c[i]>='a' && c[i]<='z') c[i]=c[i]-32; return;} ~~~~~~~给定程序的功能是:求1+2+3+4+5+6+......+n(n的值由键盘输入)。include int fac(int n); int n,sum; scanf(”%d“,&n); sum=fac(n); printf(”sum=%d“,sum);} int fac(int n){ } 解析:函数fac的功能是计算1-n之间整数的累计和。int fac(int n){ int i,sum; sum=0; //累计和的初始值为0 for(i=1;i<=n;i++) sum+=i; //将1-n之间的整数累加起来 return sum;} ~~~~~~~~~给定程序的功能是:从键盘输入 10个整数,求其中的最小值。 #include ”stdio.h“ main(){ int fun(int x[],int n); int a[10],i,min; printf(”please input 10 numbers:n“); for(i=0;i<10;i++) scanf(”%d“,&a[i]); min=fun(a,10); printf(”min=%dn",min);} int fun(int x[],int n){ } 解析:比较最小值的一般算法:设置一个变量min,第一步:将第一个数赋予min;第二步:利用for循环,将剩下的9个数依次与min相比较,每次比较,min均等于小的数; int fun(int x[],int n){ int min,i; min=x[0];//将第一个数赋予min for(i=1;i<=n-1;i++) //将剩下的9个数依次与min比较; if(min>x[i])min=x[i]; return min;} 1.Problem A: Hello world!Description Xiao_ming有两个哥哥,大哥叫Da_min,二哥叫Er_min。三兄弟放学回家,父母分别跟他们打招呼。 Input 无 Output 请输出: Hello Da_min, Hello Er_min, Hello Xiao_ming! Sample Input Sample Output Hello Da_min, Hello Er_min, Hello Xiao_ming! HINT 请注意换行符 Append Code #include printf(“Hello Da_min,n”); printf(“Hello Er_min,n”); printf(“Hello Xiao_ming!n”);} 2.Problem B: 求圆的面积和周长 Description 从键盘输入圆的半径,求圆的面积和周长,圆周率取3.14。 Input 输入一个浮点型数据,有效数字不会超过十进制的6位。 Output 输出为两行。 第一行为圆的面积,第二行为圆的周长,格式见sample。 Sample Input 3 Sample Output Area: 28.260000 Perimeter: 18.840000 HINT 了解浮点类型的输入、输出和算术运算符 Append Code 法一 #include #include double r; scanf(“%d”,&r); printf(“Area: %lfn”,pi*r*r); printf(“Perimeter: %lfn”,2*pi*r); } 3.Problem C:平均值 Description 求3个数的平均值。 Input 输入只有一行,为3个较小的整数。 Output 输出为这3个整数的平均值,保留3位小数。 Sample Input 1 2 3 Sample Output 2.000 HINT 注意除法运算对整型数据和浮点型数据是不一样的。 Append Code #include 4.Problem D: 求字符的值 Description 从键盘输入3个字符(不含双字节字符),分别输出每个字符的十进制值(ASCII码)、八进制值和十六进制值。 Input 输入为3个字符。 Output 输出为3行。 每一行为每个字符(对应输入顺序)的十进制、八进制和十六进制值,用空格分隔开。每个输出的值占3个字符,不足3个字符前面补0。 Sample Input 0 A Sample Output 048 060 030 032 040 020 065 101 041 HINT 了解字符值的存储和整型的关系。 Append Code #include 5.Problem A: 最简单的程序 Description 输出一行“Hello world!”。 Input 无 Output Hello world! Sample Input Sample Output Hello world! HINT Append Code #include printf(“Hello world!”);} 6.Problem B: 算术基本运算 Description 计算两整数x和y(0 Input 输入只有一行,格式见sample。 Output 输出为多行,按顺序每行输出x,y的和、差、积、商、余数、x的平方和y的三次方,格式见sample Sample Input x = 11, y = 3 Sample Output x + y : 14 xy : %dn“,x-y); printf(”x * y : %dn“,x*y); printf(”x / y quotient: %d, remainder: %dn“,x/y,x%y); printf(”x ^ 2 : %dn“,x*x); printf(”y ^ 3 : %dn“,y*y*y);} 7.Problem C: 自增自减运算 Description C语言中有自增运算++、自减运算--,并且可以前置和后置。 编写一个程序:对输入的一个整数a,输出a++、a--、++a、--a的值。 Input 一个整数a,a是很小的整数。 Output 输出为5行,第一行为a的值,后面依次为--a、a--、a++、++a的值。 5行输出纵向a要对齐,“:”对齐,“:”前后各一个空格,后面的数值不用对齐。每行行尾都有回车。 Sample Input 0 Sample Output a : 0--a :-1 a--: 0 a++ : 0 ++a : 1 HINT Append Code #include : %dn“,a);printf(”--a : %dn“,--a);a=x;printf(” a--: %dn“,a--);a=x;printf(” a++ : %dn“,a++);a=x;printf(”++a : %dn“,++a);} 8.Problem F: 绝对值 Description 求整型数据和浮点型数据的绝对值。 Input 输入两个数,第一个是整数,第二个是浮点数。 Output 输出为两行,第一行为整数的绝对值,第二行为浮点数的绝对值,注意浮点数的绝对值不输出无意义的0。 Sample Input-1 1 Sample Output 1 1 HINT 求绝对值可以用标准库函数来完成,也可以自己判断。注意浮点数的输出格式。求绝对值的函数在哪个头文件?貌似很多人会搞错,包括很多编书的人! Append Code #include int n; float m; scanf(”%d%f“,&n,&m); //n=abs(n); //m=fabs(m); if(n<0) { n=-n; } if(m<0) { m=-m; } printf(”%dn“,n); printf(”%g“,m); return 0;} 9.Problem A: 奇数还是偶数? Description 输入一个整数,判读它是奇数还是偶数。 Input 输入只有一行,为一个100以内的正整数。 Output 输出为一行。 若输入为偶数则输出“even”,奇数输出“odd”。Sample Input 30 Sample Output even HINT 用整数运算可以解决,练习“?:”表达式。 Append Code #include int n; scanf(”%d“,&n); if(n>=0&&n<=100){ if(n%2==0)printf(”evenn“); else printf(”oddn“); } return 0;} 10.Problem B: 简单的打折计算 Description 商店规定:消费满n元,可以打八八折。设某件商品标价m元,输入购买的件数x,计算出需要支付的金额(单位:元),精确到分。 Input 输入只有一行,三个整数m、n和x,且0 Sample Input 95 300 4 Sample Output 334.40 HINT 了解浮点型的输出控制,注意整型和浮点型混合运算过程中的数据类型转换。 Append Code #include int m,x,n,a; float b; scanf(”%d%d%d“,&m,&n,&x); 0 x m a=m*x; if(a>n) b=0.88*a; else b=a; printf(”%.2fn“,b); } 11.Problem C: 判断闰年 Description 输入一个正整数的年份,判断是否为闰年。 Input 输入只有一行,为一个10000以内的正整数。 Output 输出为一行。 若输入为闰年偶数则输出“Yes”,否则输出“No”。 Sample Input 2010 Sample Output No HINT 了解逻辑运算符和关系运算符。 Append Code #include int x; scanf(”%d“,&x); if(x>0&&x<10000) { if(x%4==0&&x%100!=0) printf(”Yesn“); else if(x%400==0) printf(”Yesn“); else printf(”Non“); } else printf(”error“);} 12.Problem D: 水仙花数 Description 如果一个三位十进制数等于其各位数字的立方和,则称这个数为水仙花数。如:13+53+33=153。 Input 一个整数x,100<=x<=999。 Output x是水仙花数,则输出“YES”,否则为“NO”。 Sample Input 153 Sample Output YES HINT Append Code #include int a,b,c,x; scanf(”%d“,&x); a=x/100; b=x/10%10; c=x%10; if(x==a*a*a+b*b*b+c*c*c) printf(”Yes“); else printf(”No“);} 13.Problem E: 三个数比较大小 Description 从键盘上输入0~100之间的三个数,按从小到大的顺序输出。 Input 输入只有一行,为三个整数。 Output 按从小到大输出这三个数。 Sample Input 15 10 20 Sample Output 10 15 20 HINT 用if语句判断各种情况可以解决这个问题。 Append Code #include int a,b,c; scanf(”%d%d%d“,&a,&b,&c); if(a>=b) { if(b>=c) printf(”%d %d %dn“,c,b,a); else if(c>=a) printf(”%d %d %dn“,b,a,c); else printf(”%d %d %dn“,b,c,a); } else { if(a>=c) printf(”%d %d %dn“,c,a,b); else if(b>=c) printf(”%d %d %dn“,a,c,b); else printf(”%d %d %dn“,a,b,c); } } 14.Problem F: 奇怪的求和之一 Description 给定3个正整数a、b和c,按照如下规则求和: 如果这个数字是偶数,则累加到和中; 如果这个数字是奇数,则将大于该数的最小偶数累加到和中。 Input 三个正整数,均在100以内。 Output 一个和。 Sample Input 2 3 5 Sample Output 12 HINT 如果不会使用分支语句,可使用条件运算符判断到底将哪个数累积到和中。 Append Code #include int a,b,c; scanf(”%d%d%d“,&a,&b,&c); if(a%2!=0)a++; if(b%2!=0)b++; if(c%2!=0)c++; printf(”%dn“,a+b+c); } 15.Problem G: 你过线了吗? Description 经过四年的学习,你决定报考我国著名的“285”高校之一的北青大学,经过认真的复习,残酷的考试,终于知晓了自己的考试成绩,也知道了北青大学的录取分数线,请你编程判断,自己过线了吗? Input 输入有2行,第一行有4个正整数,分别表示三门课程的分数线以及总分分数线。第二行有3个非负整数,分别表示你考的三门课程的成绩。 Output 如果你的三门课程成绩都不低于相应课程的分数线,且你的考试总分也不低于北青大学的总分分数线要求,则输出“congratulations”,否则输出“sorry”。 Sample Input 70 80 70 240 80 80 82 Sample Output congratulations HINT 如果你不会使用分支语句,同样可以使用条件运算符实现该程序。 Append Code #include int a,b,c,d,e,f,g,h; scanf(”%d %d %d %dn%d %d %d“,&a,&b,&c,&d,&e,&f,&g); h=e+f+g; if(e>=a&&f>=b&&g>=c&&h>=d) printf(”congratulations“); else printf(”sorry“);} 16.Problem I: A+B Problem(II): Input/Output Practice Description 计算a+b,0<=a,b<1000。 Input 输入的第一行是一个整数N,后面有N对整数a和b,每对a和b占一行,a,b用空格分开。 Output 每行输出一个a+b的和,顺序与输入对应。 Sample Input 2 1 2 10 20 Sample Output 3 30 HINT N给出了测试样例数,用for循环处理方便。 Append Code #include int n,a,b,i;Scanf(“%d”,&n);For(i=0;i 17.Problem H: A+B Problem Description 计算a+b,0<=a,b<1000。 Input 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。 Output 每行输出一个a+b的值,顺序与输入对应。 Sample Input 1 2 10 20 Sample Output 3 30 HINT OJ系统上测试输入结束符为EOF(End Of File),其值为-1。用scanf()把文件所有内容读完后,会读到EOF,所以可以用来判断输入是否完成,测试时可以用Ctrl+Z产生EOF。本题解法参看FAQ。Append Code #include int a,b; while(scanf(”%d%d“,&a,&b)!=EOF){ printf(”%dn“,a+b); } return 0;} 18.Problem A: 判断是否是元音字母 Description 输入一个英文字母,判断是否是元音字母。元音字母是:a,e,i,o u,A,E,I,O,U Input 输入一个英文字母 Output 是元音字母,输出“yes”,否则输出“no”,行尾没有回车。 Sample Input A Sample Output yes HINT Append Code #include char ch; scanf(”%c“,&ch); if(ch>='A'&&ch<='Z') ch=ch+32; if(ch=='a') printf(”yes“); else if(ch=='e') printf(”yes“); else if(ch=='i') printf(”yes“); else if(ch=='o') printf(”yes“); else if(ch=='u') printf(”yes“); else printf(”no“); } 19.Problem B: 按顺序输出三个数 Description 对于输入的3个整数,按照从小到大的顺序输出。 Input 输入3个int类型内的整数,两两之间用一个空格隔开。 Output 按照从小到大的顺序输出上述三个数,两两之间用一个空格隔开。 Sample Input 2 1 3 Sample Output 1 2 3 HINT Append Code #include int a,b,c,temp; scanf(”%d%d%d“,&a,&b,&c); if(a { temp=a; a=b; b=temp; } if(a { temp=a; a=c; c=temp; } if(b { temp=b; b=c; c=temp; } printf(”%d %d %dn“,c,b,a);} 20.Problem E: Description 判断输入整数的奇偶性。 判断奇偶数 Input 输入为一个整数。 Output 输出只有一行,代表判断结果。如果输入的整数n是一个偶数,输出: n is an even number.否则输出: n is an odd number.见样例。 Sample Input 12 Sample Output 12 is an even number.HINT Append Code #include int a; scanf(”%d“,&a); if(a%2==0) printf(”%d is an even number.“,a); else printf(”%d is an odd number.“,a);} 21.Problem A: 判断两个整数的大小关系 Description 输入2个整数a和b,如果a>b,则输出1,否则输出0。 Input 两个整数a和b,均不超过int类型的表示范围。 Output 表示a>b的结果:如果a>b,则输出1,否则输出0。 Sample Input 3 4 Sample Output 0 HINT Append Code #include printf(”1“); else printf(”0“);return 0;} 22.Problem D: 成绩的等级 Description 把百分制的考试成绩转换成五级制的成绩: 90~100:Excellent 80~89:Good 70~79:Average 60~69:Pass 0~59:Failing 不在0~100之间的输入是非法数据,输出“Error”。 Input 输入多行,每行一个整数。 Output 输入所对应的成绩等级。 Sample Input-1 81 92 35 68 72 100 Sample Output Error Good Excellent Failing Pass Average Excellent HINT 用switch语句解决这个问题比较方便。 Append Code #include int score; while(scanf(”%d“,&score)!=EOF) { if(score<0||score>100) printf(”Errorn“); else { switch(score/10) { case 0: case 1: case 2: case 3: case 4: case 5:printf(”Failingn“);break; case 6:printf(”Passn“);break; case 7:printf(”Averagen“);break; case 8:printf(”Goodn“);break; case 9: case 10:printf(”Excellentn“);break; } } } return 0;} 23.Problem E: 输出是m的倍数或n的倍数、但不是 m和n的公倍数的数 Description 输出1~k之间是m的倍数或n的倍数、但不是m和n的公倍数的数,其中1<=m,n Input 输入三个整数,依次为k、m、n。 Output 从小到大输出符合题意的所有整数,两数之间用一个空格分开。 Sample Input 15 2 3 Sample Output 2 3 4 8 9 10 14 15 HINT 难点在于输出格式的控制:空格在数的中间,学会用循环时边界情况的特殊处理。 Append Code #include a=m;else a=n;printf(”%d“,a);for(i=a+1;i<=k;i++){ } if((i%m==0&&i%n!=0)||(i%n==0&&i%m!=0)) printf(” %d“,i);} return 0; 24.Problem B: 两整数相加减 Description 计算a+b和a-b。 Input 输入为一对整数a和b。a,b用空格分开。 Output 输出a+b和a-b的计算结果,各占一行。 Sample Input 1 2 Sample Output 3-1 HINT Append Code #include printf(”%dn“,a+b); printf(”%dn“,a-b);} 25 Problem C: 它满足条件吗? Description 需要判断给定的一个整数是否同时满足如下三个条件: 1.它是一个完全平方数。2.它是一个偶数。3.它是一个正数。 注:若一个数能表示成某个自然数的平方的形式,则称这个数为完全平方数。例如: 0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400,441,484,529 Input 一个int范围内的整数。 Output 如果输入的数字满足条件,则输出yes,否则输出no。 Sample Input 100 Sample Output yes HINT 注意逻辑表达式判断三个条件的顺序。如果你不会使用分支语句,同样可以使用条件运算符实现该程序。 库函数sqrt()可以用于求一个数的平方根。 Append Code #include if(a==sqrt(a)*sqrt(a)&&a%2==0&&a>0) printf(”yes“); else printf(”no“);} 26.Problem F: 多路分支 Description 编写一个完整的程序,运行时向用户提问”你考试考了多少分?(0-100)“接受输入后判断其等级并显示出来等级: 优:90<=分数<=100 良:80<=分数<90 中:60<=分数<80 差:0<=分数<60 Input 输入任意一个整数分数值,显示等级;再输入任意一个整数分数值,显示等级;....直到测试数据较充分,可输入-1止。 Output 对任意输入的分数值,输出对应的等级,直到输入的数为-1时才退出运行.Sample Input 102 100 90 80 70 60 50 0-80-1 Sample Output grad must between 0 and 100 优 优 良 中 中 差 差 grad must between 0 and 100 grad must between 0 and 100 HINT Append Code #include int x; while(scanf(”%d“,&x)!=EOF) { if(x<0||x>100) printf(”grad must between 0 and 100n“); else if(x>=90) printf(”优n“); else if(x>=80) printf(”良n“); else if(x>=60) printf(”中n“); else if(x>=0) printf(”差n“); } return 0;} Problem D: 有多少人? Description 学校举行运动会,如果全体学生按照3人一队列队,则多了1个人;如果按照4人一队列队,则多了2个人;如果按照5人一队排队,则多了3个人。请问这个学校有多少学生? Input 一个int类型的正整数N,是学生人数的上界,即:该校学生数不超过N。 Output 所有可能的学生数,每个数占一行。 Sample Input 200 Sample Output 58 118 178 HINT Append Code #include int n,i; scanf(”%d“,&n); for(i==1;i<=n;i++){ if(i%3==1&&i%4==2&&i%5==3) printf(”%dn“,i);} return 0;} Problem C: 正负数各有几个? Description 输入若干个整数,求其中正数、负数的个数。 Input 输入分为2行:第一行是一个数字N>0,表示下面有N个整数。第2行是N个整数,都是int类型的。 Output 输出所输入的N个整数的正数个数和负数个数,并用空格分开2个输出。Sample Input 10 2 3 4 5-1-2-3-4-5 Sample Output 5 5 HINT 貌似还有一种叫做0的数。 Append Code #include int n,a,i,num1=0,num2=0; scanf(”%d“,&n);for(i=0;i { scanf(”%d“,&a); if(a>0) num1++; else if(a<0) num2++; } printf(”%d %dn“,num1,num2); return 0;} Problem A: A+B Problem(III): Input/Output Practice Description 计算a+b,0<=a,b<1000。 Input 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。当测试样为0 0时表示输入结束,0 0不参与运算。 Output 每行输出一个a+b的值,顺序与输入对应。 Sample Input 1 2 10 20 0 0 Sample Output 3 30 HINT 练习break的使用。 Append Code #include { if(a!=0||b!=0) } printf(”%dn“,a+b); else break; return 0;} 30 Problem B: A+B Problem(IV): Input/Output Practice Description 计算a+b,0<=a,b<1000。 Input 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。 Output 每行输出一个a+b的值,顺序与输入对应。每个格式样例之间用一个空行分隔开。 Sample Input 1 2 10 20 15 35 Sample Output 3 30 50 HINT 由于输出的和比空行多一个,所以全部计算放在一个循环里是不行的,必须要特殊处理开头或者结尾。 Append Code #include n++; if(n==1) printf(”%dn“,a+b); else printf(”n%dn“,a+b); } return 0;} Problem C: n个数的最大值和最小值 Description 找出n个数中最大的数和最小的数,并将它们的值输出出来。 Input 输入为n+1个整数,都在int类型范围内。这些数可能用若干空格或者换行符分隔开。输入的第1个数为n,表示后续有n个数输入。从输入的第2个数开始,求出直到第n+1个数中最大的数和最小的数。 Output 输出为两行,格式见sample。 Sample Input 3 0 1-1 Sample Output The maximum number is 1.The minimum number is-1.HINT 分隔符是空格还是回车都是空白符,对scanf(”%d“)来说没有区别;先读入n,然后用for循环就很容易控制读入n个数的过程。 Append Code #include int n,i,max,min; scanf(”%d“,&n); int a[n]; for(i=0;i scanf(”%d“,&a[i]); max=a[0]; min=a[0]; for(i=0;i { if(max max=a[i]; if(min>a[i]) min=a[i]; } printf(”The maximum number is %d.n“,max); printf(”The minimum number is %d.“,min); return 0;} 32.Problem D: 求100以内的素数 Description 素数是只能被1和自身整除的正整数,根据数学定义1不是素数。素数也叫质数。 Input 输入为两个整数m和n,满足0<=m<=n<=100。 Output 从大到小输出m~n之间的所有素数,一个素数一行。如果m~n之间没有素数,则不输出任何数。 输出的所有数在两行“=====”之间。 Sample Input 2 12 Sample Output ===== 11 7 5 3 2 ===== HINT 利用素数的数学规律可以很容易的解出此题,题目给出的数据范围是关键。 Append Code #include t=0; for(j=2;j<=sqrt(i);j++) if(i%j==0) t=1; if(t==0&&i>1) printf(”%dn“,i);} printf(”=====“);return 0;} 33.Problem E: 是否构成三角形? Description 给出三个整数,代表三条边的长度,判断这三条边的长度是否能构成一个三角形? Input 第一行是n(1<=n<=100),表示有n组测试数据 接下来有n行,每一行包含三个整数,表示三个边长(1<=边长<=100) Output 如果三条边能构成三角形,输出YES,否则输出NO Sample Input 3 1 2 3 2 8 7 20 20 1 Sample Output NO YES YES HINT Append Code #include {scanf(”%d%d%d“,&a,&b,&c); if(a+b>c&&a+c>b&&b+c>a) printf(”YESn“);else printf(”NOn“);} return 0;} 34.Problem C: 简单的整数排序 Description 对给出的若干整数按从小到大排序。 Input 输入的第一个数为n(n<=1000),后接n个整数。 Output 按从小到大的顺序输出这些整数,每两个整数之间用一个空格分隔开,最后一个整数后面没有空格。 Sample Input 10 3 9 1 5 2 8 5 6 7 3 Sample Output 1 2 3 3 5 5 6 7 8 9 HINT 排序前必须把所有的整数都存储下来。因为只有最多1000个数,1秒的时间足够任何排序算法运行处结果来。 Append Code #include int c,i,n,j; int a[1000]; scanf(”%d“,&n); for(i=0;i scanf(”%d“,&a[i]); for(i=1;i<=n-1;i++) { for(j=0;j { if(a[j]>a[j+1]) { c=a[j]; a[j]=a[j+1]; a[j+1]=c; } } } printf(”%d“,a[0]); for(i=1;i printf(” %d“,a[i]); return 0;} 35.Problem A: Description 购物的路程 Saya和Kudo一起去购物。假定她们逛的街是一条直线,而商铺是这条直线上的一些点。她们将车停在该直线最左端的店铺处,然后从左向右开始逛每一个店铺,然后从最右边的店铺再返回到停车处。你的任务是计算她们走了多少路。 Input 输入有多组。每一组的第一行是N(0 Output 对每组输入,输出她们走的路长。 Sample Input 4 13 89 37 6 7 30 41 14 39 42 0 Sample Output 152 70 HINT Append Code #include int n,i,max,min,a[100001]; while(scanf(”%d“,&n)&&n!=0) { scanf(”%d“,&a[0]); min=max=a[0]; for(i=1;i { scanf(”%d“,&a[i]); if(a[i]>max) max=a[i]; if(a[i] min=a[i]; } printf(”%dn“,(max-min)*2); } return 0;} 36.Problem B: 求累加和 Description 编程求min~max的累加和(含min和max),其中max>=min>0。部分程序已经给出,请填充其中的空白语句,并提交填充后的完整程序。 Input 输入为多行。第一行是一个整数N>0,表示后面有N个测试用例。后面有N行,每行包含2个整数,分别是min和max。 Output 输出为N行,每个测试用例的计算结果占据一行。每行的格式为: case i:sum=s.其中i表示测试用例的编号(从1开始),s是该测试用例对应的累加和(设不超过int的表示范围)。 Sample Input 3 1 10 1 100 1 1 Sample Output case 1:sum=55.case 2:sum=5050.case 3:sum=1.HINT Append Code #include int n,i,j,max,min,sum; scanf(”%d“,&n); for(i=0;i { sum=0; scanf(”%d%d“,&min,&max); if(max==min) printf(”case %d:sum=%d.n“,i+1,min); else { for(j=min;j<=max;j++) sum=sum+j; printf(”case %d:sum=%d.n“,i+1,sum); } } return 0;} 37.Problem G: 顺序输出字母 Description 按字母顺序输出两个字母st和ed之间的所有字母,但不包括st和ed。不输出逆序。 Input 两个字母st和ed,都是大写字母,用一个空格分开。 Output 在一行内按顺序输出st和ed之间的所有字母,但不包括st和ed。例如: 输入为A和E,则输出为BCD; 输入为A和B,则什么字母也不输出,只有一个空行; 输入为E和A,也是什么字母也不输出,只有一个空行。最后要输出一行(行尾不回车): ***END*** Sample Input A C Sample Output B ***END*** HINT Append Code #include char st,ed,a; int i; scanf(”%c%c%c“,&st,&a,&ed); { for(i=st+1;i printf(”%c“,i); printf(”n***END***“); } return 0;} 38.Problem F: 单字母变换 Description Tom和Jack是密码学爱好者,他们在聊天时经常使用一些暗语。他们使用的一种最简单的暗语是:将要说的每句话里面的英文字母变成这个字母之后的某个字母。现在要求你写一个程序,将一个字母变成它之后的某个字母。 Input 输入有2个:一个大写字母c和一个正整数d(0 Output 输出字母c之后的第d个字母。大小写与c一致。如果c之后的某个字母已经超出'Z',则再从字母'A'开始计数。 如:c='A',d=3,则输出应为:D。若:c='Y',d=3,则输出应为:B。 Sample Input A 3 Sample Output D HINT Append Code #include char c; int d; scanf(”%c%d“,&c,&d); if(c+d<='Z') printf(”%c“,c+d); else printf(”%c“,c+d-26); return 0;} 39.Problem B: 登录密码验证 Description 编写一个程序,模拟用户登录系统的密码验证过程。系统提供给用户的密码长度最长为20个字符,若密码输入错误可以再次输入。但为了保证用户密码安全,若连续输入密码错误超过5次就会锁定账号一段时间。 Input 输入为若干个串,至EOF结束。输入的第一个串是用户的正确密码,后面的串为模拟用户登录时的输入的密码。 Output 每次输入错误的密码,输出一个“Wrong!”,若输入的密码为正确的,输出一个“Welcome!”,并结束密码测试。若前5次输入的密码都是错误的,则后面的输入中不管是否有正确的密码都输出“Out of limited!”。 Sample Input abcdefg 123456 kkkkkkkk abcdefg Sample Output Wrong!Wrong!Welcome! HINT 输入可以用scanf(”%s“)处理,密码比较用字符串的比较可以完成。 Append Code #include char a[20],b[20]; int i,j=1; scanf(”%s“,a); while(scanf(”%s“,b)!=EOF) { if(j<=5) { if((strcmp(a,b)==0)) { printf(”Welcome!n“); break; } else printf(”Wrong!n“); j++; } else printf(”Out of limited!n"); } } 40.Problem C: 兔子的繁殖问题 Description 假设一对兔子每月能生一对小兔(一雌一雄),每对小兔出生后的下一个月是没有繁殖能力的,至出生后的第三个月开始又可以每月生一队小兔,问从一对刚出生的小兔开始,经过若干个月后一共有多少兔子(假设在此过程中兔子没有死亡)? 这个问题是意大利数学家菲波那契(Fibonacci)在他1202年出版的《算盘全书》中提出来的,从第一对刚出生的小兔开始每月的兔子数被乘坐菲波那契序列。 Input 输入的第一个数为n,接下来有n个数字。每个数字为一个月份m(m<=45)。 Output 输出为n行,每行为第m个月后的兔子总数。 《C 语言程序设计》主要在计算机软件、计算机网络、计算机应用、通信技术、智能电子、电子信息工程、多媒体以及核工程与核技术等专业中开设,是电子信息类、机械类等工科专业的重要专业基础课。 本校从2001至今,每年都开设《C语言程序设计》课程,由于,我校最开始时的特殊情况,主要把重点放在C语言中的各类重点、难点的语法、语义上,使得学生经过比较复杂和痛苦的过程后,对C语言在使用上很难做到自己编写程序。而且很多学生产生了畏惧心理。 2004年,学院成立计算机科学与技术系,为了更好学习和掌握C语言,计算机科学与技术专业和计算机维护专业(计算机应用技术前身)除了开设《C语言程序设计》课程外,在后续一学期还开设了《C语言程序设计课程设计》,使得计算机专业学生编程思想和能力得到了极大提高。 2005年,为了让我院工科学生更好的掌握C语言编程以及通过四川省计算机二级考试,在《C语言程序设计》课程后设置《C语言程序设计课程设计》,极大地提高了学生的动手机会和能力,过级率显著提高! 2007年,依托我校建设精品课程的契机,我们将C语言中的各个知识点进行重新规整,提出适用于三本院校学生的语言设计学习的方法。我们提出,先了解C语言,再学习C语言,再用C语言的思想。即在开始时让学生初步知道C语言,然后引入比较简单的运算符以及基本输入、输出和简单的顺序结构程序设计。通过这样的方式,我们发现,学生在C语言的学习就不会从开始的时候陷入大量难懂的语法、语义和数据结构中。有了以上铺垫再层层进入,最终进入复杂的各类数据结构以及指针等学习。通过以上的内容规整后,教学效果有明显提高。 实验三:单精度的有效数字为7位,双精度的有效数字为16位。实验四:x=3.600000,i=3 当以浮点型输出时,小数点默认为6位; int b=-1; 1111 1111 1111 1111; p=(i++)+(i++)+(i++);备注:i=5,在Turbo C中把5作为表达式中所有的i值,因此三个5相加得15,再求出表达式的值后在实现自加三次得8; q=(++j)+(++j)+(++j);备注:j=5,同上,j先自加三次得8,再将8作为表达式中所有的j值,因此三个8相加的24; i+=i*=i+6;备注:+号比复合运算符高级,先算;再从右向左计算; k=(j=++i,i+=j,i+=5);备注:逗号也是一种运算符,从左向右算,左后得到的值为k得值; t 作用是跳过8列;b 作用是退一列;ddd 代表1到3位八进制数 (101)8=(65)10; a=12赋值运算符优先级低于算术运算符 a*=5 a等于12*5=60 a+=a-=a*=a 结果为0 从右到左 实验五:进制间的转换 双精度也是用%f输出,但长整型要用%ld输出。long n=1234567长整型有32位 比普通整型多一倍 当未规定小数点后的位数时,系统自动输出6位小数。Printf(“%e”,123.456);会输出1.23456e+02 ,其中小数点也算一位 scanf(“%d%d%d”,&a,&b,&c);使用scanf函数时不要丢掉&,输入形式由双引号内的形式决定; printf(“%d,%d,%dn”,a,b,c);} 输出的形式由双引号内的形式决定。#include 实验六:不完全运算: c=(a 实验七:do{„„}while(n)do 循环体语句 while(表达式);先执行循环体语句,再判断表达式,“真”,继续执行,“加”结束循环;当输入0时 循环结束 while(1){„„}由于表达式为真,为避免循环体语句不断循环下去,循环体语句中必有break。 while((d/=10)>9); 空操作 :当表达式的 值为真时,不执行任何操作 1.对于整型变量x,与while(!x)等价的是(B) A.while(x!=0) B.while(x==0) C.while(x!=1) D.while(~x) 6.以下程序段运行后变量n的值为(D)int i=1,n=1;for(;i<3;i++) { 当表达式为真时,不做任何操作(空操作) continue; 当表达式为真时,跳过n=n+i n=n+i; } A.4 B.3 C.2 D.1 所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是一水仙花数,因为153=13+53+33。 课本例6.9 求100~200间的全部素数 # include main() { int m,k,i,n=0; for(m=101;m<=200;m=m+2) { k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0)break;if(i>=k+1){printf(“%d ”,m);n=n+1;} if(n%10==0)printf(“\n”); } printf(“\n”); } 实验八:用起泡法对10个数排序(由小到大) main() { int a[11]; int i,j,t; printf(“input 10 numbers :n”); for(i=1;i<11;i++) scanf(“%d”,&a [i]); printf(“n”); for(j=1;j<=9;j++) for(i=1;i<=10-j;i++) if(a[i]>a[i+1]){t=a [i];a [i]=a [i+1];a[i+1]=t;} printf(“the sorted numbers :n”); for(i=1;i<11;i++) printf(“%d ”,a[i]); } 8.若有定义int a [ ] [ 3 ]={1,2,3,4,5,6,7,8,9};则表达式sizeof(a)/sizeof(a[0])的值为(A) A、3 B、4 C、5 D、9 5.若有定义int a[2][3];则对数组元素的非法引用是(D)A.a[0][1/2] B.a[1][1] C.a[4-4][0] D.a[0][3] 1/2==0 107、以下数组定义中,正确的是(B)A、int a[2][3]={1,2,3,4,5,6,7};B、int a[ ][ ]={{1,2,3},{4,5,6}, {7,8,9}};C、int a[2][ ]={1,2,3,4,5,6};D、int a[ ][4]={6} 实验九:scanf函数以空格结束一个字符串的输入,而gets函数以回车结束 4.以下程序结束后屏幕输出(B) char str[]=“abcd”;printf(“%d”,strlen(str)); 代表一个字节? A.4.B.5 C.6 D.7 补充:若题目问:“分配多少空间给数组str[],则结果为4个,包括一个结束标识符‘ ’” 实验十:scanf(“%f,%f”,&a,&b);输入20,30 逗号不要忘了 2.已知char a;使用scanf()函数输入一个字符给变量a,不正确的函数调用是(B)A.scanf(“%d”,&a); B.scanf(“%lf”,&a); C.scanf(“%c“,a); D.scanf(”%u”,&a); 整型和字符型可互相转换,但浮点型不可以 用选择法对数组中10个整数按由小到大排序。所谓选择法就是先将10个数中最小的数与a[0]对换;再将a[1]到a[9]中最小的数与a[1]对换„„每比较一轮,找出一个未经排序的数中最小的一个。共比较9轮。 void sort(int array[],int n) {int i,j,k,t; for(i=0;i {k=i; for(j=i+1;j if(array[j] t=array[k]; array[k]=array[i]; array[i]=t;}} main() {int a[10],i; printf(“enter the arrayn”); for(i=0;i<10;i++) scanf(“%d”,&a[i]); sort(a,10); printf(“the sorted array:n”); for(i=0;i<10;i++) printf(“%d”,a[i]); printf(“n”); } 1.若有以下函数定义: int fun(){ static int k=0;return ++k;} 以下程序段运行后屏幕输出为(D)int i; for(i=1;i<=5 i++) fun();printf(“%d”,fun()); 第六次调用 A.0 B.C.5 D.6 自增自减运算符比关系运算符高级,自增自减运算符属于算术运算符 *p=&a(该星号只起标识作用,没有特殊意义,标识p为指针变量。表达式对指针变量附值) 定义指针变量p后,*p 中的星号为指针运算符,整个表达式表示指针变量所指向的变量 数组变量赋值:scanf(“%c”,a);注意区分他们的区别 但&a 和a都是地址 整型变量赋值:scanf(“%d”,&a); 语言文字运用练习题 1.下面语段中加点的词语,使用恰当的一项是() 近日网上流传着香港的一份要求填上“草菅人命”形容警方才能得分的中文科测验卷。该试卷一旦流传,就引发了各方的议论,各种言论甚嚣尘上。在一般人眼中,这份试题的引导性是不言而喻的,资深中文科教师张月卿就直言,该试卷有很强的既定立场,而且立场失之偏激。但也有教师反问:“假如试卷是要求学生赞扬警方、贬低示威者,大家又会否同意呢?”“占中”引发的问题仍在持续发酵。A.一旦 B.甚嚣尘上 C.不言而喻 D.偏激 2.下列句子中,没有语病的一句是() A.国际法庭因认定日本在南极海的“调查捕鲸”实质为“商业捕鲸”,判定其违反了国际公约,于3月31日颁布判决书,下令禁止日本船只在南极海停止以任何名义捕鲸。 B.近日,朱彦夫被中宣部评为全国首位“时代楷模”,但朱彦夫的先进事迹对于许多人了解得还远远不够。 C.湖南卫视明星亲子互动节目“爸爸去哪儿”自开播以来,众多粉丝除了关注五对父子的一举一动,也为节目组设置任务出谋划策。 D.毒品流向分散是我市毒品犯罪的一大特点。既有大量毒品从境外及外省市流入广州,又有相当数量的毒品从广州流向内地甚至境外。在市内,毒品犯罪呈现出从中心区域流向周边区域的特征。 阅读下面的文段,完成4~6题。 ①,烟台大学7位保洁员吃学生剩饭的照片蹿红网络。这些老人 ② 食用学生的剩菜剩饭,只是为了向莘莘学子传递“节俭是一种习惯”的理念。 其实,我们 ③ 是一个崇俭抑奢的民族。《左传》有言:“俭,德之共也;侈,恶之大也。”李商隐《咏史》诗曰:“历览前贤国与家,成由节俭败由奢。”然而,不知从何时起,奢靡之风逐渐抬头,浪费现象悄然流行。一些人以为宁剩毋缺才够档次,以为一饭千金才算有面子,于是个人消费竞相攀比、④ 奢华。太史公高呼:“一饱之需,何必八珍九鼎?七尺之躯,安用千门万户?”司马光也谆谆告诫:“取之有度,用之有节,则常足。” 中国是一个人口大国,如果人人厉行节约,13亿人积腋成裘、聚沙成塔,那将是多么巨大的财富?相反,浪费起来,又将是多么巨大的损失? 4.文中加点字的注音和画线词语的字形全都正确的一项是 A.蹿(cuàn)红 奢靡(mí)宁(nínɡ)剩毋缺 一饱之需 B.蹿(cuàn)红 奢靡(mǐ)宁(nínɡ)剩毋缺 八珍九鼎 C.蹿(cuān)红 奢靡(mí)宁(nìnɡ)剩毋缺 厉行节约 D.蹿(cuān)红 奢靡(mǐ)宁(nìnɡ)剩毋缺 积腋成裘 5.文中①②③④处依次填入词语,恰当的一项是 A.①日前 ②自愿 ③一直 ④追逐 10.下列各句中,没有语病的一项是 A.我们是有过《诗经》的民族,我们是有过诗意表达的民族。我们需要诗歌,需要意义,我们需要生活;我们不光需要面包,还需要玫瑰。 B.南浔区从人民大会堂捧回了联合国教科文组织非物质文化遗产名录项目证书,标志着南浔古老的蚕桑习俗文化正式跻身世界级文化殿堂。 C.教育在综合国力的形成中处于基础地位,国力的强弱越来越多地取决于劳动者素质的提高,取决于各类人才培养的质量与数量。 D.为了避免广大教师在我省高中第一轮课程改革实验过程中不会无头绪、无目标,市教育局组织人员搜集、整理了大量的可供借鉴的案例。 11.下列各句中,加点的词语运用正确的一项是 A.当它们形成了向日葵群体之时,便互相手拉着手,一齐勇敢地抬起头来了。这时你会发现那偌大一片向日葵林子,竟然没有一株瘦弱或是低矮的向日葵。B.《平凡的世界》的热播,令部分观众直呼“触动泪点”,不仅是因为剧中那不可磨灭的各种美好情感和奋斗精神,更是因为剧作中有一段与自己早年经历相似的历史。 C.小说忌讳主题鲜明,作家在作品中往往用自己独特的生活经验和个性的艺术手法隐讳地表达自己的思想情感,但又不是让我们读者欣赏时雾里看花,水中望月。D.屋外的天空一扫连日的阴雨绵绵,久 违的阳光,让连日来裹在雨衣中的杭城市民蠢蠢欲动,纷纷晒出了自己心仪的赏花骑游图。 12.下列各句中,没有语病的一项是 A.被誉为工业设计界的“诺贝尔奖”的金圆规奖于2015年首次迈向国际,对于一位工业设计师而言,拿到“金圆规奖”是其设计生涯的最高奖项。 B.对那场战争、对那段历史能否始终保持正确的认识,是改善和发展中日关系的关键所在,也是中日经贸关系良好发展的重要条件。 C.法律专家认为,“海淘”虽然属于买卖双方私事,但跨境消费的特殊性决定了消费者仅凭个人之力难以有效维权,需要政府和监管部门出面予以法律支持和保护。 D.“抢红包”已成为今年春节的新现象,亲朋好友以这种最新的方式互赠红包,其真正价值在于它所承载的美好希望,年味则在这种愿景的催化下愈发浓郁。 13.下列各句中,没有语病的一句是()(3分)A.美国东部时间2015年4月12日下午近三时左右,前美国国务卿希拉里竞选总干事向支持者发布邮件,公布希拉里将角逐民主党总统候选人的消息。 B.湖南隆平种业有限公司生产销售“两优0293”水稻品种,去年在安徽致使至少万亩农田减产绝收,农民损失巨大。专家鉴定为天气原因引发的稻瘟病所致。 C.去年5月,广东省国家安全机关破获的一起境外间谍网络策反中国人的案件显示,计算机网络泄密事件已占泄密总数的70%以上,计算机网络泄密已经严重危及国家安全。 D.细数当下的热门投资移民国家,英国投资移民在美国、加拿大、德国等国家中,成为了最受中国富人家庭的中小学生欢迎的海外留学目的地。 阅读下面文字,回答: 散文是文学殿堂中一种影响广泛、()受读者()睐的文体。古今中外的文学大师们,以其洞幽入微的观察力、超脱尘世的秉性、细腻激扬的情愫,凭借生花的妙笔,写下了无数 ①、()炙人口的散文名篇。散文 ②,不仅()歌自然,更穿透人生,解剖社会。但优秀的散文如漫天繁星,总会令人 ③,又唯恐落得沧海遗珠之憾。 14.下列汉字依次填入语段中括号内,字音字形全部正确的一组是 A.倍 青qīn 脍huì 呕 B.备 亲qīng 烩huì 呕 C.备 青qīng 脍kuài 讴 D.倍 亲qīn 烩kuài 讴 15.在上面语段横线处依次填入词语,最恰当的一组是 A.①斐然成章 ②字字珠玑 ③目不暇接 B.① 文采斐然 ②包罗万象 ③应接不暇 C.①文采斐然 ②五花八门 ③应接不暇 D.① 斐然成章 ②琳琅满目 ③目不暇接 16.下列各句中,没有语病的一项是 A.今年的春运大幕已经开启,而与往年不同的是,随着全国高铁网络基本形成,“高铁春运”悄然升温,不少旅客都选择乘坐高铁出门旅游或回家过年。 B.新丝绸之路经济带和海上丝绸之路等多边和双边项目的启动显示出,中国希望利用自身的经济和金融力量,扩大政治影响力和战略挑战。 C.湖南籍夫妇周作堂、蒙桂凤遭遇车祸,近亲属将其器官捐献,使6人重获新生,4人重见光明,这一善举延续的不仅是一个个家庭的希望和未来,更是一个个鲜活的生命。D.12月12日,湖南省靖州苗族侗族自治县举办首届“省际牛王争霸赛”,来自云南、广西、湖南、贵州等四省区的84头“牛魔王”轮番登场,上演了一场精彩的斗牛民俗大餐,吸引了湘黔桂周边近万名群众前来观战。 17.下列选项中的诗句填入《野望》一诗划横线处,顺序恰当的一项是 西山白雪三城戍,南浦清江万里桥。。。。 ①不堪人事日萧条 ②唯将迟暮供多病 ③天涯涕泪一身遥 ④跨马出郊时极目 ⑤海内风尘诸弟隔 ⑥未有涓埃答圣朝 A.②⑥⑤③④① B.④①⑤⑥②③ C.⑤⑥②③④① D.⑤③②⑥④①第二篇:C语言程序设计
第三篇:C 语言程序设计
第四篇:程序设计要点总结
第五篇:语言基础知识