C语言博客作业03--函数
这个作业属于哪个班级 | C语言--网络2011/2012 |
---|---|
这个作业的地址 | C博客作业00--函数 |
这个作业的目标 | 学习如何设计函数、c语言基本数据类型 |
姓名 | 骆梦钒 |
0.展示PTA总分(0----2)
截图展示本次题目集排名分数截图。PTA题目集至少完成2/3,否则倒扣-2分
1.本章学习总结(4分)
整理这两周学习主要知识点,并能对每个知识点介绍简单案例或语法。不要截图ppt,自己文字书写。知识点包含:
1.1 函数定义、调用、声明
1.函数声明
例:(最大公约数)
#include <stdio.h>
int gcd( int x, int y );//函数声明
int main()
{
int x, y;
scanf("%d %d", &x, &y);
printf("%d
", gcd(x, y));
return 0;
}
(1)一般格式
函数类型 函数名(参数表);
(2)注意:函数声明后面有‘;’,而函数定义时后面无‘;’
2.函数调用
(1)一般形式:
函数名(实际参数表);
(2)实际参数可以是常量、变量、和表达式,而形参必须是变量
(3)参数传递:
形参能接受参数的值,两者数量相同,类型尽量一致
程序运行到函数调用时,实参的值依次传给形参(单向传递)
#include <stdio.h>
double mypow( double x, int n );
int main()
{
double x;
int n;
scanf("%lf %d", &x, &n);
printf("%f
", mypow(x, n));//调用函数,返回result
return 0;
}
double mypow(double x, int n)
{
double result=1;
int i;
for (i = 1; i <= n; i++)
{
result *= x;
}
return result;
}
(4)return语句:
作用:一是结束函数的运行,二是带着运算结果(表达式的值)返回主调函数
return语句只能返回一个值
3.函数的定义
例:(最大公约数)
int gcd(int x, int y)//函数定义
{
int temp;
int result;
temp = x % y;
if (temp == 0)
result = y;
else
{
while (temp != 0)
{
x = y;
y = temp;
temp = x % y;
}
result = y;
}
return result;
}
(1)一般形式:
函数类型 函数名(形式参数表)
{
函数实现过程
}
(2)函数类型为void时不能省略,表示不返回结果,否则函数类型被默认定义为int
(3)函数类型和return的参数类型要相同
(4)注意:函数首部后面不能加分号
形参表中各个形参之间有‘,’分隔,每个形参前面的类型必须分别写明
总结
1:函数是先定义后使用的。
2:函数定义于主函数之外,分配有储存空间,独立于其他函数的形式。
3:函数的一般形式:
4:类型标识符函数名(形参表)———形参表可以为空,但括号不能省略
{
函数语句——函数的主体,可以为空,但花括号不能省略
}
例:int f(int x)——x为形参
形参只是一个占位符,标志着在形参出现的位置应该有一个什么类型的数据。
5:函数调用
函数名(实参表)——实参表与形参表相对应
实参可以是常量、变量,还可以是表达式,但如果实参中存在变量,在函数调用时,变量应是有确定值的。
6:函数程序的典型结构:
1) :预处理指令
符号常量定义
函数声明
2) :主函数
3) :函数定义
为了避免函数在定义前被调用,在调用前声明函数的原型。
类型标识符 函数名(形参表);——已分号结束
7:参数传递
类型名&引用名=变量名
定义引用时一定要将其初始化成引用某个变量
引用只能引用变量,不能引用常量和表达式
1.2 全局、局部变量、静态局部变量
1.全局变量
void func1()
{
//TODO:
}
float x,y; //全局变量
int func2()
{
//TODO:
}
int main()
{
//TODO:
return 0;
}
(1)定义:定义在函数外而不属于任何函数的变量
(2)作用范围:从定义开始到程序所在文件的结束(它对作用范围内的所有函数都起作用)
(3)一般情况下把全局变量定义在程序的最前面,即第一个函数的前面
2.局部变量
int f1(int a)
{
int b,c; //a,b,c仅在函数f1()内有效
return a+b+c;
}
int main()
{
int m,n; //m,n仅在函数main()内有效
return 0;
}
(1)定义:定义在函数内部的变量
(2)局部变量一般定义在函数或复合语句的开始处,标准c规定其不能定义在中间位置
(3)定义作用在复合语句中的局部变量,其有效作用范围被局限于复合语句内,一般用作小范围内的临时变量
(4)全局变量虽然可以用于多个函数之间的数据交流,但一般情况下,应尽量使用局部变量和函数参数
3.静态局部变量
(1)定义格式:static 类型名 变量表
(2)生存周期会持续到程序结束
(3)自动变量如果没有赋初值,其存储单元中将是随机值
而静态变量如果定义时没有赋初值,系统将自动赋0,并且赋初值只在函数第一次调用时起作用,以后调用都按前一次调用保留的值使用
(4)如果没有静态保存的要求,不建议使用静态变量
1.3 C数据类型及注意点
每个数据类型特点及其相关知识的扩展。如浮点误差、字符型数据输入问题等等
1.数据类型
1.整型
1.分类:
int
short[int]
long[int]
unsigned[int]
unsigned short[int]
unsigned long[int]
2.整型常量
1.表示:
(1)十进制:正负号+数字0~9
(2)八进制:正负号+数字0~7(首位数字为0)
(3)十六进制:正负号+数字09+英文af/A~F(首位数字前必须有前缀0x/0X)
2.整数类型
(1)根据整数后面的字母后缀判断类型,
(2)如果后面没有出现字母,就根据整型常量的值确定他的类型
2.字符型
1.字符型
1.字符具有数值特征
它不仅可以写成字符常量的形式,还可以用相应的ASCII码表示,即可以用整数来表示字符
还可以像整数一样参加运算
2.互换整型变量和字符型变量的定义和值时,整型数据的取值范围是有效的ASCII码
2.字符型常量
1.表示:单个字符用一对单引号及其所括起的字符来表示
例:‘0’是字符型常量,0是整型常量
2.转义字符:类似回车符、退格符等不能在屏幕上显示也无法从键盘输入的控制码只能通过转义字符表示
转义字符=‘’+一个字符或数字
虽然转义字符形式上由多个字符组成,但他是字符常量只代表一个字符
3.实型与实型常量
1.实型
1.又称为浮点型,分为单精度浮点型(float)和双精度浮点型(double)
区别:double型数据的精度高,取值范围大
2.实数在计算机中只能近似表示, 运算中也会产生误差,可通过在句尾加上0.000001消除误差
例
#include <stdio.h>
int main()
{
double fund,price;
int max;
scanf("%lf%lf",&fund,&price);
max=fund/price+0.000001;
printf("%d",max);
return 0;
}
3.在C语言程序的表达式或变量赋值运算中,有时会出现运算对象的数据不一致的情况。C语言允许任何标准数据类型之间的隐式转换。
2.实型常量
1.即实数也是浮点数,实型常量都是双精度浮点型
2.可以用十进制浮点表示法和科学计数法表示
浮点表示法:正负号+数字0~9+小数点
科学计数法:正负号+数字+字母e(E),e是指数标志(即后跟的数字为指数)
2.数据输入和输出
1.格式控制说明
1.输入输出形式
十进制 %d %ld %u %lu
八进制 %o %lo %o %lo
十六进制 %x %lx %x %lx
2.在输出格式控制说明中,可以加宽限定词,指定整型数据的输出宽度:%md
3.输入double型数据时,在格式控制说明中必须加限定词,即double型数据的输入格式控制说明必须用%lf或%le
2.字符型数据的输入和输出
统计字符
#include"stdio.h"
#include"string.h"
int main()
{
char a;
int i, letter, blank, digit, other;
letter = blank = digit = other = 0;
for(i = 0;i < 10;i++)
{
a = getchar();//输入字符
//scanf("%c", &a);
if((a >= 'a' && a <= 'z')||(a >= 'A' && a <= 'Z'))
{
letter++;
}
else if(a == ' ' || a == '
')
{
blank++;
}
else if(a >= '0' && a <= '9')
{
digit++;
}
else
{
other++;
}
}
printf("letter = %d, blank = %d, digit = %d, other = %d", letter, blank, digit, other);
return 0;
}
1.getchar()函数和putchar()函数只能处理单个字符的输入和输出
2.输入多个字符时,这些字符之间不能有间隔,输入输出字符时,字符两侧没有单引号
3.将小写字母转换为大写字母
1.4.表达式+运算符
1.算术表达式
1.算术运算符
1.分为单目运算符和双目运算符
单目运算符:++ -- +(正值)-(负值)
双目运算符:+ - * / %
2.自增运算符和自减运算符(常在for循环中使用)
(1)使变量的值增1和减1
(2)取变量的值作为表达式的值
(3)++n --n区别
(4)两种符的运算对象只能是变量,不能是常量或表达式
(5)慎用自增、自减运算
3.逻辑>算术>关系>逻辑>条件>赋值>逗号
2.赋值表达式
1.简单形式:
变量=表达式
一般形式:
变量 赋值运算符 表达式
2.复合赋值运算符
+= -= *= /= %=
3.关系表达式
1.关系表达式有 > >= < <= (优先级相同) == != (优先级相同) 前面四个优先级高于后两个优先级
关系运算符的优先级小于自述运算符,
关系运算符的优先级高于赋值运算符
如:
c>a+b 等效于 a>(a+b) (关系运算符的优先级<算术运算符的优先级)
a>bc 等效于 (a>b)c > <运算符优先级高于相等运算符
2.关系表达式:
a=3,b=2,c=1;
a>b==c
a>b为true 在c语言中,‘1’为真,‘0’为假
所以a>b=true=1==c 是真的,因为c也是1
int main()
{
int a=5>1;
printf("%d",a); //输出1 在c语言中,‘1’为真,‘0’为假
return 0;
}
4.逻辑表达式
1.逻辑运算符
注意:
这三个逻辑运算符的优先级各不相同。其中,运算符!只需要一个操作数,所以叫单目运算符,因为单目运算符的优先级比其他运算符高,所以表中!的优先级最高,其次是&&,再次是||。
2.逻辑表达式
例:判断是否为闰年
((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)/*带括号的写法*/
year % 4 == 0 && year % 100 != 0 || year % 400 == 0/*无括号写法*/
在C语言中,圆括号也是一种运算符,而且它的优先级永远是最高的。因此,如果表达式中的运算符较多,则宜用圆括号来确定表达式的计算顺序,这样可以避免使用默认的优先级。
注意:若含有逻辑运算符(&&和||)的表达式的值可由先计算的做操作数的值单独推导出出来,那么将不再计算有操作数的值
学习体会
1.学习C语言:编程,编程,再编程
2.自定义函数会使程序的结构或逻辑更为清晰,提高效率,在平时的练习中应多多使用
3.在定义函数名还有变量名时都要尽量详细(至少知道是什么含义,用来干什么的),不要随便取
4.参数个数越少越好,避免过多混淆
5.养成边写代码边写注释的习惯
6.记住函数的传递是单向的,单向的!
7.数据类型的知识很碎,还有一些混淆不清的概念问题等,平时要多注意看书,经常翻阅查看复习
8.多返回看以往做过的题,总结技巧
9.在涉及进制转换时一定要注意相关技巧(课件上也有)
(1)十进制转二进制
方法:十进制的数du除以2,然后取余数,直到最后的商为0为止,zhi然后dao余数从下到上取(这个就是二进制的数)
(2)二进制转十进制
方法:把二进制数按权展开、相加就是十进制数。
(3)十进制转八进制(类似十进制转二进制的方法)
方法:十进制的数一直除以8,直到商为0,然后倒着取余八进制的数。
(4)八进制转十进制(类似二进制转十进制的方法)
方法:把八进制的数按权展开,相加就是十进制数。
10.学会做笔记,课堂上不懂得问题要及时记下来避免忘了(经常这样 别忘了)
2.综合作业(6分):小学生口算表达式自动生成系统
2.1.模块流程图
请梳理各模块流程图,在编程前先画流程图再写代码。代码中有修改,流程图也跟着修改。二级模块,可以再画流程图展示。
2.2.函数功能及全局变量介绍
介绍你用到核心函数接口及全局变量。
函数功能:
生成随机运算符:Getsign(int grade)
生成表达式:Getexpression(int grade)
生成操作数:Getvalue(int grade)
2.2.1.全局变量
作用 变量名
随机运算符:char op
随机数:int value1, value2
2.2.2 菜单相关函数
文字介绍函数功能、思路,截图函数代码。
void OperateMenu();//游戏操作界面
void GradeOneMenu();//选择一年级口算题
void GradeTwoMenu();//二年级
void GradeThreeMenu();//三年级
2.2.2 出题相关函数
文字介绍函数功能、思路,截图函数代码。
生成随机运算符:Getsign(int grade)
生成表达式:Getexpression(int grade)
生成操作数:Getvalue(int grade)
2.3.运行结果截图,测试用例。
截图时候务必在图片中有文字说明该测试数据是什么,不能只有图片。测试数据有错也务必在图片上说明原因。
建议用动图 展示
测试二年级加法计算,答案正确
说明:出现答案负值的计算,应在一年级的菜单中判断被减数是否大于减数,如果大于,继续调用生成随机数直到减法结果出现正数
说明:判断了要出现刚好整除的式子,但是还是错误,应再考虑是否可将判断的循环语句放入函数中