第一篇:AVR单片机C语言高级程序设计(共)
AVR单片机C语言高级程序设计
前言..................................................................................................................................................2 第1章 概述...................................................................................................................................3
1.1提高编制单片机应用程序效率最好的办法是采用C语言编程.....................................4 1.2 C语言具有突出的优点......................................................................................................5 1.3 AVR单片机的C编译器简介............................................................................................6 第二章AVR单片机简介及主要特性...............................................................................................6
2.1 AVR单片机简介及主要特性..........................................................................................6 2.2 学习开发AVR单片机用到的实验工具及器材.............................................................8 第3章 AVR单片机开发软件的安装及初步使用......................................................................14
3.1 ICCAVR6.31A C语言编译器安装...............................................................................14 3.2 AVR Studio集成开发环境安装.....................................................................................18 3.3 PonyProg2000下载软件安装.......................................................................................18 3.4 我们的第一个AVR入门程序.......................................................................................19 第4章 AVR DEMO单片机综合试验板原理介绍及使用..............................................................36
4.1 AVR DEMO单片机综合试验板........................................................................................36 4.2ATMEAG16L单片机的主要特点与内部组成...................................................................38 4.3使用JTAGICE仿真器(JTAG ICE)调试AVR DEMO单片机综合试验板......................39
前言
世界进入21世纪后,由于电子技术及计算机技术的迅猛发展,新型电子产品的更新换代速度越来越快。以单片机为核心构成的智能化产品具有体积小、功能强、应用面广等优点,目前正以前所未见的速度取代着传统电子线路构成的经典系统,蚕食着传统数字电路与模拟电路固有的领地。
从前,汇编语言是单片机工程师进行软件开发的唯一选择,但汇编语言程序的可读性和可移植性较差,采用汇编语言编写单片机应用系统程序的周期长,而且调试和排错也比较困难。许多读者都发现,采用汇编语言设计一个大型复杂程序时,可读性较困难,往往隔一段时间再看,又要花脑力从头再来。并且不同类型的单片机,必须采用不同的汇编语言来编写,这是因为汇编语言完全依赖于单片机硬件。这样,对开发者而言,如果由于项目的变化而经常变更单片机类型,其开发的难度是可想而知的。因为对于学习一种单片机汇编语言开发,总少不了学习、探索、实践、进步这样一个过程,这个过程少则半年,多则1~2年,等你学完后再搞出产品,也许商机已消失。随着社会竞争的日益激烈,开发效率已成为商战致胜的最重要法宝之一。
为了提高编制单片机系统和应用程序的效率,改善程序的可读性和可移植性,最好的办法是采用高级语言编程。目前,C语言逐渐成为国内外开发单片机的主流语言。
C语言是一种通用的编译型结构化计算机程序设计语言,在国际上十分流行,它兼顾了多种高级语言的特点,并具备汇编语言的功能。它支持当前程序设计中广泛采用的由顶向下的结构化程序设计技术。一般的高级语言难以实现汇编语言对于计算机硬件直接进行操作(如对内存地址的操作、移位操作等)的功能,而C语言既具有一般高级语言的特点,又能直接对计算机的硬件进行操作。C语言有功能丰富的库函数、运算速度快、编译效率高,并且采用C语言编写的程序能够很容易地在不同类型的计算机之间进行移植。因此,C语言的应用范围越来越广泛,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。对汇编语言掌握到只要可以读懂程序,在时间要求比较严格的模块中进行程序的优化即可。采用C语言不必对单片机和硬件接口的结构有很深入的了解,编译器可以自动完成变量的存贮单元的分配,编程者就可以专注于应用软件部分的设计,大大加快了软件的开发速度。统计资料表明,不同单片机的C语言编译程序80%的代码是公共的,采用C语言可以很容易地进行单片机的程序移植工作,有利于产品中的单片机重新选型。C语言的编译效率也很高,对于同一个问题,用C语言编写的程序生成代码的效率仅比用汇编语言编写的程序低10%~20%,由于现在片上ROM(或FLASH ROM)空间做到32/64K字节(或更大)的单片机比比皆是,因此代码效率所差的10%~20%已经不是重要问题。至于对开发速度、软件质量、结构严谨、程序坚固等方面进行综合评述的话,则C语言的完美绝非是汇编语言编程所能比拟的。本书以初学者为对象,从零开始,循序渐进地讲解当前最热门的AVR单片机的C语言高级程序设计,在介绍AVR单片机的各单元部分基本特性的同时,使用入门难度浅、程序长度短且又能立竿见影的初级实例,详细介绍了如何使用ATmega16L的片上资源,帮助初学者快速掌握AVR单片机的高效设计。最后3章详细介绍了3个以AVR单片机为核心的实际产品的软硬件设计。
随书所附的光盘中提供了本书的所有软件设计程序文件,读者朋友可参考。本书的编写工作得到了中国电力出版社大力支持,出版社的资深编辑刘炽老师做了大量耐心细致的工作,使得本书得以顺利完成,在此表示衷心感谢。由于作者水平有限,必定还存在不少缺点或漏洞,诚挚欢迎广大读者提出意见并不吝赐教。
第1章 概述
自从笔者出版了《手把手教你学单片机》(北京航空航天大学出版社出版)一书后,由于教学方式新颖独特,入门难度明显降低,结合边学边练的实训模式,很快有一大批读者入了单片机这扇门。据不完全统计,全国各地(包括港澳台地区)跟着《手把手教你学单片机》学习的读者超过30万名,其中不少读者已取得了丰硕的成果。有的读者给笔者来电说研制的“包装线控制器”已稳定运行数月,还有的读者利用单片机做“霓虹灯程序控制器”并投放市场,„„等等。总之,《手把手教你学单片机》使不少读者从传统的电子技术领域步入了微型计算机领域,进入了一个暂新的天地。
《手把手教你学单片机》一书是以汇编语言为主进行讲解实验的。所谓汇编语言就是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。汇编语言的主要优点是占用资源少、程序执行效率高。作为初学者必须基本掌握汇编语言的设计方法,因为汇编语言直接操作计算机的硬件,学习汇编语言对于了解单片机的硬件构造是有帮助的。
从前,汇编语言是单片机工程师进行软件开发的唯一选择,但汇编语言程序的可读性和可移植性较差,采用汇编语言编写单片机应用系统程序的周期长,而且调试和排错也比较困难。许多读者都发现,采用汇编语言设计一个大型复杂程序时,可读性较困难,往往隔一段时间再看,又要花脑力从头再来。更为重要的是,随着社会竞争的日益激烈,开发效率已成为商战致胜的最重要法宝之一。大家知道,不同类型内核的单片机,其指令系统是不一样的,因此用来编写程序的汇编语言也是不一样的,这样就产生了很严重的问题。例如:我们原来是学51系列单片机的,也做过许多产品,创造出一定的经济效益。但是,忽然有一天,有客户要求用AVR单片机开发一款产品,其利益回报也相当不错,但是你怎么办呢?重新开始学AVR的汇编语言?!等到学好学熟起码要半年(有些人等到会熟练开发产品可能要一年以上的时间),客户会等不及,等半年后也许商机已消失。这只是其中的一个难题,因为现在新型的单片机层出不穷,如果你的一些客户经常拿不同的单片机要你开发设计,那你怎么办?要较好地解决这些问题,你只能采用高级语言编程了。目前在单片机中,C语言是首选的高级开发语言。
1.1提高编制单片机应用程序效率最好的办法是采用C语言编程
为了提高编制计算机系统和应用程序的效率,改善程序的可读性和可移植性,最好的办法是采用高级语言编程。目前,C语言逐渐成为国内外开发单片机的主流语言。
C语言是一种通用的编译型结构化计算机程序设计语言,在国际上十分流行,它兼顾了多种高级语言的特点,并具备汇编语言的功能。它支持当前程序设计中广泛采用的由顶向下的结构化程序设计技术。一般的高级语言难以实现汇编语言对于计算机硬件直接进行操作(如对内存地址的操作、移位操作等)的功能,而C语言既具有一般高级语言的特点,又能直接对计算机的硬件进行操作。C语言有功能丰富的库函数、运算速度快、编译效率高,并且采用C语言编写的程序能够很容易地在不同类型的计算机之间进行移植。因此,C语言的应用范围越来越广泛。
用C语言来编写目标系统软件,会大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完备的系统。因此,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。对汇编语言掌握到只要可以读懂程序,在时间要求比较严格的模块中进行程序的优化即可。采用C语言进行设计也不必对单片机和硬件接口的结构有很深入的了解,编译器可以自动完成变量存贮单元的分配,编程者就可以专注于应用软件部分的设计,大大加快了软件的开发速度。采用C语言可以很容易地进行单片机的程序移植工作,有利于产品中的单片机重新选型。
C语言的模块化程序结构特点,可以使程序模块大家共享,不断丰富。C语言可读性的特点,更容易使大家可以借鉴前人的开发经验,提高自己的软件设计水平。采用C语言,可针对单片机常用的接口芯片编制通用的驱动函数,可针对常用的功能模块、算法等编制相应的函数,这些函数经过归纳整理可形成专家库函数,供广大的工程技术人员和单片机爱好者使用完善,这样可大大提高国内单片机软件设计水平。
过去长时间困扰人们的“高级语言产生代码太长,运行速度太慢不适合单片机使用”的致命缺点已被大幅度地克服。目前,AVR系列单片机的C语言编译代码长度,已超过中等程序员的水平。而且,AVR系列单片机片上SRAM、FLASH空间都很大、运行速度很快,代码效率所差的10%~20%已经不是什么重要问题。关于速度优化的问题,只要有好的仿真器的帮助,用人工优化关键代码就是很简单的事了。至于谈到开发速度、软件质量、结构严谨、程序坚固等方面的话,则C语言的完美绝非是汇编语言编程所能比拟的。
1.2 C语言具有突出的优点
1.语言简洁,使用方便灵活
C语言是现有程序设计语言中规模最小的语言之一,而小的语言体系往往能设计出较好的程序。C语言的关键字很少,ANSI C标准一共只有32个关键字,9种控制语句,压缩了一切不必要的成份。C语言的书写形式比较自由,表达方法简洁,使用一些简单的方法就可以构造出相当复杂的数据类型和程序结构。
2.可移植性好
用过汇编语言的读者都知道,即使是功能完全相同的一种程序,对于不同的单片机,必须采用不同的汇编语言来编写。这是因为汇编语言完全依赖于单片机硬件。而现代社会中新器件的更新换代速度非常快,也许我们每年都要跟新的单片机打交道。如果每接触一种新的单片机就要学习一次新的汇编语言,那么也许我们将一事无成,因为每学一种新的汇编语言,少则几月,多则上年,那么我们还有多少时间真正用于产品开发呢?
C语言是通过编译来得到可执行代码的,统计资料表明,不同机器上的C语言编译程序80%的代码是公共的,C语言的编译程序便于移植,从而使在一种单片机上使用的C语言程序,可以不加修改或稍加修改即可方便地移植到另一种结构类型的单片机上去。这大大增强了我们使用各种单片机进行产品开发的能力。
3.表达能力强
C语言具有丰富的数据结构类型,可以根据需要采用整型、实型、字符型、数组类型、指针类型、结构类型、联合类型、枚举类型等多种数据类型来实现各种复杂数据结构的运算。C语言还具有多种运算符,灵活使用各种运算符可以实现其他高级语言难以实现的运算。
4.表达方式灵活
利用C语言提供的多种运算符,可以组成各种表达式,还可采用多种方法来获得表达式的值,从而使用户在程序设计中具有更大的灵活性。C语言的语法规则不太严格,程序设计的自由度比较大,程序的书写格式自由灵活。程序主要用小写字母来编写,而小写字母是比较容易阅读的,这些充分体现了C语言灵活、方便和实用的特点。
5.可进行结构化程序设计
C语言是以函数作为程序设计的基本单位的,C 1.3 AVR单片机的C编译器简介
目前世界上几乎所有系列的单片机都支持C语言开发,开发AVR单片机的C编译器主要有:IAR Embedded Workbench(简称IAR)、Codevision AVR(简称CAVR)、Imagecraft C Compiler(简称ICC)、GNU C For AVR(简称GCCAVR)等。IAR是瑞典IAR SYSTEMS公司开发的AVR单片机集成开发环境(IDE),包含嵌入式编译器、汇编器、连接定位器、库管理器、项目管理及调试器等。其特点是编译效率高、功能齐全,但价格昂贵。
CAVR 也是一个开发AVR单片机的集成开发环境,其界面友好,很容易上手。它带有一个叫Codewizard的代码生成器,可生成外围器件的相应初始化代码,另外,它还提供了很多常用的器件库代码,如:LCD、UART、SPI、实时时钟、温度传感器等。它的价格适中。
ICC是Imagecraft公司开发的使用标准C语言的AVR单片机集成开发环境,它有一个Application Wizard的代码生成器, 也可生成外围器件的初始化代码。其价格适中。
GCCAVR是一个公开源代码的自由软件,因此使用上时不必考虑价格因素,其缺点是没有集成开发环境(IDE),使用时麻烦一些。
本书中,我们使用ICC集成开发环境进行学习开发,ICC集成开发环境软件能够产生形式简洁、效率较高的程序代码,如果程序较大时在代码质量上可以与汇编语言程序相媲美。
第二章AVR单片机简介及主要特性
2.1 AVR单片机简介及主要特性
AVR单片机是ATMEL公司研发的增强型内置Flash的RISC(Reduced Instruction Set CPU)精简指令集高速8位单片机,设计时吸取了80C51及PIC单片机的优点,具备单时钟周期执行一条指令的能力,运行速度高达1Mips/MHz。AVR单片机可以广泛应用于计算机外部设备、工业实时控制、仪器仪表、通讯设备、家用电器等各个领域。
AVR单片机硬件结构采取8位机与16位机的折中策略,即采用局部寄存器存堆(32个寄存器文件)和单体高速输入/输出的方案(即输入捕获寄存器、输出比较匹配寄存器及相应控制逻辑),提高了指令执行速度,克服了瓶颈现象,增强了功能;同时又减少了对外设管理的开销,相对简化了硬件结构,降低了成本。AVR单片机在软/硬件开销、速度、性能和成本诸多方面取得了优化平衡,是一种高性价比的单片机。其主要特性如下:
1.内嵌高质量的Flash程序存储器,可反复擦写,支持ISP和IAP,便于产品的调试、开发、生产、更新。内嵌长寿命的EEPROM可长期保存关键数据,避免断电丢失。片内具有大容量的RAM,有效支持使用高级语言开发系统程序。2.高速度、低功耗,具有SLEEP(省电休眠)功能。每一指令执行速度可达50ns(20MHz),而耗电则在1mA~2.5mA之间(典型功耗,WDT 关闭时为100nA),AVR运用Harvard结构概念(具有预取指令功能),即对程序存储和数据带有不同的存储器和总线当执行某一指令时,下一指令被预先从程序存储器中取出, 这使得指令可以在每一个时钟周期内被执行。AVR单片机可宽电压运行(2.7~5.5V),抗干扰能力强,可降低一般8位机中的软件抗干扰设计工作量和硬件的使用量。
3.AVR单片机的I/O线全部带可设置的上拉电阻,并行I/O 口输入输出特性与PIC 的HI/LOW输出及三态高阻抗HI-Z 输入类同外,也可设定类同80C51系列内部拉高电阻作输入端的功能,可单独设定为输入/输出、可设定(初始)高阻输入。使得I/O口资源灵活、功能强大、可充分利用。AVR的I/O 口是真正的I/O 口, 能正确反映I/O 口的输入/输出真实情况。
4.AVR单片机片内具备多种独立的时钟分频器,分别供URAT、IIC、SPI使用。其中与8/16位定时器配合的具有多达10 位的预分频器,可通过软件设定分频系数提供多种档次的定时时间。AVR单片机中的定时器/计数器(单)可双向计数形成三角波,再与输出比较匹配寄存器配合,生成占空比可变、频率可变、相位可变方波的脉宽调制输出PWM,令人耳目一新。
5.工业级产品,具有大电流10~20mA 或40mA(单一输出),可直接驱动SSR 或继电器。内置的看门狗定时器(WDT)用于防止程序跑飞,提高产品的抗干扰能力。
6.超功能精简指令。具有32 个通用工作寄存器(相当于80C51单片机中的32个累加器),克服了单一累加器在数据处理时造成的瓶颈现象。
7.AVR单片机内有模拟比较器,I/O 口可作A/D 转换用, 可组成廉价的A/D 转换器。
8.像80C51一样,AVR有多个固定中断向量入口地址,因此可快速响应中断,而不会像PIC一样所有中断都在同一向量地址,需要以程序判别后才可响应。9.AVR单片机有自动上电复位电路、独立的看门狗电路、低电压检测电路BOD,多个复位源(自动上下电复位、外部复位、看门狗复位、BOD复位),可设置的启动后延时运行程序,增强了系统的可靠性。
10.有串行异步通讯UART,不占用定时器和SPI 传输功能,因其速度高,故可以工作在一般标准整数频率,而波特率可达576K。11.有多通道10 位A/D转换器及实时时钟RTC。
AVR单片机技术表现出单片机集多种器件(包括FLASH程序存储器、看门狗、EEPROM、同/异步串行口、TWI、SPI、A/D模数转换器、定时器/计数器等)和多种功能(增强可靠性的复位系统、降低功耗抗干扰的休眠模式、品种多门类全的中断系统、具输入捕获和比较匹配输出等多样化功能的定时器/计数器、具替换功能的I/O端口„„)于一身,充分体现了现代单片机技术向“片上系统SoC”过渡及发展的方向。
2.2 学习开发AVR单片机用到的实验工具及器材
学习一种新的单片机技术,实验与实践是必不可少的,否则只能是纸上谈兵。这里我们使用以下的器材进行AVR单片机的C语言设计。1.ImageCraft公司的ICCAVR6.31A C语言编译器。2.Atmel公司的AVR Studio集成开发环境。3.PonyProg2000下载软件。4.AVR DEMO单片机综合试验板。5.AVR单片机JTAG仿真器。6.并口下载器。
7.5V高稳定专用稳压电源。
8.TOP2004多功能USB编程器(可选购)。9.一台奔腾级及以上的家用电脑(PC机)。下面简介一下这些实验工具及器材。
2.2 学习开发AVR单片机用到的实验工具及器材
学习一种新的单片机技术,实验与实践是必不可少的,否则只能是纸上谈兵。这里我们使用以下的器材进行AVR单片机的C语言设计。1.ImageCraft公司的ICCAVR6.31A C语言编译器。2.Atmel公司的AVR Studio集成开发环境。3.PonyProg2000下载软件。4.AVR DEMO单片机综合试验板。5.AVR单片机JTAG仿真器。6.并口下载器。
7.5V高稳定专用稳压电源。
8.TOP2004多功能USB编程器(可选购)。9.一台奔腾级及以上的家用电脑(PC机)。下面简介一下这些实验工具及器材。2.2.1 ICCAVR6.31A C语言编译器 ICCAVR6.31A 是ImageCraft公司开发的用于AVR单片机的C语言编译器,是一个综合了编辑器和工程管理器的纯32位集成开发环境(IDE)。由于ICCAVR功能强大,使用简单方便,具有良好的技术支持且价格合适,故得到了广泛的应用。图2-1 为ICCAVR的工作界面。
图2-1 ICCAVR的工作界面
2.2.2 AVR Studio集成开发环境
AVR Studio是一个Atmel公司开发的集项目管理、程序汇编、程序调试、程序下载、JTAG仿真等功能于一体的集成开发环境。但AVR Studio不支持C语言编译,因此当我们用C语言开发AVR单片机时,需先用ICCAVR编写C语言并进行编译,然后使用AVR Studio打开编译生成的*.cof文件,进行程序的仿真调试。图2-2 为AVR Studio的工作界面。
图2-2 AVR Studio的工作界面 2.2.3 PonyProg2000下载软件
PonyProg2000软件主要用于AVR单片机及PIC单片机的程序下载,能在Windows95/98/ME/NT/2000/XP等操作系统上使用。对英语不好的读者,还可以使用PonyProg2000的汉化程序。图2-3 为PonyProg2000的工作界面。
图2-3 PonyProg2000的工作界面
2.2.4 AVR DEMO单片机综合试验板
AVR DEMO单片机综合试验板为多功能实验板,对入门实习特别有效,其主要功能有:
1.可做AVR单片机的输入/输出实验。2.可做音响实验。3.可做A/D实验。4.可做PWM(D/A)实验。
5.八位数码管动态扫描输出及驱动。6.八位 LED 输出指示。7.可做IIC及SPI总线实验。8.DS18B20温度控制实验。9.红外遥控实验。10.16*2液晶驱动实验。11.128*64液晶驱动实验。
12.与PC机连接做RS232通信实验。图2-4~2-6为AVR单片机综合试验板外型。
图2-4 AVR DEMO单片机综合试验板外型
图2-5 AVR DEMO单片机综合试验板外型(驱动16*2字符型液晶)
图2-6 AVR DEMO单片机综合试验板外型(驱动128*64图型液晶)2.2.5 AVR单片机JTAG仿真器
为经典的AVR仿真器,支持的芯片为: ATmega128,ATmega128L,ATmega16,ATmega162,ATmega162V,ATmega165,ATmega165V,ATmega169,ATmega169V,ATmega16L,ATmega32,ATmega323,ATmega323L,ATmega32L,ATmega64,ATmega64L。图2-7为AVR单片机JTAG仿真器外型。
图2-7 AVR单片机JTAG仿真器外型
2.2.6 并口下载器 低价、可靠、实用。支持AVR单片机及AT89S51/52单片机。下载程序时必用的工具。图2-8为并口下载器外型。
图2-8 并口下载器外型
2.2.7 TOP2004多功能USB编程器
USB接口。支持AT89、AT87F、AT90、ATINY、ATMEGA、SST89、SM、MSU、GSM97、i87C/LC、P87、W77(78)E/LE、IS89C/LV、PIC12/16/17/
18、EM78P系列单片机。27/28/29/39/49/24C/93C系列存储器。16V8、20V8、22V10.支持74、4000/4500SRAM数字电路测试。支持芯片超过2000种,适合学习、开发、手机维修、电脑BIOS烧写。图2-9为TOP2004多功能USB编程器外型。
图2-9 TOP2004多功能USB编程器外型 第3章 AVR单片机开发软件的安装及初步使用
3.1 ICCAVR6.31A C语言编译器安装
在电脑中放入配套光盘,打开ICCAVR6.31A 安装文件后进入安装界面(图3-1),安装目录可使用默认方式将其安装在C盘的icc文件夹中(图3-2)。
图3-1 打开ICCAVR6.31A 安装文件后进入安装界面
图3-2 安装在C盘的icc文件夹中
安装完成后,需进行注册才能得到无时间限制的完全版软件。注册方式如下: 1.打开ICCAVR6.31A编译器界面,单击菜单栏Help→Regist Software(图3-3),系统会提示关掉计算机的防病毒程序,单击Continue按钮进入注册界面(图3-4)。
图3-3 单击菜单栏Help→Regist Software
图3-4 单击Continue按钮进入注册界面
2.选中并复制EMail Unlock Code栏右侧框内的7组数值。3.打开注册器,粘贴刚才复制的数值(图3-5)。
图3-5 粘贴刚才复制的数值
4.点击得到解锁码(图3-6)。复制该解锁码。
图3-6 点击得到解锁码
5.在ICCAVR6.31A编译器的注册界面的Paste(~V)the unlock code from Imagecraft’s email栏中,粘贴入解锁码(图3-7),单击License按钮后再单击OK完成注册(图3-8)。注册完成后的ICCAVR6.31A启动界面如图3-9所示,主要由菜单栏、工具栏、源文件编辑窗口、工程窗口和编译输出窗口五部分组成。
图3-7 粘贴入解锁码
图3-8 单击License按钮后再单击OK完成注册
图3-9 注册完成后的ICCAVR6.31A启动界面 3.2 AVR Studio集成开发环境安装
打开配套光盘内的AVR Studio安装文件,双击Setup.exe文件,按照提示步骤进行安装。安装结束后,会出现一个关于安装USB驱动的界面,由于我们这里不用到USB驱动的器件,只需点击Cancel关闭即可。安装完成后的AVR Studio启动界面如图3-10所示。
图3-10 AVR Studio启动界面
3.3 PonyProg2000下载软件安装
PonyProg2000软件主要用于AVR单片机及PIC单片机的程序下载,能在Windows95/98/ME/NT/2000/XP等操作系统上使用。双击配套光盘内的PonyProgV206f软件进行安装,安装过程中只需按照提示,单击Next按钮,逐步进行即可。安装完成后,还可以进行汉化,选中汉化程序包中的PonyProg2000文件(注意不要打开),然后复制,随后打开C:/Program Files/ PonyProg2000文件夹,直接点击粘贴。当弹出对话框提示是否需替换时,点确定,原文件即成为中文版。图3-11为PonyProg2000的启动界面。
图11 PonyProg2000的启动界面
AVR单片机开发过程为: 1.设置ICCAVR。2.建立一个工程项目。2.输入C源文件。
3.向工程项目中添加源文件。
4.编译文件,编译通过后生成COFF/HEX文件。
5.在AVR Studio集成开发环境中打开COFF文件,使用JTAG仿真器进行实时在线仿真或进行软件模拟仿真。
7.使用PonyProg2000软件将HEX文件下载到单片机中。8.应用。
3.4 我们的第一个AVR入门程序
接下来我们来做第一个AVR程序,让程序跑起来,控制AVR单片机综合试验板上的8个LED,让它们亮、灭进行闪烁。
3.4.1 设置ICCAVR 通过ICCAVR对源程序编译连接工程之前,需要对编译器属性进行设置,设置好的某些属性可保留起来作为新建工程的默认属性。
打开ICCAVR软件界面,选择Project→Option进入属性设置对话窗。共有Paths、Compiler、Target、Config Salvo四个属性标签页。
1).Paths标签页(图3-12)
在属性中设置编译器的头文件目录(Include Path(s):)和库文件目录(Library Path:)。我们使用系统默认的头文件目录和库文件目录。
图3-12 Paths标签页
由于我们不使用汇编语言进行开发,因此汇编语言包含路径(Asm Include Path(s):)空着不填。
输出文件目录(Output Directory:)空着不填,则输出文件自动存放在工程项目目录中,否则存放在用户填写的路径下。
2).Compiler标签页(图3-13)
Strict ANSI C Checkings:选中表示进行严格的C语法检查。
图3-13 Compiler标签页
Accept Extensions(C++ comments,binary constants):选中表示接受C++风格的程序注释。
Int size enum(for backword compatibility):选中表示可以向下兼容程序。
Optimizations栏可以选择默认设置(Default)或使能代码压缩功能(Enable code compression),对程序的编译进行优化。
Output Format栏选择格式输出。COFF格式的文件用于程序的仿真调试,HEX格式的文件可烧写入单片机。
AVR Studio Version(COFF)栏中选择Studio 4.06 and above。3).Target标签页(图3-14)
在Device Configuration下拉列表中,选择我们所使用的单片机芯片型号,这里我们选择ATMega16。其它采用默认设置。
图3-14 Target标签页
4).Config Salvo标签页(图3-15)
采用系统默认的为不带实时操作系统(Do not use Salvo Configurator)。
图3-15 Config Salvo标签页
完成设置后,单击OK即完成ICCAVR的属性设置。如果我们在开发下一个工程项目时,使用这些已经做好的属性设置,则不必再次进行属性设置了。
3.4.2 建立一个工程项目 在我的文档中新建一个ac3-1的文件夹。
在ICCAVR软件界面中,单击Project,在弹出的下拉菜单选中New选项,屏幕显示为图3-16。在出现的Save New Project As对话框中,选择工程项目存放的路径(存放在刚才新建的ac3-1文件夹中)并输入新建工程项目的名称(这里我们取名ac3-1),单击保存按钮,系统自动初始化成三个空文件夹Files、Headers、Documents,如图3-17所示。
图3-16 新建一个工程项目
图3-17 自动初始化成三个空文件夹Files、Headers、Documents 3.4.3 输入C源文件 单击File菜单,在下拉菜单中选择New,随后在出现的Untitled-0文本文件编辑窗口中输入以下的源程序(如图3-18)。
图3-18 输入源程序
#include
程序输入完成后,选择File,在下拉菜单中选中Save as,保存在ac3-1文件夹中,源文件名为ac3-1.c,保存后可看到源文件名由Untitled-0变为ac3-1.c。
3.4.4 向工程项目中添加源文件
选中工程项目区的File文件夹右击。在出现的下拉窗口中选择Add Files,如图3-19所示。在添加文件窗口中选择ac3-1.c源文件,鼠标单击打开按钮,这时ac3-1.c文件便加入到工程项目中(图3-20)。
图3-19 向工程项目中添加源文件
图3-20 源文件加入到工程项目中
3.4.5 编译文件
选择主菜单栏中的Project,在下拉菜单中选中Make Project,这时编译输出窗口出现源程序的编译信息,如图3-21所示。如果编译出错,会在编译输出窗口中显示出来。用户可以在源程序编辑窗口重新输入、修改源程序文件,并再次编译,直到编译通过并生成用户所需的文件。
图3-21 编译输出窗口出现源程序的编译信息
3.4.6 软件模拟仿真
打开AVR Studio集成开发环境,这时出现一个欢迎进入AVR Studio的界面(图3-22)。
图3-22 出现一个欢迎进入AVR Studio的界面
单击Open按钮,选中ac3-1.cof文件后点击打开,出现生成AVR Studio工程项目文件的界面后点保存(图3-23),然后出现选择仿真平台的界面(图3-24)。这里我们进行软件模拟仿真,Debug Platform栏中选择AVR Simulator,Device栏选择Atmega16芯片(图3-25)。点击Finish后进入仿真界面(图3-26)。
图3-23 出现生成AVR Studio工程项目文件的界面后点保存
图3-24 出现选择仿真平台的界面
图3-25 Device栏选择Atmega16芯片
图3-26 点击Finish后进入仿真界面
在主菜单中打开Debug,从Debug的下拉菜单中可看到常用的仿真快捷键,这里我们选择F10(Step Over)进行调试。
选择Debug →AVR Simulator Options,出现图3-27所示的仿真选项,我们将Frequency一项中的仿真频率改为8.00MHz,使其与试验板上的实际工作频率相符。
图3-27 选择Debug →AVR Simulator Options 在左侧Workspace窗口中,存放着ATMeag16的各种寄存器的状态值,我们将I/O ATMEGA16前的加号展开,再将PORTB前的加号展开,将PORTB输出口打开(图3-28)。鼠标在程序的光标箭头上点一下,随后按动F10,可发现PORTB口的各寄存器会发生变化,DDRB全部为黑色(0xFF),说明方向寄存器的设置为输出方式,而随着继续按动F10,PORTB与PINB则一会儿变黑(0xFF),一会儿变白(0x00)。将Workspace窗口中的Processor前的加号展开,最下面有个Stop Watch项,该项就是AVR Studio在选定时钟频率下计算出的运行时间(图3-29)。我们可发现,PORTB输出低电平到高电平的时间间隔约0.439秒,反复循环。仿真调试通过后,关闭AVR Studio开发环境。
图3-28 将PORTB输出口打开
图3-29 AVR Studio在选定时钟频率下计算出的运行时间
3.4.7 将HEX文件下载到单片机中
将并口下载器插电脑的并口,下载线的另一端插AVR DEMO单片机综合试验板的ISP口。
将试验板上标示PB0-PB7的双排针上8个短路块拔下,插到标有LED的双排针上,使PB口与LED接通。试验板通电工作,注意,5V稳压电源接DC5V插座;若使用9V-15V电源时,插9V-15V的插座。插错电源会损坏芯片!
第一次使用PonyProg2000下载程序时,需对PonyProg2000进行设置,选择合适的下载接口方式,并对端口进行校正。PonyProg2000支持串口及并口下载,这里我们采用并口SPI方式下载程序。
双击桌面上的PonyProg2000快捷图标运行软件(图3-30),出现小马头图标后点确认。
程序下载前先进行端口设置及校正。选择设置→接口设置,出现图3-31对话框。如果我们的电脑使用的操作系统是Windows 95/98/ME,单击并行,选择Avr ISP API,并选择LPT1;如果我们的电脑使用的操作系统是Windows NT/2000/XP,则单击并行,选择Avr ISP I/O,并选择LPT1。
图3-30 运行PonyProg2000软件
图3-31 进行端口设置及校正
下来选择设置→校正,对端口进行校正,出现图3-32的窗口。单击Yes开始校正,校正完成后会有提示(图3-33),点OK即可。
图3-32 单击Yes开始校正
图3-33 校正完成
选择器件→AVR micro→Atmega16(图3-34)。
图3-34 选择器件→AVR micro→Atmega16 选择文件→打开程序(FLASH)文件,文件类型选*HEX,装载编程文件(图3-35)。
图3-35 装载编程文件
选择命令→擦除,先擦除器件(图3-36)。
图3-36 选择命令→擦除
选择命令→Security and Configuration Bits„,按图3-37配置熔丝位。单击写入,写入熔丝位配置。
图3-37 写入熔丝位配置
选择命令→写入所有,开始下载烧写文件(图3-38)。
图3-38 选择命令→写入所有
在下载文件时,ISP旁的发光二极管D0会点亮。3.4.8 应用
下载烧写完成时,我们即可看到PB口驱动的8个发光二极管开始闪亮,周期约0.8秒,即点亮0.4秒、熄灭0.4秒,反复进行。
恭喜您,您已经踏入了AVR高速单片机的大门,请您继续行动起来,掌握AVR单片机的高效设计。
第4章 AVR DEMO单片机综合试验板原理介绍及使用
4.1 AVR DEMO单片机综合试验板
AVR DEMO单片机综合试验板为多功能实验板,对入门实习及学成后开发产品特别有帮助,图4-1为AVR DEMO单片机综合试验板电路原理图(作者注:使用Protel99se打开)。
图4-1 AVR DEMO单片机综合试验板电路原理图
U1为单片机ATMEAG16L。JP1、JP2为双排针,便于单片机外扩其它器件。
D1-D8为8个发光二极管,通过LED双排针与PB0-PB7连接,可作开关量输出的指示。
ISP为在线下载程序的接口。JTAG为在线JTAG仿真接口。
LCD128_64为驱动128*64图型液晶的接口,可做128*64液晶驱动实验。LCD16_2为驱动16*2液晶的接口,可做16*2液晶驱动实验。JTAG_R双排针连接R2-R5这4个10K的上拉电阻,这是进行JTAG仿真所需的,一般情况下用短路块将JTAG_R双排针短接。
U2为232通信芯片,通过UART双排针与单片机ATMEAG16L的PD0、PD1连接,方便与PC机连接做RS232通信实验。
SW_DIP4为4位拔码开关,它通过SW_DIP短路块与PD4-PD7连接,可做状态转换的实验。
RV1为多圈电位器,所取得的模拟电压通过排针AD后送单片机的PA7,可做A/D实验。
Q1及蜂鸣器BZ组成音响电路,通过排针BEEP与单片机的PD5连接,可做音响实验。
S1-S4为4个轻触式按键开关,通过KEY双排针与PD4-PD7连接,可做开关量的输入实验。
INT0、INT1为2个轻触式按键开关,通过INT双排针与PD2、PD3连接,可进行AVR单片机的外部中断实验。
LEDMOD1、LEDMOD2为8位数码管显示器,其中字段码经LEDMOD_DATA双排针后由单片机的PA0-PA7送出,位选码经LEDMOD_COM双排针后由单片机的PC0-PC7送出,可做8位数码管动态扫描输出及驱动。
U4为IIC总线实验器件24C01,通过IIC双排针与PC0、PC1连接,可做IIC总线实验。
U5为SPI总线实验器件93C46,通过SPI双排针与PB4-PB7连接,可做SPI总线实验。
U7为测温器件,通过排针18B20与PC7连接,能进行测温及控温实验。U8为38KHz的红外接收器,通过排针IR与PD6连接,可做红外遥控实验。
U6A、U6B及外围器件组成有源滤波电路,通过双排针PWM_IN与单片机的PB3、PD4、PD5、PD7连接,可做PWM(D/A)实验。
J1、J2为外接电源插口,其中J1输入9-15V直流电压,供U6运放使用,同时经U3稳压获得的5V供其它部分使用。若实验中不需从PWM_OUT1、PWM_OUT2端口取得PWM的模拟量,那么直接从J2口输入5V稳压电源即可,而不用J1口。
4.2ATMEAG16L单片机的主要特点与内部组成
ATMEAG16L是AVR单片机家族中的高档产品,其包含的功能较为齐全,非常适合于学习及开发实践。选择ATMEAG16L进行学习的另一个主要原因是该芯片支持JTAG调试,这样大大降低了我们在学习、开发过程中的调试难度及成本。
ATMEAG16L的主要特点为:
●内部Flash程序存储器内部含有16K字节的Flash存储器,支持ISP(在系统编程)和IAP(在应用编程),可被重复擦写10000次。
●内部数据存储器SRAM达1K字节。
●内部EEPROM达512字节,可擦写100000次,可以在系统掉电时保存一些用户信息。
●32个I/O口,分PA、PB、PC、PD共4组,每组8位。每个I/O口可负载20~40mA的电流,芯片的总电流不超过200mA。
●有两个可分频的8位定时器/计数器和一个可分频的16位定时器/计数器,带输入捕获、比较输出功能。有4个通道的PWM,可作DAC转换器。●中断单元有20个中断源,每个中断有独立的中断向量入口地址,所有的中断事件都有各自的使能位,可以根据需要使能或屏蔽。
●Atmega16L支持多种时钟方式,有外部晶振、外部RC振荡、外部时钟和内部RC振荡等。Atmega16L内置上电复位电路、可编程低电压检测(BOD)复位电路和带独立振荡器的看门狗,支持上电复位、外部复位、看门狗复位和低电压检测复位等复位源。
●内置8通道10位精度的逐次逼近式模/数转换器(ADC),支持单端和双端差分信号输入,内含增益可编程运算放大器。●SPI同步接口。●全双工的USART。●
片内模拟比较器。●
二线总线(TWI)等。
图4-2为ATMEAG16L的引脚排列。图4-3为ATMEAG16L的内部组成结构。
图4-2 ATMEAG16L的引脚排列 图4-3 ATMEAG16L的内部组成结构
4.3使用JTAGICE仿真器(JTAG ICE)调试AVR DEMO单片机综合试验板
JTAG ICE与AVR DEMO单片机综合试验板连接的电路图见图4-4,图4-4中虚线的部分是可选连接。
图4-4 JTAG ICE与AVR单片机综合试验板连接的电路
当JTAGICE与用户板和个人电脑均连接上之后,就可以开始调试。下面以第3章中所作的第一个程序ac3-1.c为例,使用JTAG ICE进行实际调试。
前5步的操作与第3章中介绍的完全相同,即: 1.设置ICCAVR。2.建立一个工程项目。3.输入C源文件。4.向工程项目中添加源文件。
5.编译文件,编译通过后生成COFF/HEX文件。仅第6步的操作不同,下面将第6步介绍一下:
需要说明的是,进行JTAG仿真前,应确定单片机的JTAGEN熔丝位已被编程,这可以用下载软件PonyProg2000进行熔丝位检查。
6.使用JTAG仿真器进行实时在线仿真
将JTAG仿真器通过串口线与PC机的串口连接,另一端的10PlN扁平电缆则插入AVR DEMO单片机综合试验板上的JTAG插口。AVR DEMO单片机综合试验板通上5V电压,然后打开AVR Studio集成开发环境,这时出现一个欢迎进入AVR Studio的界面(图4-5)。
图4-5 进入AVR Studio的界面
单击Open按钮,选中ac3-1.cof文件后点击打开,出现生成AVR Studio工程项目文件的界面后点保存,然后出现选择仿真平台的界面(图4-6)。这里我们在Debug Platform栏中选择JTAG ICE,Device栏选择Atmega16芯片(图4-7)。点击Finish后JTAG ICE会与PC机建立通信连接,进入在线仿真界面(图4-8)。
图4-6 出现选择仿真平台的界面
图4-7 Device栏选择Atmega16芯片
图4-8 进入在线仿真界面
在主菜单中打开Debug,从Debug的下拉菜单中可看到常用的仿真快捷键,这里我们选择F10(Step Over)进行调试。
在左侧Workspace窗口中,存放着ATMeag16的各种寄存器的状态值,我们将I/O ATMEGA16前的加号展开,再将PORTB前的加号展开,将PORTB输出口打开。鼠标在程序的光标箭头上点一下,随后按动F10,可发现PORTB口的各寄存器会发生变化,DDRB全部为黑色(0xFF),说明方向寄存器的设置为输出方式,而随着继续按动F10,PORTB与PINB则一会儿变黑(0xFF),一会儿变白(0x00),对应的,实验板上的发光二极管也亮、灭闪烁。当按动F5快捷键(Run)后,程序全速运行,这时实验板上的发光二极管自动闪烁。
第二篇:《高级语言程序设计C》实验教学大纲
《高级语言程序设计C》实验教学大纲
课程编号:1021742 总学时:56学时
适用专业:非计算机理工科各专业 总实验学时:24 实验次数: 12 次 应开实验个数:13 已开实验个数:13 实验开出率:100%
实验一
熟悉C 程序的运行环境
一、学时:2
二、实验类型:演示、验证
三、实验目的和主要内容:
1.了解计算机系统对高级语言的基本操作方法
2.熟悉和了解Turbo C 系统软件的使用和操作
3.能进行简单的C语言程序录入、调试、编译和运行
四、需用仪器、设备:
1.硬件环境
PC-486以上微机
32M以上的内存
VGA显卡
2.软件环境
西文DOS操作系统(可使用UCDOS汉字操作系统)或Windows操作系统
Turbo C(2.0版)
五、实验方法及步骤:
1.熟悉开机操作,使用单机或计算机上网。
2.进入 Turbo C 系统。
3.熟悉Turbo C 系统各菜单命令的使用和操作
4.模仿简单的源程序,编写自己的小程序,并能运行这些程序。
5.录入、调试、编译和运行C语言程序
实验二
数据类型、表达式及输入输出函数实验
一、学时:2
二、实验类型:验证、设计
三、实验目的和主要内容:
1. 熟悉和了解C语言的数据类型
2. 使用C语言的有关算术运算符,以及包含这些运算符的表达式
3.进行简单的C语言输入输出函数的使用,格式控制符的涵意,简单C程序的设计、调 试、编译和运行
四、需用仪器、设备:
1.硬件环境
PC-486以上微机
32M以上的内存
VGA显卡
2.软件环境
西文DOS操作系统(可使用UCDOS汉字操作系统)或Windows操作系统
Turbo C(2.0版)
五、实验方法及步骤:
1.进入 Turbo C 系统。
2.编写简单的有输入输出的C程序,并进行该程序的运行、调试、编译。
3.编写一个输入三条边,计算三角形面积的程序。
4.编写程序,计算a+b×c÷d-d3,其中:a,b为整型变量,c,d为实型变量。
5.编写一个有关数据计算程序,验证运算符及表达式的结果。
6.可从布置的作业中,再任选一编程题,进行上机。
实验三
顺序程序结构程序设计
一、学时:2
二、实验类型:验证、设计
三、实验目的和主要内容:
1.进一步掌握C程序的编辑、编译、连接和运行的过程。2.熟悉顺序结构的程序设计方法。3.熟练使用C的各种表达式。
4.熟练掌握输入、输出函数的使用。
四、需用仪器、设备:
1.硬件环境
PC-486以上微机
32M以上的内存
VGA显卡
2.软件环境
西文DOS操作系统(可使用UCDOS汉字操作系统)或Windows操作系统
Turbo C(2.0版)
五、实验方法及步骤:
1.输入x,y,编写程序求z=x+|y|的值。实验步骤与要求:
(1)程序中用scanf函数输入x和y的值,请分析以下两个语句 scanf(“%f%f”,x,y);scanf(“%f%f”,&x,&y);
哪一个是正确的,分别运行之,分析程序运行结果。
(2)如果scanf函数改为scanf(“%f,%f”,&x,&y);应该怎样输入数据。2.编写输入三角形的三边长a、b、c,求三角形面积area的程序。实验步骤与要求:
(1)输入前要加提示语句。
(2)输出结果前要有必要的文字说明。(3)输入一组数据3,4,5,观察运算结果。
(4)输入另外一组数据3,4,8,观察运算结果,分析这个运算结果是否有效。
实验四
分支控制语句实验
一、学时:2
二、实验类型:验证、设计
三、实验目的和主要内容:
1.熟悉和了解C语言系统分支语句的使用和操作
2.进行C语言分支控制语句的设计、调试、编译和运行
四、需用仪器、设备:
1.硬件环境
PC-486以上微机
32M以上的内存
VGA显卡
2.软件环境
西文DOS操作系统(可使用UCDOS汉字操作系统)或Windows操作系统
Turbo C(2.0版)
五、实验方法及步骤:
1.进入 Turbo C 系统。
2.进行分支控制源程序的设计,并进行该程序的运行、调试、编译。
3.编辑一个分支控制程序,求:任意输入数(n>2)是否为素数。
4.编辑一个分支控制程序,求:任意输入3个数,求其最大数。
实验五
循环语句实验
一、学时:2
二、实验类型:验证、设计
三、实验目的和主要内容:
1.熟悉和了解C语言循环语句的使用和操作
2.进行C语言循环语句的设计、调试、编译和运行
四、需用仪器、设备:
1.硬件环境
PC-486以上微机
32M以上的内存
VGA显卡
2.软件环境
西文DOS操作系统(可使用UCDOS汉字操作系统)或Windows操作系统
Turbo C(2.0版)
五、实验方法及步骤:
1.进入 Turbo C 系统。
2.进行循环源程序的设计,并进行该程序的运行、调试、编译。
3.编辑一个循环程序,求:1到100的和及平方和。
4.编辑一个循环程序,求:任意输入10个数,求其最大数。
5.可从布置的作业中,再任选一编程题,进行上机。
实验六
数组实验
一、学时:2
二、实验类型:验证、设计
三、实验目的和主要内容:
1.熟悉和了解C语言数组程序的设计方法
2.学会使用C语言数组进行程序设计
3.进行C语言数组语句的设计、调试、编译和运行
四、需用仪器、设备:
1.硬件环境
PC-486以上微机
32M以上的内存
VGA显卡
2.软件环境
西文DOS操作系统(可使用UCDOS汉字操作系统)或Windows操作系统
Turbo C(2.0版)
五、实验方法及步骤:
1.进入 Turbo C 系统。
2.进行数组的定义和使用方法,即:一维和二维数组的应用。
3.进行数组语句源程序的设计,并进行该程序的运行、调试、编译。
4.编辑数组应用程序:
(1)任意输入20个数在一维数组a中,求20个数的平均值。
(2)定义2个二维数组A[2][3]、B[2][3],分别对这2个数组输入数据,求A+B和A-B的值。
(3)用字符数组存储任意输入10字符,求其最大字符。
(4)编辑一个有5个学生,考 3门功课。求出每一个学生的总分及平均分,统计平均成绩低于 60 分的学生人数。
5.可从布置的作业中,再任选一编程题,进行上机。
实验七
有关数组的程序设计
一、学时:2
二、实验类型:验证、设计
三、实验目的和主要内容:
1.掌握有关数组和字符串的程序设计方法。
四、需用仪器、设备:
1.硬件环境
PC-486以上微机
32M以上的内存
VGA显卡
2.软件环境
西文DOS操作系统(可使用UCDOS汉字操作系统)或Windows操作系统
Turbo C(2.0版)
五、实验方法及步骤: 已知一组数据如下:6,3,42,23,35,71,98,67,56,38。编写程序,把它们按 从小到大的次序排列起来。求2行3列矩阵A 的转置矩阵。
实验八
函数实验
一、学时:2
二、实验类型:验证、设计
三、实验目的和主要内容:
1.熟悉和了解C语言函数程序的设计方法。
2.学会使用C语言函数的定义及调用,并进行程序编制。
3.进行C语言函数语句的设计、调试、编译和运行
四、需用仪器、设备:
1.硬件环境
PC-486以上微机
32M以上的内存
VGA显卡
2.软件环境
西文DOS操作系统(可使用UCDOS汉字操作系统)或Windows操作系统
Turbo C(2.0版)
五、实验方法及步骤:
1.进入 Turbo C 系统。
2.进行函数的定义及调用。
3.进行函数语句源程序的设计,并进行该程序的运行、调试、编译。
(1)任意输入一个数n,用两个子函数实现1+2+3„n以及n!,在主函数中输出该结果。
(2)在主函数中定义二维数组A[3][4]、B[4],用子函数对数组A[3][4]每一行求和,其值放在数组B[4]中,在主函数中输出该值。
(3)用字符数组存储任意输入的10字符,在子函数中把该字符数组的小写字母转换成大写字母。
4.可从布置的作业中,再任选一编程题,进行上机。
实验九
常用指针实验
(一)一、学时:2
二、实验类型:验证、设计
三、实验目的和主要内容:
1.熟悉和了解C语言指针一般设计方法
2.学会使用C语言指针进行程序设计
3.进行简单C语言指针语句的设计、调试、编译和运行
四、需用仪器、设备:
1.硬件环境
PC-486以上微机
32M以上的内存
VGA显卡
2.软件环境
西文DOS操作系统(可使用UCDOS汉字操作系统)或Windows操作系统
Turbo C(2.0版)
五、实验方法及步骤:
1.进入 Turbo C 系统。
2.进行C语言指针语句的定义和使用方法。
3.进行C语言指针语句源程序的设计,并进行该程序的运行、调试、编译。
4.编辑一个找出字串 str1中 str2出现的位置,用指针编程实现。
5.可从布置的作业中,再任选一编程题,进行上机。
实验十
复杂指针实验
(二)一、学时:2
二、实验类型:验证、设计
三、实验目的和主要内容:
1.进一步熟悉和了解C语言指针语句设计方法
2.进行C语言中的指针与函数、指针数组、多级指针语句的设计、调试、编译和运行
四、需用仪器、设备:
1.硬件环境
PC-486以上微机
32M以上的内存
VGA显卡
2.软件环境
西文DOS操作系统(可使用UCDOS汉字操作系统)或Windows操作系统
Turbo C(2.0版)
五、实验方法及步骤:
1.进入 Turbo C 系统。
2.进行C语言指针与函数、指针数组、多级指针语句的定义和使用方法。
3.进行C语言该指针语句源程序的设计,并进行该程序的运行、调试、编译。
4.编辑一个在主程序里输入十个不等长的字串,调用自编的函数把它们按升序排列,用指针编程实现。
5.可从布置的作业中,再任选一题编程题,进行上机。
实验十一
结构类型实验
一、学时:2
二、实验类型:验证、设计
三、实验目的和主要内容:
1.熟悉和了解C语言结构、联合数据的定义及设计方法
2.学会使用C语言结构、联合数据类型进行程序设计
3.进行C语言结构、联合语句的设计、调试、编译和运行
四、需用仪器、设备:
1.硬件环境
PC-486以上微机
32M以上的内存
VGA显卡
2.软件环境
西文DOS操作系统(可使用UCDOS汉字操作系统)或Windows操作系统
Turbo C(2.0版)
五、实验方法及步骤:
1.进入 Turbo C 系统。
2.进行C语言结构、联合数据类型的定义和使用。
3.进行C语言结构、联合数据类型源程序的设计,并进行该程序的运行、调试、编译。
4.编辑一个能处理学生综合信息的程序(包括:学号、姓名、班级、语文成绩、数学成绩、英语成绩等)。
实验十二
有关结构的程序设计
一、学时:2(课后完成或选作)
二、实验类型:验证、设计
三、实验目的和主要内容:
1.掌握结构体类型和结构体变量的定义。2.掌握结构类型变量的定义和使用;
3.掌握链表的概念,初步学会对链表进行操作;
四、需用仪器、设备:
1.硬件环境
PC-486以上微机
32M以上的内存
VGA显卡
2.软件环境
西文DOS操作系统(可使用UCDOS汉字操作系统)或Windows操作系统
Turbo C(2.0版)
五、实验方法及步骤:
1.有五个学生,每个学生的数据包括学号,姓名,三门课的成绩,从键盘输入五个学生的数据,要求打印出每个学生的平均成绩,以及最高分的学生的数据(包括学号,姓名,三门课的成绩,平均分数)。实验步骤与要求:
用一个函数输入五个学生的数据;用一个函数求总平均分;用函数找出最高分学生数据,总平均分和最高分的学生的数据都在主函数中输出。
2.三个人围成一圈,从第一个人开始顺序报号1,2,3。凡报到“3”者退出圈子,找出最后流在圈子中的人原来的序号。
3.建立一个链表,每个结点包括:学号,姓名,性别,年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。
实验十三
文件实验
一、学时:2
二、实验类型:验证、设计
三、实验目的和主要内容:
1.熟悉和了解C语言文件系统的组成及设计方法。
2.学会使用C语言文件系统进行程序设计
3.进行C语言文件语句的设计、调试、编译和运行
四、需用仪器、设备:
1.硬件环境
PC-486以上微机
32M以上的内存
VGA显卡
2.软件环境
西文DOS操作系统(可使用UCDOS汉字操作系统)或Windows操作系统
Turbo C(2.0版)
五、实验方法及步骤:
1.进入 Turbo C 系统。
2.进行C语言文件系统类型的定义和使用。
3.进行C语言文件系统类型源程序的设计,并进行该程序的运行、调试、编译。
4.编辑程序。
(1)用数组存储10个数据,并存储在“date.dat”文件中
(2)对存储在“date.dat”文件中的数据读入到一个数组中,求出总和及最大值,并把它存储在“dsum.dat”文件中
第三篇:高级语言程序设计(C语言)实验教学大纲
信息技术系《高级语言程序设计》实验教学大纲
一、教材名称:<
二、课程总学时:108学时 [理论: 72 学时;实验与上机:36学时]
三、适用专业和开课学期:软件技术专业,第2学期。
四、实验的目的与任务:
《C程序设计》是一门实践性很强的课程。通过实验使学生加深对课堂讲授的概念、语法、算法、编程技术的理解;熟悉C程序设计的开发环境;掌握程序设计和调试的基本技能。并通过实践激发学生进一步学习的积极性,培养学生的学习兴趣和创新思维。通过8个实验,使学生经过一定数量的上机训练,了解和掌握C程序设计的环境、程序的数据表示、程序的执行流程控制、程序的整体结构等C程序设计的基本概念和应用技术。
五、主要仪器设备及台(套)数
安装Windowsxp,TC2.0等软件的计算机,每生一台。
六、主要实验教材(指导书)及参考用书:
谭浩强主编,《C程序设计题解与上机指导》,清华大学出版社。
七、成绩考核方式及评分标准
实验占课程总课时1/3,每项实验按该实验说明要求规定的评分标准积分,学期末合计的实验成绩占课程总成绩的18%。
八、实验开出率:100%
九、实验项目与要求
实验一:C程序的运行环境和运行一个C程序的方法(2学时)
实验性质:验证性实验
一、实验目的
1.了解所用的计算机系统的基本操作方法,学会独立使用该系统。2.了解在该系统上如何编辑、编译、连接和运行一个C程序。3.通过运行简单的C程序,初步了解C源程序的特点。
二、实验内容
1.调用编辑程序,输入教材第一章例1.1程序,并进行编译和运行。应了解所用的系统是用什么命令进行编译和连接运行的。编译和连接后所得到的目标程序的后缀是什么形式的?
2.输入并运行教材第一章中例1.2。
3.输入并运行教材第一章中例1.3,了解如何在运行时向程序变量输入数据。
实验二 数据类型、运算符和表达式(2学时)
实验性质:验证性实验
一、实验目的
1.掌握C语言数据类型,熟悉如何定义一个整型、字符型、实型变量,以及对它们赋值的方法,了解以上类型数据输出时所用格式转换符。
2.学会使用C的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(--)运算符的使用。
3.进一步熟悉C程序的编辑、编译、连接和运行的过程。
二、实验内容
1.输入并运行教材第三章例3.6.即: #include
printf(“%c %cn”,c1,c2); printf(“%d %dn”,c1,c2); } 在此基础上 ①将第二行改为: int c1,c2;再使之运行,分析结果。②再将第三行、第四行改为: c1=300;c2=400;再使之运行,分析其运行结果。
2.输入并运行教材第三章习题3.6,在上机前先用人工分析程序写出应得结果,上机后将二者对照。
3.输入并运行习题3.10。即: #include
printf(“%d,%d,%d,%d”,i,j, i++,j++);⑤程序改为: main(){int i,j,m=0,n=0;;i=8;j=10;m+=i++;n-=--j;printf(“i=%d,j=%d,m=%d,n=%d”,i,j,m,n);}
实验三 最简单的C程序设计(2学时)
实验性质:验证性实验
一、实验目的
1.掌握C语言中使用最多的一种语句—赋值语句的使用。2.掌握数据的输入输出的方法,能正确使用各种格式转换符。
二、实验内容
1.输入并运行以下程序:
#include
void main(){int a,b; float d,e; char c1,c2; double f,g; long m,n;
unsigned int p,q; a=61;b=62; c1=’a’;c2=’b’; d=3.56;e=-6.87;
f=3157.890121;g=0.123456789; m=50000;n=-60000; p=32768;q=40000;
printf(“a=%d,b=%dn c1=%c,c2=%cnd=%6.2f,e=%6.2fn”,a,b,c1,c2,d,e); printf(“f=%15.6f,g=%15.12fnm=%ld,n=%ldnp=%u,q=%un”,f,g,m,m,p,q); } 在此基础上,做以下改动: ① 将程序第8-13行改为: a=61;b=62; c1=a;c2=b;
f=3157.890121;g=0.123456789; d=f;e=g;
p=a=m=50000;q=b=n=-60000; 运行程序,分析结果。
② 在①的基础上将printf语句改为:
printf(“a=%d,b=%dn c1=%c,c2=%cnd=%15.6f,e=%15.12fn”,a,b,c1,c2,d,e);
printf(“f=%f,g=%fn m=%ld,n=%ldn p=%d,q=%dn”,f,g,m,n,p,q); 运行程序。
2.编写程序,用getchar函数读入两个字符c1、c2,然后分别用putchar函数和printf函数输出这两个字符。
上机运行程序,比较用printf和putchar函数输出字符的特点。
实验四 选择结构程序设计(2学时)
实验性质:设计性实验
一、实验目的
1.了解C语言表示逻辑量的方法(以0代表“假”,以1代表“真”); 2.学会正确使用逻辑运算符和逻辑表达式; 3.熟练掌握if语句和switch语句。
二、实验内容
先编程序,解决以下问题,然后上机调试运行程序。1.有一个函数 xy2x13x11x11x10 x10用scanf函数输入x的值(分别为x<1、1~
10、≥10三种情况),求y值。2.给出一个百分制成绩,要求输出成绩等级‘A’,‘B’,‘C’,‘D’,‘E’。90分以上为‘A’,80~89分为‘B’,70~79分为‘C’,60~69分为‘D’,60分以下为‘E’。
实验五 循环控制(4学时)
实验性质:设计性实验
一、实验目的
1.熟悉用while语句,do-while语句和for语句实现循环的方法。2.掌握在程序设计中用循环的方法实现各种算法(如穷举、迭代、递推等)。
二、实验内容
编程序并上机调试运行。
1.输入两个正整数,求其中最大公约数和最小公倍数。2.用牛顿迭代法求方程2x3-4x2+3x-6=0在1.5附近的根。
实验六 数组(4学时)
实验性质:设计性实验
一、实验目的
1.掌握一维数组和二维数组的定义、赋值和输入输出的方法; 2.掌握字符数组和字符串函数的使用。3.掌握与数组有关的算法(特别是排序算法)。
二、实验内容
编程序并上机调试运行。
1.用选择法对10个整数排序。10个整数用scanf函数输入。2.将两个字符串连接起来,不要用strcat函数。实验七 函数(4学时)
实验性质:设计性实验
一、实验目的
1.掌握定义函数的方法;
2.掌握函数实参与形参的对应关系,以及“值传递”的方式; 3.掌握函数的嵌套调用和递归调用的方法;
4.掌握全局变量和局部变量,动态变量和静态变量的概念和使用方法。
二、实验内容
编程序并上机调试运行。
1.写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的信息。2.求两个整数的最大公约数和最小公倍数,用一个函数求最大公约数。用另一函数根据求出的最大公约数求最小公倍数。
(1)用全局变量的方法。将两个整数的最大公约数、最小公倍数都设为全局变量。
(2)不用全局变量,两个整数在主函数中输入,并传送给函数1,求出的最大公约数返回主函数,然后再与两个整数一起作为实参传递给函数2,以求出最小公倍数,返回到主函数输出最大公约数和最小公倍数。
实验八 预处理命令(2学时)
实验性质:设计性实验
一、实验目的
1.掌握宏定义的方法; 2.掌握文件包含处理方法; 3.掌握条件编译的方法。
二、实验内容
编程序并上机调试运行。
1.定义一个带参数的宏,使两个参数的值互换。在主函数中输入两个数作为使用宏的实参,输出已交换后的两个值。
说明:在程序主函数使用宏时只能用两个实参,如SWAP(a,b),不能用三个参数。2.用条件编译方法实现以下功能:
输入一行电报文字,可以任选两种输出,一为原文输出;一为将字母变成其下字母(如‘a’变成‘b’,„,‘z’变成‘a’。其它字符不变)。用#define命令来控制是否要译成密码。例如: #define CHANGE 1 则输出密码。若 #define CHANGE 0 则不译成密码,按原码输出。用条件编译方法来处理。
实验九 指针(4学时)
实验性质:设计性实验
一、实验目的
1.掌握指针的概念,会定义和使用指针变量; 2.学会使用数组的指针和指向数组的指针变量; 3.学会使用字符串的指针和指向字符串的指针变量; 4.学会使用指向函数的指针变量;
二、实验内容
编程序并上机调试运行程序(都要求用指针处理)。1.输入三个整数,按由小到大的顺序输出。
2.将一个3*3的矩阵转置,用一函数实现之。在主函数中用scanf函数输入以下矩阵元素:
1 7133915511 19将数组名作为函数实参。函数调用后在主函数中输出已转置的矩阵。3.用一个函数实现两个字符串的比较,即自己写一个strcmp函数: strcmp(s1,s2)如果s1=s2,则函数返回值为0;如果s1≠s2,返回它们二者第一个不同字符的ASCII码差值(如“BOY”与“BAD”,第二个字母不同,“O”与“A”之差为79-65=14);如果s1>s2,则输出正值;如s1 两个字符串s1,s2由main函数输入,strcmp函数的返回值也在main函数输出。 实验十 结构体和共用体(4学时) 实验性质:设计性实验 一、实验目的 1.掌握结构体类型变量的定义和使用; 2.掌握结构体类型数组的概念和应用; 3.掌握共用体的概念与使用。 二、实验内容 编程序,然后上机调试运行。 1.有5个学生,每个学生的数据包括学号、姓名、三门课的成绩,从键盘输入5个学生数据,要求打印出三门课总平均成绩,以及最高分的学生的数据(包括学号、姓名、三门课的成绩、平均分数)。 要求用一个input函数输入5个学生数据;用一个average函数求总平均分;用max函数找出最高分学生数据;总平均分和最高分的学生的数据都在主函数中输出。 2.输入和运行以下程序: #include union data {int i[2]; float a; long b; char c[4]; }; void main(){union data u; scanf(“%d,%d”,&u.i[0],&u.i[1]); printf(“i[0]=%d,i[1]=%dna=%fnb=%ldnc[0]=%c,c[1]=%c,c[2]=%c,c[3]=%cn”,u.i[0],u.i[1],u.a,u.b,u.c[0],u.c[1],u.c[2],u.c[3]);} 输入两个整数10000、20000给u.i[0]和u.i[1]。分析运行结果。 然后将scanf语句改为: scanf(“%ld”,&u.b); 输入60000给b。分析运行结果。 实验十一 位运算(1学时) 实验性质:设计性实验 一、实验目的 1.掌握位运算的概念和方法,学会使用位运算符; 2.学会通过位运算实现对某些位的操作。 二、实验内容 编写程序,上机调试并运行。 1.设计一个函数,使给出一个数的原码,能得到该数的补码,用八进制形式输入和输出。 实验十二 文件(1学时) 实验性质:设计性实验 一、实验目的 1.掌握文件以及缓冲文件系统、文件指针的概念; 2.学会使用文件打开、关闭、读、写等文件操作函数。3.学会用缓冲文件系统对文件进行简单的操作。 二、实验内容 1.从键盘输入一个字符,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。输入的字符以“!”结束。实验十三 学生成绩管理(4学时) 实验性质:综合性设计性实验 一、实验目的 1.综合运用C程序设计知识,解决实际问题。 二、实验内容 1.有5个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号、姓名、三门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stud”中。 2.将上题“stud”文件中的学生数据,按平均分进行排序处理,将已排序的学生数据存入一个新文件“stu-sort”中。 3.将上题已排序的学生成绩文件进行插入处理。插入一个学生的三门课成绩。程序先计算新插入学生的平均成绩,然后将它按成绩高低顺序插入,插入后建立一个新文件。 学生的原有数据为: 91101 Wang 89,98,67.5 91103 Li 60,80,90 91106 Fun 75.5,91.5,99 91110 Ling 100,50,62.5 91113 Yuan 58,68,71 要插入的学生数据为: 91108 Xin 90,95,60 制 订:程世辉 教研室:软件教研室 执笔人:程世辉 审定人: 二00七年八月 实验一 C语言的运行环境和基础知识 一、实验目的 1.掌握c程序设计编程环境visual c++,掌握运行一个c程序设计的基本步骤,包括编辑、编译、连接和运行。 2.熟练掌握Visual C++ 6.0环境运行的C程序上机步骤 3.数据类型、常量和变量的使用 4.表达式及运算符的应用 5.C程序的调试。 二、实验内容和源程序清单、测试数据、结果。 1、最简单的C程序。(要求文件名:1_1.c)#include printf(“Hello world!n”);return 0;} 2、一个具有致命错误的程序,请修改。(要求文件名:1_2.c)#include printf(“i=%dn”,i); return 0;} 3、一个具有警告语法错的程序。(要求文件名:1_3.c)#include s=i+j;printf(“s=%dn”,s);return 0;} 4、写出一个程序测试整型、字符型数据表示,并输出以验证是否正确。(要求文件名:1_4.c)#include int x=010,y=10,z=0x10; /* 整型数据表示 */ char c1='M',c2='x4d',c3='115',c4=77,c; /* 字符型数据表示 */ /* 整型数据的输出 */ printf(“x=%o,y=%d,z=%xn”,x,y,z); /* 数据以原进制输出,注意是否有前导0或0x */ printf(“x=%d,y=%d,z=%dn”,x,y,z); /* 数据以10进制输出,换算到10进制,结果对吗? */ /* 字符型数据的输出 */ printf(“c1=%c,c2=%x,c3=%o,c4=%dn”,c1,c2,c3,c4); /* 数据以原进制输出,注意是否有前导0或0x ?*/ printf(“c1=%c,c2=%c,c3=%c,c4=%cn”,c1,c2,c3,c4); /* 结果都是什么字符?,也就是说字符可以自由的表示成几种形式? */ printf(“c1=%d,c2=%d,c3=%d,c4=%dn”,c1,c2,c3,c4); /* 看看这些字符的10进制ASCII码,哦,ASCII码一样,同一种字符 */ /* 字符型数据参与算术运算 */ c=c1+32; /* 字符怎么参加了数学运算,哦,是字符对应的ASCII码-整数 /* 参与数学运算;结果还是一个整数-另外一个字符的ASCII码 */ printf(“c=%c,c=%dn”,c,c); /* 看看这个字符是什么?哇,'M'+32='m'了,看看ASCII码表,原来如此!*/ return 0;} 参考结果: x=10,y=10,z=10 x=8,y=10,z=16 c1=M,c2=4d,c3=115,c4=77 c1=M,c2=M,c3=M,c4=M c1=77,c2=77,c3=77,c4=77 c=m,c=109 三、实验报告要求 将题目:2和4的源程序、运行结果,以及实验中遇到的问题和解决问题的方法,以及实验过程中的心得体会,写在实验报告上。2 实验二 顺序结构程序设计 一、实验目的: 1.掌握顺序结构程序设计 2.掌握赋值语句的用法 3.熟练地进行数据输入和输出 二、实验内容和源程序清单、测试数据、结果。 1、已知:a=2,b=3,x=3.9,y=2.3(a,b整型,x,y浮点),计算算术表达式(float)(a+b)/2+(int)x%(int)y的值。试编程上机验证。(要求文件名:2_1.c)提示编程要点: (1)先判断结果值类型,可设置一个此类型的变量用于记录表达式结果,本例用r存放结果;(2)程序先给几个变量赋初值,然后将表达式赋值给变量r;(3)最后打印变量r的值就是表达式的值。参考程序: #include int a=2,b=3;float x=3.9,y=2.3; float r; r=(float)(a+b)/2+(int)x%(int)y; printf(“%fn”,r);return 0;} 参考结果: 3.500000 思考:为什么是这个结果? 2、分析下面程序结果,并上机验证。(要求文件名:2_2.c)#include int i,j,m,n; i=8; j=10; m=++i; n=j++; printf(“i=%d, j=%d, m=%d, n=%dn”,i,j,m,n); return 0;} 参考结果: i=9, j=11, m=9, n=10 3、用下面的scanf函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1=’A’,c2=’a’。从键盘如何输入?(要求文件名:2_3.c)#include 4、编程序,用getchar函数读入两个字符给c1、c2,然后分别用 putchar函数和 printf函数输出这两个字符。(要求文件名:2_4.c)参考程序: #include 三、实验报告要求 将题目:1和3的源程序、运行结果,以及实验中遇到的问题和解决问题的方法,以及实验过程中的心得体会,写在实验报告上。 实验三 选择结构程序设计 一、实验目的 1.2.3.4.了解C语句表示逻辑量的方法(以0代表“假”以1代表“真”); 学会正确使用逻辑运算符和逻辑表达式; 熟练掌握if语句和switch语句; 熟练掌握switch语句中break语句的作用。 二、实验内容和源程序清单、测试数据、结果。 (1)掌握各种格式转换符的正确使用方法,输出结果。(要求文件名:3_1.c)#include (2)1.从键盘任意输入一个年号,判断它是否是闰年。若是闰年,输出“Yes”,否则输出“No”。已知符合下列条件之一者是闰年:(1)能被4整除,但不能被100整除;(2)能被400整除。(要求文件名:3_2.c)参考程序: #include int year, flag;printf(“Enter year:”);scanf(“%d”, &year);if(year%4==0&&year%100!=0 || year%400==0) { flag = 1; } else { flag = 0; } if(flag) { printf(“Yesn”); } else { printf(“Non”);} return 0;}(3)编程序,并给出程序的运行结果,注意思考case中break的用法以及为什么是这样的结果?(要求文件名:3_3.c)参考程序: #include int x=2,y=1,a=1,b=2;switch(x){ case 2: switch(y) { case 1:a++; case 2:b++;break; } case 3:a++;b++;break;} printf(“%d %dn”,a,b);return 0;}(4)编程序:输入4个整数,要求按由小到大的顺序输出。(要求文件名:3_4.c)参考程序: #include int t,a,b,c,d;scanf(“%d,%d,%d,%d”,&a,&b,&c,&d);printf(“a=%d,b=%d,c=%d,d=%dn”,a,b,c,d);if(a>b){t=a;a=b;b=t;} if(a>c){t=a;a=c;c=t;} if(a>d){t=a;a=d;d=t;} if(b>c){t=b;b=c;c=t;} if(b>d){t=b;b=d;d=t;} if(c>d){t=c;c=d;d=t;} printf(“%d,%d,%d,%dn”,a,b,c,d);return 0;} 三、实验报告要求 将题目:2和3的源程序、运行结果,以及实验中遇到的问题和解决问题的方法,以及实验过程中的心得体会,写在实验报告上。 实验四 循环结构程序设计 一、实验目的 1.2.3.4.5.熟练使用while、for语句实现循环程序设计 理解循环条件和循环体,以及while、for语句的相同及不同之处 掌握嵌套循环程序设计 熟练掌握下拉菜单Debug的程序调试方法 掌握break和continue的用法 二、实验内容和源程序清单、测试数据、结果。 (1)输入两个正整数m和n,求它们的最大公约数和最小公倍数。(要求文件名:4_1.c)参考程序: #include m=x;else m=y;for(i=1;i<=m;i++){ if((x%i==0)&&(y%i==0)) max=i;} printf(“%dn”,max);printf(“%dn”,x*y/max);return 0;}(2)从键盘输入一个 int 类型的正整数,输出它的所有因子。如输入6,输出1,2,3;输入20,输出1,2,4,5,10。(要求文件名:4_2.c)参考程序: #include printf(“%dn”,i);} return 0;}(3)输入一行字符,分别统计出其中的英文字母、空格、数字和其他字符的个数。(要求文件名:4_3.c)参考程序: #include if(c>='a'&&c<='z'||c>='A'&&c<='Z') letter++; else if(c>='0'&&c<='9') digit++; else if(c==' ') space++; else other++;} printf(“%d,%d,%d,%dn”,letter,digit,space,other);return 0;}(4)编程计算111111的值。(要求文件名:4_4.c)23499100参考程序: #include int sign = 1;double sum = 1;double deno = 2;double term = 1;while(deno<=100){ sign =(-1)*sign; term = sign*(1/deno); sum = sum+term; deno++;} printf(“%lfn”,sum);return 0;} 三、实验报告要求 将题目:3和4的源程序、运行结果,以及实验中遇到的问题和解决问题的方法,以及实验过程中的心得体会,写在实验报告上。 实验五 数组 一、实验目的 1.掌握一维、二维数组的定义、引用、应用 2.掌握字符数组的定义、引用、应用 3.掌握字符串处理函数 二、实验内容和源程序清单、测试数据、结果。 (1)给出下面程序的结果,思考为什么?(要求文件名:5_1.c)#include char a[]=“Chinaren”,b[]=“Tiananmen”;char *p1,*p2; int k=0;p1=a; p2=b;for(k=0;k<10;k++) if(*(p1+k)==*(p2+k)) printf(“%c”,*(p1+k));printf(“n”);return 0;}(2)有一个3×4的矩阵,要求输出其中值最大的元素的值,以及它的行号和列号。(要求文件名:5_2.c)参考程序: #define M 3 #define N 4 #include int a[M][N]={{123,94,-10,218},{3,9,10,-83},{45,16,44,-99}}; max=a[0][0]; for(i=0;i for(j=0;j if(a[i][j]>max) { max= a[i][j]; r=i; c=j; } printf(“max=%d , row =%d , colum=%d n”,max , r, c); return 0;}(3)编程序用于读入10个字符串,然后找出最大的字符串并打印。(要求文件名:5_3.c)参考程序: #include char str[10][80],maxstring[80]; int i;printf(“Enter ten strings:n”);for(i=0;i<10;i++) { scanf(“%s”, str[i]);} strcpy(maxstring, str[0]); for(i=1;i<10;i++) { if(strcmp(str[i],maxstring)>0) { strcpy(maxstring,str[i]); } } printf(“The max string is:%sn”,maxstring);}(4)给出下面程序的运行结果,思考为什么?(要求文件名:5_4.c)#include int a[4][4]={{1,2,-3,-4},{0,-12,-13,14},{-21,23,0,-24},{-31,32,-33,0}};int i,j,s=0;for(i=0;i<4;i++){ for(j=0;j<4;j++) { if(a[i][j]<0)continue; if(a[i][j]==0)break; s+=a[i][j]; } } printf(“%dn”,s);return 0;}(5)测试二维数组的各个地址值,结果是什么,思考原因。(要求文件名:5_5.c)#include int a[M][N];printf(“%xn”,a);printf(“%xn”,a[0]);for(int i=0;i printf(“%x,”,&a[i][j]); return 0;} 三、实验报告要求 将题目:2和3的源程序、运行结果,以及实验中遇到的问题和解决问题的方法,以及实验过程中的心得体会,写在实验报告上。 实验六 函数 一、实验目的 1.掌握C语言函数的定义方法、函数的声明及函数的调用方法。 2.了解主调函数和被调函数之间的参数传递方式。 二、实验内容和源程序清单、测试数据、结果。 (1)给出下面程序的结果,思考为什么?(要求文件名:6_1.c)#include #include printf(“%d is prime!”,number);else printf(“%d is not!”,number);return 0;} int prime(int number)/*此函数用于判别素数*/ { int flag=1,n;for(n=2;n if(number%n==0) flag=0;return(flag);}(3)求两个整数的最大公约数和最小公倍数。写一个函数求最大公约数。(要求文件名:6_3.c)参考程序: #include max=i;} return(max);}(4)写一函数,输入一个十六进制数,输出相应的十进制数。(要求文件名:6_4.c)参考程序: #include if(shu[i]>=48&&shu[i]<=57) sum=sum+(shu[i]-48)*pow(16,k-i); else if(shu[i]>=65&&shu[i]<=70) sum=sum+(shu[i]-55)*pow(16,k-i); else if(shu[i]>=97&&shu[i]<=102) sum=sum+(shu[i]-87)*pow(16,k-i); else { printf(“error!n”); break; } return sum;} int main(){ char str[100];long s;gets(str);s=change(str);if(!s) printf(“The number is not oxn”);else printf(“change:%ldn”,s);return 0;} 三、实验报告要求 将题目:3和4的源程序、运行结果,以及实验中遇到的问题和解决问题的方法,以及实验过程中的心得体会,写在实验报告上。 实验七 指针 一、实验目的 1.掌握指针变量的定义与引用。 2.熟练使用函数指针、数组指针、字符串指针编写应用程序。 二、实验内容和源程序清单、测试数据、结果。 (1)输入三个整数,按由小到大的顺序输出,然后将程序改为:输入三个字符串,按由小到大顺序输出。参考程序:(输入三个整数,按由小到大的顺序输出)(要求文件名:7_0.c)#include #include int x,a[100],*p,i;p=a;scanf(“%d”,&x);for(i=0;i scanf(“%d”,p++);p=a;printf(“n”);maopao(p,x);printf(“the sorted numbers:n”);p=a;for(i=0;i printf(“%dt”,*p); return 0;} void maopao(int *p,int x){ int i,j,temp;for(i=0;i for(j=0;j if(*(p+j)>*(p+j+1)) { temp=*(p+j); *(p+j)=*(p+j+1); *(p+j+1)=temp; } }(3)利用函数和指针将给定字母字符串的第一个字母变成大写字母,其它字母变成小写字母。在main函数中接收字符串的输入,改变后的字符串的输出也在main函数中实现。(要求文件名:7_3.c)参考程序: #include *s-=32;s++; } for(i=0;i *s+=32; 三、实验报告要求 将题目2和3的源程序、运行结果,以及实验中遇到的问题和解决问题的方法,以及实验过程中的心得体会,写在实验报告上。 实验八 结构体和共用体 一、实验目的 1.掌握结构体类型和结构体变量的定义。 2.掌握结构类型变量的定义和使用。 3.掌握链表的概念,初步学会对链表进行操作。 二、实验内容和源程序清单、测试数据、结果。 (1)给出下面程序的运行结果,思考为什么?(要求文件名:8_1.c)#include char num[10]; float score[3];}; int main(){ struct STU s[3]={{“1122301”,90,95,85}, {“1122302”,80,90,75}, {“1122303”,98,92,85}}, *p=s; int i; float sum = 0; for(i=0;i<3;i++){ sum = sum + p->score[i]; } printf(“%6.2fn”,sum); return 0;}(2)有10个学生,每个学生的数据包括学号,姓名,三门课的成绩,从键盘输入十个学生的数据,要求打印出每个学生的平均成绩,以及最高分的学生的数据(包括学号,姓名,三门课的成绩,平均分数)。(要求文件名:8_2.c)#include char num[6]; char name[8]; float score[3]; float avr;} stu[N]; int main(){ int i,j,maxi; float sum,max,average; for(i=0;i { printf(“input scores of student %d:n”,i+1); printf(“NO.:”); scanf(“%s”,stu[i].num); printf(“name:”); scanf(“%s”,stu[i].name); for(j=0;j<3;j++) { printf(“score %d:”,j+1); scanf(“%f”,&stu[i].score[j]); } } average=0; max=0; maxi=0; for(i=0;i { sum=0; for(j=0;j<3;j++) sum+=stu[i].score[j]; stu[i].avr=sum/3.0; average+=stu[i].avr; if(sum>max) { max=sum; maxi=i; } } average/=N; printf(“ NO.name score1 score2 score3 averagen”); for(i=0;i for(j=0;j<3;j++) printf(“%9.2f”,stu[i].score[j]); printf(“ %8.2fn”,stu[i].avr); } printf(“average=%5.2fn”,average); printf(“The highest score is : student %s,%sn”,stu[maxi].num,stu[maxi].name);printf(“his scores are:%6.2f,%6.2f,%6.2f,average:%5.2f.n”,stu[maxi].score[0],stu[maxi].score[1],stu[maxi].score[2],stu[maxi].avr);return 0;}(3)建立一个链表,每个结点包括:学号,姓名,性别,年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。(要求文件名:8_3.c) #include char num[6];char name[8];char sex[2];int age;struct student *next;} stu[10]; int main(){ struct student *p,*pt,*head;int i,length,iage,flag=1;int find=0; //找到待删除元素 find=1,否则find=0 while(flag==1){ printf(“input length of list(<10):”); scanf(“%d”,&length); if(length<10) flag=0;} //建立链表 for(i=0;i p=(struct student *)malloc(LEN); if(i==0) head=pt=p; else pt->next=p; pt=p; printf(“NO.:”); scanf(“%s”,p->num); printf(“name:”); scanf(“%s”,p->name); printf(“sex:”); scanf(“%s”,p->sex); printf(“age:”); scanf(“%d”,&p->age); } p->next=NULL; p=head;printf(“n NO.name sex agen”); //显示 while(p!=NULL){ printf(“%4s%8s%6s%6dn”,p->num,p->name,p->sex,p->age); p=p->next;} // 删除 printf(“input age:”); //输入待删年龄 scanf(“%d”,&iage);pt=head;p=pt; if(pt->age==iage) //链头是待删元素 { p=pt->next; head=pt=p; find=1; } else //链头不是待删元素 pt=pt->next; while(pt!=NULL){ if(pt->age==iage) { p->next=pt->next; find=1; } else // 中间结点不是待删元素 p=pt; pt=pt->next; } if(!find) printf(“ not found %d.”,iage); p=head; printf(“n NO.name sex agen”);//显示结果 while(p!=NULL){ printf(“%4s%8s”,p->num,p->name); printf(“%6s%6dn”,p->sex,p->age); p=p->next; } return 0;} 三、实验报告要求 将题目3的源程序、运行结果,以及实验中遇到的问题和解决问题的方法,以及实验过程中的心得体会,写在实验报告上。 实验九 文件操作 一、实验目的 1.掌握文件和文件指针的概念以及文件的定义方法。 2.了解文件打开和关闭的概念和方法。 3.掌握有关文件的函数。 二、实验内容和源程序清单、测试数据、结果。 (1)对data.dat文件写入100条记录。(要求文件名:8_1.c) #include int i; float x; fp=fopen(“c:data.dat”,“w”); for(i=1;i<=100;i++) { scanf(“%f”,&x); fprintf(fp,“%fn”,x); } fclose(fp); return 0;} (2)设有一文件cj.dat存放了50个人的成绩(英语、计算机、数学),存放格式为:每人一行,成绩间由逗号分隔。计算三门课平均成绩,统计个人平均成绩大于或等于90分的学生人数。(要求文件名:8_2.c) #include int num=0; float x , y , z , s1 , s2 , s3; fp=fopen(“c:cj.dat”,“r”); while(!feof(fp)) { fscanf(fp,“%f,%f,%f”,&x,&y,&z); s1=s1+x; s2=s2+y; s3=s3+z; if((x+y+z)/3>=90) num=num+1; } printf(“分数高于90的人数为:%dn”,num); fclose(fp); return 0;} (3)统计上题cj.dat文件中每个学生的总成绩,并将原有数据和计算出的总分数存放在磁盘文件“stud”中。(要求文件名:8_3.c) #include “stdio.h” int main(){ FILE *fp1,*fp2; float x,y,z; fp1=fopen(“c:cj.dat”,“r”); fp2=fopen(“c:stud”,“w”); } while(!feof(fp1)){ fscanf(fp1,“%f,%f,%f”,&x,&y,&z); printf(“%f,%f,%f,%fn”,x,y,z,x+y+z); fprintf(fp2,“%f,%f,%f,%fn”,x,y,z,x+y+z);} fclose(fp1);fclose(fp2);return 0; 三、实验报告要求 将题目1、2和3的源程序、运行结果,以及实验中遇到的问题和解决问题的方法,以及实验过程中的心得体会,写在实验报告上。 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];第四篇:C高级语言程序设计实验内容
第五篇:C语言程序设计