《北京大学信息科学技术学院2010年》由会员分享,可在线阅读,更多相关《北京大学信息科学技术学院2010年(102页珍藏版)》请在金锄头文库上搜索。
1、北京大学 信息科学技术学院 2010年,C语言高级编程(第二部分) 数组与指针,编写程序,实现下述功能: 1, 从控制台输入 两个 年 月 日 2,调用 DiJiTian函数计算这两个日期之间相隔几天 3,向控制台输出结果,边界定义:两个日期相隔的天数如果两个日期相同,则相隔为0天如果两个日期相相邻,则相隔为1天,求解思路,Case 1: (两个日期的年份相等) step1: days = DiJiTian(year2, m2, d2) - DiJiTian(year1, m1, d1); Case 2:(两个年份不等) step1: 计算 开始日期 是该年的第几天 days1,则当年所剩的天
2、数为: ldays1 = 全年天数-days1 计算 终止日期 是该年的第几天 days2; step2: 计算 两个年份之间其他年份的总天数ydays; step3: days = ldays1 + ydays + days2;,int main()int year1, m1, d1, days1, ldays1;int year2, m2, d2, days2;int ydays, days;scanf(“%d %d %d”, ,上机中的 常见问题和错误,关于输入和输出,标准输入输出的使用:scanf():用于从键盘中输入数据,付给变量printf():将希望输出的内容显示在屏幕上(一行一
3、行地显示),先定义变量,再利用scanf()函数给该变量输入相应的数据,最后才能使用该变量。 int a, b, c; scanf(“%d%d”, ,printf()函数可以将变量的内容以及其他的提示信息输出导屏幕上。printf(“n%d + %d = %dn”, a, b, c);,如果a 为1,b为4,则输出为:1 + 4 = 5 ,double r; scanf(“%lf”, ,关于程序的执行顺序,下面这段程序的执行结果是什么? 假设输入的 r 为 1 #include int main() float V, L, r;V = 4 * 3.14f * r * r * r;L = 2 *
4、 3.14f * r;scanf(“%f“, ,不同类型数据的混合运算,整型数据和浮点数据的混合运算int a, b, c, d; double mid, r; mid =1/2*(a+b+c+d); /mid = ? r = 75/100*7.5; /r = ? r = 0.6*(2/3); /r = ?,表达式问题,运算符“”和“” 这是两个完全不同的运算符,前者是赋值,后者是比较 if(x=2) if(x= =2) 字符常量的表达x = a; (错误,此事a被当作变量名) x = a; (正确) if(x=a) if(x=a) “自创”表达式 if( 11 & a0) if(x0)x =
5、 x + 4; x = x/4; x = x + 4;x = x/4; 乱加分号, 比如在if、for 和while后加分号 if( x0 ); for(x=1;x0); /此时形成空语句 ,一种输出格式的控制,要求输出一组数,中间用逗号间隔 很多同学不知道怎么能做到最后一个数后面不跟逗号 先打印第一个元素,printf(“%d”, a0); 再用for循环打印其他元素, printf(“,%d”, ai);int i, a10; printf(“%d”, a0); for (i=1; i 0; num /= 10)if (num%10 = 7)return 0;return 1;,#incl
6、ude int yu7WuGuan(int);int main()int num, result = 0;scanf(“%d“, ,多维数组,一维数组 二维数组 ,一维数组,int sz10;,必须是一个常量,二维数组,定义:1. 也是一个一维数组,但是2. 其每个数组元素本身,又是一个一维数组即是:一维数组的数组相应地,一个n维数组:1. 也是一个一维数组,但是2. 其每个数组元素本身,又是一个n-1维数组,二维数组的形式,int sz54;,数组的类型,数组名,第1维 具有5个元素 的一维数组,第2维 每个元素又是一个 具有4个元素 的一维数组,二维数组 可以看作是 一个 由 变量 构成的
7、 矩阵,int sz54;,列的编号,行的编号,变量的行数,变量的列数,二维数组 中 变量 的 编号,0,1,2,3,0,1,2,3,4,二维数组中变量 的 编号,由:行的编号,和列的编号两部分组成。,int sz54;,如何访问 二维数组 中 的 变量,0,1,2,3,0,1,2,3,4,int sz54;,sz23;,数组名,行的编号,列的编号,二维数组 变量赋值 的 一种特殊方式,声明时赋值,0,1,2,3,0,1,2,3,4,int sz54;,int sz54 = 0, 1, 2, 3,4, 5, 6, 7,8, 9, 0, 1,2, 3, 4, 5,6, 7, 8, 9 ;,二维数
8、组 变量赋值 的 一种特殊方式,声明时赋值,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,0,1,2,3,4,int sz54;,int sz54 = 0, 1, 2, 3,4, 5, 6, 7,8, 9, 0, 1,2, 3, 4, 5,6, 7, 8, 9 ;,第0行变量的值,第1行变量的值,第2行变量的值,第3行变量的值,第4行变量的值,二维数组 的 遍历,通过 两层 循环结构,正向 按行 遍历,#define ROW 5 #define COL 4 int szROWCOL;,访问数组元素for(int row = 0; row ROW
9、; row+)for(int col = 0; col COL; col+) szrowcol ,正向 按行 遍历,#define ROW 5 #define COL 4 int szROWCOL;,输出数组元素for(int row = 0; row ROW; row+)for(int col = 0; col COL; col+)printf(“%d ”, szrowcol);,正向 按列 遍历,#define ROW 5 #define COL 4 int szROWCOL;,for(int col = 0; col COL; col+)for(int row = 0; row ROW;
10、 row+) szrowcol ,请一位同学上台,在黑板上写一段代码, 实现下述功能:按照下图所示的顺序,遍历数组 int szROWCOL,二维数组 应用举例,问题描述,某个年级有180名学生; 在某一个学期,这个年级开了8门必修课; 期末考试结束后,每个学生每门课程的成绩出来了; 教务老师 请我们编写一段程序: 计算每个学生的平均成绩; 计算每门课程的平均成绩。,编程的基本思路,step1: 定义一个180行8列的二维数组 用于存放学生的课程成绩 step2: 从控制台录入学生的课程成绩 step3: 计算每个学生的平均成绩,并输出到控制台 step4: 计算每门课程的平均成绩,并输出到控
11、制台,0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,8,179,课程编号,学生编号,double scores1808,#define STUDENT_NUM 180 /学生人数 #define COURSE_NUM 8 /课程门数 int main( ) double scoresSTUDENT_NUMCOURSE_NUM; /成绩数组 int i, k; /循环变量for (i=0; iSTUDENT_NUM; i+) /录入学生成绩for (k=0; kCOURSE_NUM; k+) scanf(“%lf“, ,三维数组,四维数组,.,1. 定义和使用方式与二维数组类似 2. 很少用到,一维数组在内存中的布局,int score5;,char cards4;,访问数组元素时不要越界!,int number10; 对于数组number,合法的访问范围是: number0, number1, , number9 当引用number10时,对于C语言来说,这是合法的,但是它所引用的却是number数组之外的其他内存区域,其内的值是未知的;如果对其进行修改的话,还可能影响整个程序的正确性。,