340 likes | 487 Views
C 语言程序设计. 主讲教师:陈荣钦 QQ : 241881888. C 语言学习方式. 借助平台(请记录网址): http://acm.tzc.edu.cn QQ 群交流,教师和计算机专业同学解答 数学、给排水、材料请加入: 116137045 机械、土木请加入: 323434401. 考核方式. 平时: 20% ,考勤 + 平时练习情况 做题数 积分 上机: 30% ,实验、过关测试情况 循环过关测试 数组过关测试 期末: 50% ,卷面考查. 郑重声明. 系统有一套 代码抄袭检测系统 ,将严格审核投机取巧行为,包括: 拷贝他人代码
E N D
C语言程序设计 主讲教师:陈荣钦 QQ:241881888
C语言学习方式 • 借助平台(请记录网址): • http://acm.tzc.edu.cn • QQ群交流,教师和计算机专业同学解答 • 数学、给排水、材料请加入:116137045 • 机械、土木请加入:323434401
考核方式 • 平时:20%,考勤+平时练习情况 • 做题数 • 积分 • 上机:30%,实验、过关测试情况 • 循环过关测试 • 数组过关测试 • 期末:50%,卷面考查
郑重声明 • 系统有一套代码抄袭检测系统,将严格审核投机取巧行为,包括: • 拷贝他人代码 • 在比赛中拷贝自己的代码 • 检测不定时进行,见“活动->抄袭检测” • 若有抄袭,管理员或任课教师随意扣积分或平时成绩,见“活动->积分奖罚” 台院良好的学习氛围有你的功劳!有问题请QQ群交流
实验平台(简称TOJ)准备工作 • (1)注册用户:登录->用户注册,认真填写个人信息。 • (2)加入班级:排名->班级列表,找到相应班级+课程后,点击“加盟”,由任课教师审核。 • (3)审核通过后,退出系统重新登录后在用户名菜单下进入“实验”
第一章、概述 • 理解什么是程序 • 了解C语言 • 掌握C程序基本结构 • 学会在实验平台中做题
理解“程序” • 程序就是电脑能执行的一系列指令 • 计算机的一切操作都是由程序控制的,离开程序,计算机将一事无成
计算机语言 • 计算机语言:人和计算机沟通的媒介 • 机器语言:只有0和1 • 符号语言或汇编语言:只有单词和数字 • 如Add AL,10H 表示 AL = AL + 10H • 高级语言:接近自然语言和数学符号。 • C语言就是高级语言
C语言的发展及其特点 • 1972年出现至今一直在语言榜前三名。 • 最简洁适合入门的语言。 • 代码高效,最接近底层硬件,最适合开发系统软件,如: • Windows、Unix、Linux等操作系统。 • 嵌入式、单片机、工控设备开发。 • 游戏、数据处理等。
第一个简单的任务 • 整数求和(TOJ 1001) • 查看题目:题库->题目列表 题目描述: 求两个整数之和。 输入: 输入数据只包括两个整数A和B。 输出: 两个整数的和。 样例输入: 1 2 样例输出: 3
解题流程——第1步 • 打开编程软件编写代码 • VC(实验手册1.2节) • CFree(实验手册1.3节) • Code::Blocks(实验手册1.4节) #include <stdio.h> int main() { int a,b; scanf("%d %d",&a, &b); printf("%d\n",a+b); return 0; }
逐条语句执行 1.scanf和printf是系统函数,在这个文件里,包含它 2. Main是主函数,程序运行入口 #include <stdio.h> int main() { int a,b; scanf("%d %d",&a, &b); printf("%d\n",a+b); return 0; } 3. 定义两个整型变量,存在内存里 4. 从键盘输入2个整数,空格隔开 5. 结果输出到显示器控制台中 6. 终于运行完了,退出main函数 代码简析
本机编译、运行、测试 • 写好的代码先在自己电脑上运行测试,以CFree为例。 • 运行程序 • 若能出现控制台界面,表示无编译错误,否则检查程序语法 • 输入测试数据,检查是否正确
解题流程——第2步 • 将代码提交到实验系统中: • 1、点击题目的下方的“提交”链接 • 2、将刚才写好的代码粘贴到文本框中 • 3、若返回的结果是Accepted,则表示成功 温馨提示:若碰到问题,最好QQ群交流
常见错误解释 • 本机测试没问题,交到系统里Wrong Answer • 解释:实验平台后台有大量的测试数据,因此在本机正确并不代表提交也能正确。 • 解决办法: • 自己做大量的测试,多找错误数据 • QQ群请教下题目需要注意的问题。
调试技巧 • 前提:你已经找到了错误数据,可是却不知道哪个语句出错。 • 调试方法(详见实验手册1.2.2或1.3.2或1.4.2),以CFree为例: • (1)设置断点(快捷键F10); • (2)启动调试(快捷键F9); • (3)单步跟踪(快捷键F8); • (4)查看变量,检查是否正确;
调试技巧——步骤1 1 #include <stdio.h> 2 int main() 3 { 4 int a, b, c; 5 double average; 6 scanf("%d%d%d", &a, &b, &c); 7 average = (a+b+c)/3; 8 printf("%.2f\n", average); 9 return 0; 10 } 找到了错误数据
调试技巧——步骤2 按F10功能键在scanf语句后,即输入3个整数后设置了一个断点,随后按F9功能键启动调试
调试技巧——步骤3 先在控制台输入我们测到的错误数据: 1 3 4 随后程序在“断点”处停了下来,蓝色部分的语句是准备运行但还没有运行的语句。
调试技巧——步骤4 按F8将运行一个语句,图为按了两次F8的结果。我们发现数据错误了,average的结果应该为2.33...。
调试技巧——步骤5 鼠标选中相应表达式悬停片刻,即出现了计算结果,我们发现了错误的语句 环境(Context)窗口也显示了相关的变量信息 或添加监视
调试技巧——步骤6 我们已经找到了错误的语句,结束调试,并将错误语句修改成: average = (a+b+c)/3.0; 因为在C语言里,两个整数相除后只保留整数部分。而改成3.0后,结果将保留为double型小数。 继续运行测试程序吧!
常见错误解释 • 输入和输出的格式与题目要一致 #include <stdio.h> int main() { int a,b; scanf("%d,%d",&a, &b); printf("%d \n",a+b); return 0; } 测试1 测试2 多了空格 多了逗号
常见错误解释 • 不要有多余的输出文字 #include <stdio.h> int main() { int a,b; printf("please input a,b\n"); scanf("%d %d",&a, &b); printf(“sum: %d\n",a+b); return 0; } printf语句里的都是输出,因此可能与题目不符,实验系统会报:Wrong Answer
再来一个简单任务 • Hello World(TOJ 1452) 题目描述: 输出Hello, World! 代码: #include<stdio.h> int main() { printf(“Hello, World!\n”);//逗号后有空格,W大写 return 0; }
代码中可以有注释语句 • //:单行注释 • 可单独占一行 • 可出现在一行中其他内容的右侧 • /*……*/:块式注释 • 可包含多行 注释语句只用来帮助理解程序,不会运行
更复杂的C语言代码结构 自己编写的max函数,用来求两个数的最大值 #include<stdio.h> int max(int x, int y){//函数,第7章 if(x>y)//选择结构,第4章 return x; else return y; } int main() { int a, b, m; scanf("%d %d", &a, &b); m = max(a, b); printf("%d\n", m); return 0; } 调用max函数,传递a给x,b给y,返回的结果给m
单组数据or多组数据 • 实验系统中的题目有些是单组数据,有些是多组数据,会在输入描述中给出。 • 例: • TOJ 1001为单组数据 • TOJ 1076为多组数据
如何处理多组数据 • TOJ 1076, 每组两个数,以EOF结尾 #include<stdio.h> int main() { int a,b; while(scanf(“%d%d”,&a,&b)!=EOF)//循环第5章 { printf("%d\n",a+b); } return 0; } Scanf函数正常情况下返回读到的变量个数,不正常时返回-1,EOF的值也是-1
如何处理多组数据 • TOJ 1077, 已知测试数据组数 #include<stdio.h> int main() { int a, b, n; scanf("%d", &n); while(n--) { scanf("%d %d", &a, &b); printf("%d\n", a + b); } return 0; } n不断减1,当n==0时,循环就结束了
如何处理多组数据 • TOJ 1078, 以0 0结束。 a或b有一个不等于0,就继续循环 #include<stdio.h> int main() { int a,b; while(scanf("%d %d", &a, &b), a || b) { printf("%d\n", a + b); } return 0; }
如何处理特殊的输出 • TOJ 1079, 两组数据之间有空行。 没有空行 #include<stdio.h> int main() { int a,b,flag=0; while(scanf("%d%d",&a,&b),a||b) { if(flag)printf(“\n”); printf("%d\n",a+b); flag = 1; } return 0; } 3 7 11 空行 空行 没有空行 空行数比数据组数少1个。flag一开始为0,因此第一组数据前无空行,后面改为1,因此每组数据之前都有空行
练习 • 1001 整数求和 • 1452 Hello World • 1467 C语言实验题——两个数最大 • 1002 语言实验题——两个数比较 • 1165 C语言实验题——三个整数 • 1076 输入入门(1) • 1077 输入入门(2) • 1078 输入入门(3) • 1079 输出入门
实验任务 • 查看方法: • 进入你的用户名菜单->实验 • 实验需要完成: • 指定的实验题目列表 • 实验报告,需认真填写: • 实验分析 • 实验步骤 • 实验总结