搜档网
当前位置:搜档网 › nios2+c语言编程方法Nios2系列教程

nios2+c语言编程方法Nios2系列教程

nios2+c语言编程方法Nios2系列教程
nios2+c语言编程方法Nios2系列教程

最小的Nios2系统

前言

2003年Altera推出了第一代32位Nios系统,开创了FPGA内构建高性能单片机的先河。随之2004年,Nios系统升级为Nios2系统,解决了软硬件开发中一些不方便的问题,软件开发环境从命令行编译转移到Eclips的IDE集成开放环境。Nios2开发环境从1.0、1.1到1.2逐步升级。后来为了和QuartusII软件升级同步,从QuartusII5.0版本开始Nios2的版本号正式和QuartusII统一。

作者我亲身经历过整个Nios2发展历程,深知Nios2的不同版本发生的巨大变化。目前网上流行的Nios2教程针对的版本相对较老,已经对初学者学习Nios2起不到指导作用,并且应广大爱好者的强烈要求,我在此使用QuartusII和Nios2的8.0版本详细叙述Nios2的开发流程。构建一个Nios2最小系统需要什么

构建一个Nios2最小系统需要具备以下资源:

★Nios2软核处理器

★内存

★Jtag_uart调试接口

1. Nios2软核处理器:这就是Nios2处理器的核心CPU,所有的外设都是和这个CPU通过Avalon总线连接到一起的。

2. 内存:编译后的程序代码需要通过下载线下载到该内存中,然后CPU的程序指针跳转到内存的首地址开始执行程序。

3. Jtag_uart调试接口:想要用单步调试等调试功能控制程序执行和查看程序变量,那么就需要这个调试接口。

开始构建一个再简单不过的Nios2工程

整个步骤由2部分组成,第一部分建立Nios2硬件SOPC工程,第二部分建立Nios2软件工程。

1.建立Nios2硬件SOPC工程

建立Nios2硬件SOPC工程就是设计一个软核CPU和它的外设,编译成硬件电路放到FPGA芯片里面。这时候可以认为FPGA就是一个32位的单片机了,下面的软件开发都是针对这个单片机的。

打开QuartusII软件,新建一个工程选择EP2C8Q208C8芯片。

打开Tools->SOPC Builder菜单,进入SOPC Builder界面,新建一个名为nios32的SOPC文件,语言可以选择VHDL或者VerilogHDL。我们一共要添加3个IP模块:Nios2处理器、片上内存和Jtag_uart 调试接口。

1.1在左边的IP导航栏里面双击选择NiosII Processor,然后选择Nios II/e型的处理器。这个处理器占用FPGA逻辑资源最小。此时CPU的Reset Vector和Exception Vector都是不可选的,因为还没有设置内存。在

添加了内存后,还要回到这个CPU设置里面设置这两项信息。

1.2在左边的IP导航栏里选择On-Chip Memory(RAM or ROM)

使用默认设置就可以了,RAM类型,32位数据宽度,4KB字节容量。1.3在左边的IP导航栏里选择jtag_uart

使用默认设置就可以了。

1.4最后建成的Nios2系统见下面的连接关系图:

Avalon总线的连接关系图下图:

图中实心的圆圈代表连接,空心的圆圈代表不连接。cpu做为主设备Onchip_mem和jtag_uart作为从设备,从设备通过数据总线和指令总线连接到主设备上。Onchip_mem比较特殊,它既连接到cpu的指令总线上,又连接到数据总线上。这跟我们设计有关,我们是通过调试接口将程序下载到Onchip_mem中,程序然后从Onchip_mem开始执行指令。程序中产生的变量同时也是存放在Onchip_mem中的。

1.5新建一个Block Diagram/Schematic File作为工程的顶层文件,将刚才制作的Nios32的symbol添加到bdf文件里。添加时钟和复位信号管脚,定义管脚的管脚号。最后编译工程,这样Nios2硬件部分的开发就算完成了,可以看到生成的sof和pof下载文件。

2.建立Nios2软件工程

建立Nios2软件工程和开发51单片机程序差不多,但是具体细节设置的地方有很多差异的地方。

2.1新建工程

打开Nios2软件IDE开发环境,新建一个NiosII C/C++ Application 的工程。Nios2开发环境还自带了很多模版例子工程,我们这里选择Hello World Small工程。和51开发不同的是,Nios2可以自定义很多外设。因此不同的Nios2工程添加的外设可能都不同,需要在新建工程的时候指定你所要开发的那个Nios2硬件工程。这点很关键,这就是软件工程和硬件工程结合的地方。

一般新建一个工程时,系统会同时建立一个和该应用程序对应的库工程。库工程里面编译了指定Nios2硬件的外设驱动程序等api函数。这样就将应用程序和驱动库分离开来,方便用户管理。开发不同的应用程序时,可以共享一个驱动库。

2.2编译工程

建立工程后我们会在导航栏里面看到又两个新建的工程:hello_world_small_0和hello_world_small_0_syslib。

点击编译按钮直接编译工程,最后查看编译结果。

最终生成hello_world_small_0.elf二进制文件,程序代码大小为560个直接,内存剩余3536个字节。

2.3软件在线调试工程

工程编译成功后就可以用下载线调试你的程序了。在Run->Debug菜单里设置下载线和需要调试的软件工程。

Main页面和Target Connection页面里的设置完成后可以点击Debug按钮进行调试。此时Nios2的开发环境将刚才编译的二进制代码通过USB Blaster下载电缆,下载到FPGA片内的onchip-memory中,然后将Nios2的指令指针指向程序的第一条语句。注意,在调试程序前必须将硬件开发过程中生成的sof文件下载到FPGA里,否则FPGA里面是没有Nios2的CPU软核,程序将无法下载。

这时程序会停在man函数的第一条语句,点击全速运行按键,我们会在控制台里面看到程序运行的结果。程序在控制台里打出一段字符串,这就是整个程序的运行结果。

总结

上面我们通过建立一个Nios2的最小系统,带领大家走过了从硬件到软件整个开发流程,看到了Nios2运行的结果。通过这个简单的例子,我们劈开了很多复杂繁琐的设置过程,让Nios2清晰的展现在大家面前。Nios2的开发不是想象中那么神秘,我们只要循序渐进的学习才能真正领会Nios2的强大和灵活。

上面的例子只是展示了一个可以运行的Nios2,它的功能非常简单,简单到只能完成打印一行字符串。由于受到FPGA片内存储器资源的限制,我们不能构建功能更加强大的代码,因此需要片外扩展Sdram

来存储更大的程序代码。另外,我们的程序是在线下载到内存里面的,断电后程序代码也会消失,我们需要一个外部非易失的存储器如Flash 来存储CPU的软件代码。

下一篇教程,我们将介绍如何扩展外部存储器Sdram和Flash。程序代码:

nios2 c语言编程方法Nios2系列教程2

nios2的C语言和X86或者单片机C语言很相似,上层的标准C库函数都是一样的,区别在于与底层硬件相关的各个外设寄存器的结构不同。如果我们把访问底层硬件寄存器的函数封装起来供上层调用,平台之间的移植就显得很容易了。

下面我总结了一些外设的寄存器结构以及用于访问寄存器的函数。

1.可编程输入、输出口PIO

//Defined in pio_struct.h

// PIO Peripheral

// PIO Registers

typedef volatile struct

{

int np_piodata; // read/write, up to 32 bits

int np_piodirection; // write/readable, up to 32 bits, 1->output bit

int np_piointerruptmask; // write/readable, up to 32 bits, 1->enable interrupt

int np_pioedgecapture; // read, up to 32 bits, cleared by any write

} np_pio;

#define IOADDR_ALTERA_A V ALON_PIO_DATA(base) __IO_CALC_ADDRESS_NATIVE(base, 0)

#define IORD_ALTERA_A V ALON_PIO_DATA(base) IORD(base, 0)

#define IOWR_ALTERA_A V ALON_PIO_DATA(base, data) IOWR(base, 0, data)

#define IOADDR_ALTERA_AV ALON_PIO_DIRECTION(base) __IO_CALC_ADDRESS_NATIVE(base, 1)

#define IORD_ALTERA_A V ALON_PIO_DIRECTION(base) IORD(base, 1)

#define IOWR_ALTERA_A V ALON_PIO_DIRECTION(base, data) IOWR(base, 1, data)

#define IOADDR_ALTERA_A V ALON_PIO_IRQ_MASK(base) __IO_CALC_ADDRESS_NATIVE(base, 2)

#define IORD_ALTERA_A V ALON_PIO_IRQ_MASK(base) IORD(base, 2)

#define IOWR_ALTERA_A V ALON_PIO_IRQ_MASK(base, data) IOWR(base, 2, data)

#define IOADDR_ALTERA_A V ALON_PIO_EDGE_CAP(base) __IO_CALC_ADDRESS_NATIVE(base, 3)

#define IORD_ALTERA_A V ALON_PIO_EDGE_CAP(base) IORD(base, 3)

#define IOWR_ALTERA_A V ALON_PIO_EDGE_CAP(base, data) IOWR(base, 3, data)

2。可编程定时器

// Timer Peripheral

// Timer Registers

typedef volatile struct

{

int np_timerstatus; // read only, 2 bits (any write to clear TO)

int np_timercontrol; // write/readable, 4 bits

int np_timerperiodl; // write/readable, 16 bits

int np_timerperiodh; // write/readable, 16 bits

int np_timersnapl; // read only, 16 bits

int np_timersnaph; // read only, 16 bits

} np_timer;

// Timer Register Bits

enum

{

np_timerstatus_run_bit = 1, // timer is running

np_timerstatus_to_bit = 0, // timer has timed out

np_timercontrol_stop_bit = 3, // stop the timer

np_timercontrol_start_bit = 2, // start the timer

np_timercontrol_cont_bit = 1, // continous mode

np_timercontrol_ito_bit = 0, // enable time out interrupt

np_timerstatus_run_mask = (1<<1), // timer is running

np_timerstatus_to_mask = (1<<0), // timer has timed out

np_timercontrol_stop_mask = (1<<3), // stop the timer

np_timercontrol_start_mask = (1<<2), // start the timer

np_timercontrol_cont_mask = (1<<1), // continous mode

np_timercontrol_ito_mask = (1<<0) // enable time out interrupt

};

#define IOADDR_ALTERA_A V ALON_TIMER_STATUS(base) __IO_CALC_ADDRESS_NATIVE(base, 0) #define IORD_ALTERA_A V ALON_TIMER_STATUS(base) IORD(base, 0)

#define IOWR_ALTERA_A V ALON_TIMER_STATUS(base, data) IOWR(base, 0, data)

#define ALTERA_A V ALON_TIMER_STATUS_TO_MSK (0x1)

#define ALTERA_A V ALON_TIMER_STATUS_TO_OFST (0)

#define ALTERA_A V ALON_TIMER_STATUS_RUN_MSK (0x2)

#define ALTERA_A V ALON_TIMER_STATUS_RUN_OFST (1)

#define IOADDR_ALTERA_A V ALON_TIMER_CONTROL(base) __IO_CALC_ADDRESS_NATIVE(base, 1) #define IORD_ALTERA_A V ALON_TIMER_CONTROL(base) IORD(base, 1)

#define IOWR_ALTERA_A V ALON_TIMER_CONTROL(base, data) IOWR(base, 1, data)

#define ALTERA_A V ALON_TIMER_CONTROL_ITO_MSK (0x1)

#define ALTERA_A V ALON_TIMER_CONTROL_ITO_OFST (0)

#define ALTERA_A V ALON_TIMER_CONTROL_CONT_MSK (0x2)

#define ALTERA_A V ALON_TIMER_CONTROL_CONT_OFST (1)

#define ALTERA_A V ALON_TIMER_CONTROL_START_MSK (0x4)

#define ALTERA_A V ALON_TIMER_CONTROL_START_OFST (2)

#define ALTERA_A V ALON_TIMER_CONTROL_STOP_MSK (0x8)

#define ALTERA_A V ALON_TIMER_CONTROL_STOP_OFST (3)

#define IOADDR_ALTERA_A V ALON_TIMER_PERIODL(base) __IO_CALC_ADDRESS_NATIVE(base, 2) #define IORD_ALTERA_A V ALON_TIMER_PERIODL(base) IORD(base, 2)

#define IOWR_ALTERA_A V ALON_TIMER_PERIODL(base, data) IOWR(base, 2, data)

#define ALTERA_A V ALON_TIMER_PERIODL_MSK (0xFFFF)

#define ALTERA_A V ALON_TIMER_PERIODL_OFST (0)

#define IOADDR_ALTERA_A V ALON_TIMER_PERIODH(base) __IO_CALC_ADDRESS_NATIVE(base, 3) #define IORD_ALTERA_A V ALON_TIMER_PERIODH(base) IORD(base, 3)

#define IOWR_ALTERA_A V ALON_TIMER_PERIODH(base, data) IOWR(base, 3, data)

#define ALTERA_A V ALON_TIMER_PERIODH_MSK (0xFFFF)

#define ALTERA_A V ALON_TIMER_PERIODH_OFST (0)

#define IOADDR_ALTERA_A V ALON_TIMER_SNAPL(base) __IO_CALC_ADDRESS_NATIVE(base, 4) #define IORD_ALTERA_A V ALON_TIMER_SNAPL(base) IORD(base, 4)

#define IOWR_ALTERA_A V ALON_TIMER_SNAPL(base, data) IOWR(base, 4, data)

#define ALTERA_A V ALON_TIMER_SNAPL_MSK (0xFFFF)

#define ALTERA_A V ALON_TIMER_SNAPL_OFST (0)

#define IOADDR_ALTERA_A V ALON_TIMER_SNAPH(base) __IO_CALC_ADDRESS_NATIVE(base, 5) #define IORD_ALTERA_A V ALON_TIMER_SNAPH(base) IORD(base, 5)

#define IOWR_ALTERA_A V ALON_TIMER_SNAPH(base, data) IOWR(base, 5, data)

#define ALTERA_A V ALON_TIMER_SNAPH_MSK (0xFFFF)

#define ALTERA_A V ALON_TIMER_SNAPH_OFST (0)

// Timer Routines

int nr_timer_milliseconds(void); // Starts on first call, hogs timer1.

// file: timer_milliseconds.c

//

// A simple milliseconds counter that REQUIRES a timer

// named na_timer1, and hogs it completely up.

//

#include "excalibur.h"

#ifdef na_timer1

static void timer_isr_handler(int context);

static int milliseconds_count;

int nr_timer_milliseconds(void)

{

static int running_yet = 0;

if(!running_yet)

{

milliseconds_count = 0;

nr_installuserisr(na_timer1_irq,timer_isr_handler,0);

na_timer1->np_timerperiodl = (nasys_clock_freq_1000) & 0x0000ffff;

na_timer1->np_timerperiodh = (nasys_clock_freq_1000 >> 16) & 0x0000ffff;

na_timer1->np_timercontrol =

np_timercontrol_start_mask

| np_timercontrol_cont_mask

| np_timercontrol_ito_mask;

running_yet = 1;

}

return milliseconds_count;

}

static void timer_isr_handler(int context)

{

milliseconds_count++;

na_timer1->np_timerstatus = 0; // write to clear the IRQ }

#endif

// end of file

3。通用异步串行口

// UART Registers

typedef volatile struct

{

int np_uartrxdata; // Read-only, 8-bit

int np_uarttxdata; // Write-only, 8-bit

int np_uartstatus; // Read-only, 8-bit

int np_uartcontrol; // Read/Write, 9-bit

int np_uartdivisor; // Read/Write, 16-bit, optional

int np_uartendofpacket; // Read/Write, end-of-packet character } np_uart;

// UART Status Register Bits

enum

{

np_uartstatus_eop_bit = 12,

np_uartstatus_cts_bit = 11,

np_uartstatus_dcts_bit = 10,

np_uartstatus_e_bit = 8,

np_uartstatus_rrdy_bit = 7,

np_uartstatus_trdy_bit = 6,

np_uartstatus_tmt_bit = 5,

np_uartstatus_toe_bit = 4,

np_uartstatus_roe_bit = 3,

np_uartstatus_brk_bit = 2,

np_uartstatus_fe_bit = 1,

np_uartstatus_pe_bit = 0,

np_uartstatus_eop_mask = (1<<12),

np_uartstatus_cts_mask = (1<<11),

np_uartstatus_dcts_mask = (1<<10),

np_uartstatus_e_mask = (1<<8),

np_uartstatus_rrdy_mask = (1<<7),

np_uartstatus_trdy_mask = (1<<6),

np_uartstatus_tmt_mask = (1<<5),

np_uartstatus_toe_mask = (1<<4),

np_uartstatus_roe_mask = (1<<3),

np_uartstatus_brk_mask = (1<<2),

np_uartstatus_fe_mask = (1<<1),

np_uartstatus_pe_mask = (1<<0)

};

// UART Control Register Bits

enum

{

np_uartcontrol_ieop_bit = 12,

np_uartcontrol_rts_bit = 11,

np_uartcontrol_idcts_bit = 10,

np_uartcontrol_tbrk_bit = 9,

np_uartcontrol_ie_bit = 8,

np_uartcontrol_irrdy_bit = 7,

np_uartcontrol_itrdy_bit = 6,

np_uartcontrol_itmt_bit = 5,

np_uartcontrol_itoe_bit = 4,

np_uartcontrol_iroe_bit = 3,

np_uartcontrol_ibrk_bit = 2,

np_uartcontrol_ife_bit = 1,

np_uartcontrol_ipe_bit = 0,

np_uartcontrol_ieop_mask = (1<<12),

np_uartcontrol_rts_mask = (1<<11),

np_uartcontrol_idcts_mask = (1<<10),

np_uartcontrol_tbrk_mask = (1<<9),

np_uartcontrol_ie_mask = (1<<8),

np_uartcontrol_irrdy_mask = (1<<7),

np_uartcontrol_itrdy_mask = (1<<6),

np_uartcontrol_itmt_mask = (1<<5),

np_uartcontrol_itoe_mask = (1<<4),

np_uartcontrol_iroe_mask = (1<<3),

np_uartcontrol_ibrk_mask = (1<<2),

np_uartcontrol_ife_mask = (1<<1),

np_uartcontrol_ipe_mask = (1<<0)

};

#define IOADDR_ALTERA_A V ALON_UART_RXDATA(base) __IO_CALC_ADDRESS_NATIVE(base, 0) #define IORD_ALTERA_A V ALON_UART_RXDATA(base) IORD(base, 0)

#define IOWR_ALTERA_A V ALON_UART_RXDATA(base, data) IOWR(base, 0, data)

#define IOADDR_ALTERA_A V ALON_UART_TXDATA(base) __IO_CALC_ADDRESS_NATIVE(base, 1) #define IORD_ALTERA_A V ALON_UART_TXDATA(base) IORD(base, 1)

#define IOWR_ALTERA_A V ALON_UART_TXDATA(base, data) IOWR(base, 1, data)

#define IOADDR_ALTERA_A V ALON_UART_STATUS(base) __IO_CALC_ADDRESS_NATIVE(base, 2) #define IORD_ALTERA_A V ALON_UART_STATUS(base) IORD(base, 2)

#define IOWR_ALTERA_A V ALON_UART_STATUS(base, data) IOWR(base, 2, data)

#define ALTERA_A V ALON_UART_STATUS_PE_MSK (0x1)

#define ALTERA_A V ALON_UART_STATUS_PE_OFST (0)

#define ALTERA_A V ALON_UART_STATUS_FE_MSK (0x2)

#define ALTERA_A V ALON_UART_STATUS_FE_OFST (1)

#define ALTERA_A V ALON_UART_STATUS_BRK_MSK (0x4)

#define ALTERA_A V ALON_UART_STATUS_BRK_OFST (2)

#define ALTERA_A V ALON_UART_STATUS_ROE_MSK (0x8)

#define ALTERA_A V ALON_UART_STATUS_ROE_OFST (3)

#define ALTERA_A V ALON_UART_STATUS_TOE_MSK (0x10)

#define ALTERA_A V ALON_UART_STATUS_TOE_OFST (4)

#define ALTERA_A V ALON_UART_STATUS_TMT_MSK (0x20)

#define ALTERA_A V ALON_UART_STATUS_TMT_OFST (5)

#define ALTERA_A V ALON_UART_STATUS_TRDY_MSK (0x40)

#define ALTERA_A V ALON_UART_STATUS_TRDY_OFST (6)

#define ALTERA_A V ALON_UART_STATUS_RRDY_MSK (0x80)

#define ALTERA_A V ALON_UART_STATUS_RRDY_OFST (7)

#define ALTERA_A V ALON_UART_STATUS_E_MSK (0x100)

#define ALTERA_A V ALON_UART_STATUS_E_OFST (8)

#define ALTERA_A V ALON_UART_STATUS_DCTS_MSK (0x400)

#define ALTERA_A V ALON_UART_STATUS_DCTS_OFST (10)

#define ALTERA_A V ALON_UART_STATUS_CTS_MSK (0x800)

#define ALTERA_A V ALON_UART_STATUS_CTS_OFST (11)

#define ALTERA_A V ALON_UART_STATUS_EOP_MSK (0x1000)

#define ALTERA_A V ALON_UART_STATUS_EOP_OFST (12)

#define IOADDR_ALTERA_A V ALON_UART_CONTROL(base) __IO_CALC_ADDRESS_NATIVE(base, 3) #define IORD_ALTERA_A V ALON_UART_CONTROL(base) IORD(base, 3)

#define IOWR_ALTERA_A V ALON_UART_CONTROL(base, data) IOWR(base, 3, data)

#define ALTERA_A V ALON_UART_CONTROL_PE_MSK (0x1)

#define ALTERA_A V ALON_UART_CONTROL_PE_OFST (0)

#define ALTERA_A V ALON_UART_CONTROL_FE_MSK (0x2)

#define ALTERA_A V ALON_UART_CONTROL_FE_OFST (1)

#define ALTERA_A V ALON_UART_CONTROL_BRK_MSK (0x4)

#define ALTERA_A V ALON_UART_CONTROL_BRK_OFST (2)

#define ALTERA_A V ALON_UART_CONTROL_ROE_MSK (0x8)

#define ALTERA_A V ALON_UART_CONTROL_ROE_OFST (3)

#define ALTERA_A V ALON_UART_CONTROL_TOE_MSK (0x10)

#define ALTERA_A V ALON_UART_CONTROL_TOE_OFST (4)

#define ALTERA_A V ALON_UART_CONTROL_TMT_MSK (0x20)

#define ALTERA_A V ALON_UART_CONTROL_TMT_OFST (5)

#define ALTERA_A V ALON_UART_CONTROL_TRDY_MSK (0x40)

#define ALTERA_A V ALON_UART_CONTROL_TRDY_OFST (6)

#define ALTERA_A V ALON_UART_CONTROL_RRDY_MSK (0x80)

#define ALTERA_A V ALON_UART_CONTROL_RRDY_OFST (7)

#define ALTERA_A V ALON_UART_CONTROL_E_MSK (0x100)

#define ALTERA_A V ALON_UART_CONTROL_E_OFST (8)

#define ALTERA_A V ALON_UART_CONTROL_DCTS_MSK (0x400)

#define ALTERA_A V ALON_UART_CONTROL_DCTS_OFST (10)

#define ALTERA_A V ALON_UART_CONTROL_RTS_MSK (0x800)

#define ALTERA_A V ALON_UART_CONTROL_RTS_OFST (11)

#define ALTERA_A V ALON_UART_CONTROL_EOP_MSK (0x1000)

#define ALTERA_A V ALON_UART_CONTROL_EOP_OFST (12)

#define IOADDR_ALTERA_A V ALON_UART_DIVISOR(base) __IO_CALC_ADDRESS_NATIVE(base, 4)

#define IORD_ALTERA_A V ALON_UART_DIVISOR(base) IORD(base, 4)

#define IOWR_ALTERA_A V ALON_UART_DIVISOR(base, data) IOWR(base, 4, data)

#define IOADDR_ALTERA_A V ALON_UART_EOP(base) __IO_CALC_ADDRESS_NATIVE(base, 5)

#define IORD_ALTERA_A V ALON_UART_EOP(base) IORD(base, 5)

#define IOWR_ALTERA_A V ALON_UART_EOP(base, data) IOWR(base, 5, data)

#define ALTERA_A V ALON_UART_EOP_MSK (0xFF)

#define ALTERA_A V ALON_UART_EOP_OFST (0)

// UART Routines

int nr_uart_rxchar(np_uart *uartBase); // 0 for default UART

void nr_uart_txcr(void);

void nr_uart_txchar(int c,np_uart *uartBase); // 0 for default UART

void nr_uart_txhex(int x); // 16 or 32 bits

void nr_uart_txhex16(short x);

void nr_uart_txhex32(long x);

void nr_uart_txstring(char *s);

nios2软件开发环境提供了HAL系统库(HAL System Library),它是联系上层应用软件和下层设备驱动软件的接口。它可以让应用软件调用标准的C语言库函数而不必要关心底层硬件如何实现。不同的硬件平台都有各自的HAL硬件抽象层,nios2也不例外。

我们软件开发的任务不但要熟悉标准c语言如何与HAL层接口,而且要会开发新扩充硬件的驱动程序以及和HAL 层接口。

下面我们看看HAL层所提供的函数集。

1。首先我们需要了解一个很重要的关于文件的结构体,所有关于文件和设备操作都要用到这个结构体。

文件描述符结构定义

/*

* The file descriptor structure definition.

*/

typedef struct alt_fd_s

{

alt_dev* dev;

alt_u8* priv;

int fd_flags;

} alt_fd;

设备结构定义

/*

* The device structure definition.

*/

struct alt_dev_s {

alt_llist llist; /* for internal use */

const char* name;

int (*open) (alt_fd* fd, const char* name, int flags, int mode);

int (*close) (alt_fd* fd);

int (*read) (alt_fd* fd, char* ptr, int len);

int (*write) (alt_fd* fd, const char* ptr, int len);

int (*lseek) (alt_fd* fd, int ptr, int dir);

int (*fstat) (alt_fd* fd, struct stat* buf);

int (*ioctl) (alt_fd* fd, int req, void* arg);

};

所有对设备操作的函数最终都是由设备结构内定义的相关函数完成的。例如我们用open(file_name,flag,mode)函数对一个

设备的文件描述符进行打开操作,经过HAL曾的过滤就会重定向到设备驱动内的open()函数来完成这个操作。理解这一点就能

理解标准C语言库函数、HAL硬件抽象层和设备驱动程序三者之间的关系了。这对于理解软件运行的流程和进行跟踪调试都是

有很大帮助的。

下面我们分析一下一个程序从开始运行到结束的整个过程.

/*

* alt_main is the C entry point for the HAL. It is called by the assembler

* startup code in the processor specific crt0.S. It is responsible for:

* completing the C runtime configuration; configuring all the

* devices/filesystems/components in the system; and call the entry point for

* the users application, i.e. main().

*/

//alt_main 是C程序的HAL入口,它是由用汇编写的启动代码所调用的。

//他的功能是完成C程序的配置运行环境,配置系统内所有的硬件外设、文件系统和组件,

//然后再调用用户main()程序的入口.

void alt_main (void)

{

/* Initialise the interrupt controller. */

//初始化中断控制器

alt_irq_init (ALT_IRQ_BASE);

/* Initialise the operating system */

//初始化操作系统(如果有的话)

ALT_OS_INIT();

/*

* Initialise the semaphore used to control access to the file descriptor

* list.

*/

//初始化访问文件描述表的信号灯

ALT_SEM_CREATE (&alt_fd_list_lock, 1);

/* Initialise the device drivers/software components. */

//初始化设备驱动

alt_sys_init ();

/*

* Redirect stdout etc. to the apropriate devices now that the devices have

* been initialised. This is only done if the user has requested that the

* channels been directed away from /dev/null - which is how the channels

* are configured by default. Making the call to alt_io_redirect conditional

* allows this function to be excluded from optomised executables when it

* is unecessary.

*/

//重定向标准输出设备

if (strcmp (ALT_STDOUT, "/dev/null") ||

strcmp (ALT_STDIN, "/dev/null") ||

strcmp (ALT_STDERR, "/dev/null"))

{

alt_io_redirect (ALT_STDOUT, ALT_STDIN, ALT_STDERR);

}

/* Call the C++ constructors */

//调用C++构造函数

_do_ctors ();

/*

* Set the C++ destructors to be called at system shutdown. This is only done

* if a clean exit has been requested (i.e. the exit() function has not been

* redefined as _exit()). This is in the interest of reducing code footprint,

* in that the atexit() overhead is removed when it's not needed.

*/

//为系统关闭时设置C++析构函数

#ifndef ALT_NO_CLEAN_EXIT

atexit (_do_dtors);

#endif

/*

* Finally, call main(). The return code is then passed to a subsequent

* call to exit().

*/

//最后调用用户main()函数,直到程序结束退出

exit (main (alt_argc, alt_argv, alt_envp));

}

中断处理在NIOS2里被称作异常处理(包括硬件和软件),所有的异常共享一个中断句柄。异常有以下两种:

(1)硬件中断异常

(2)软件异常:i.未实现的指令异常。ii.软件陷阱。iii.其它异常。

使用HAL系统库提供的ISR服务程序可以完全不必了解异常处理是如何实现的。

他通过一定的算法来判断是发生了硬件中断还是软件中断。这个算法使用了如下几个程序:

_irq_entry();

alt_irq_handle();

software_exception();

这几个子程序在/components/altera_nios2/HAL/inc/sys/alt_irq_entry.h

中有定义。

用HAL系统库提供的API能够很方便的构造和维护中断服务程序。在处理中断前我们必须做两件事情来做好准备:

1.编写中断服务子程序。(与我们一般的中断服务程序不同的是它不需要用关键字interrupt

来指明中断服务程序)

2.注册中断服务程序。(这就是告诉编译器哪个中断对应哪个中断服务程序)

注册中断服务程序的子函数原型为:

int alt_irq_register (alt_u32 id,void* context,void (*isr)(void*, alt_u32));

id:中断号

context:中断服务程序与外界的参数传递

*isr:中断服务程序的函数指针

用户的中断服务程序要遵循的约束条件

一般性的原则:用户的中断服务程序不要调用阻碍中断执行的函数,此外在调用标准C类库

中使用中断的子函数时要小心谨慎。

一个简单的例程

这个例程演示了如何使用中断服务程序来读PIO口上的按钮状态,通过读PIO口的边沿捕获寄存器,

后把读到的数据放在一个全局变量里。这个全局变量的地址是作为参数context传送到中断服务程序的。#include "system.h"

#include "altera_avalon_pio_regs.h"

#include "alt_types.h"

#include "alt_irq.h"

volatile int edge_capture;

static void handle_button_interrupts(void* context,alt_u32 id)

{

volatile int * edge_capture_ptr=(volatile int*)context;

*edge_capture_ptr=IORD_ALTERA_A V ALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);

IOWR_ALTERA_A V ALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0);

IOWR_ALTERA_A V ALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0xf);

}

void main(void)

{

alt_u32 *led=LED_PIO_BASE;

alt_u16 i;

IOWR_ALTERA_A V ALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xf);

IOWR_ALTERA_A V ALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x0);

alt_irq_register(BUTTON_PIO_IRQ,&edge_capture,handle_button_interrupts);

printf("Interrupt demo routine \n");

*(led+1)=3;

while(1)

{

if(edge_capture!=0)

{

printf("interrupted\n");

edge_capture=0;

}

}

return 0;

}

UART的寄存器:

UART 通过Avalon总线和一组寄存器文件打交道。UART有6个16位的寄存器。

它们是control,status,rxdata,txdata,divisor,endofpacket。

UART的中断:

当串口收到一个数据或者为发送一个字节准备好时,它就会产生一个高有效的中断信号。

UART的DMA操作:

UART支持流模式传输,因此它可以用来和存储器进行DMA操作。

UART的接口:

由于大多数FPGA芯片不支持RS-232的数据接口,因此它需要在片外加一个电平

转换芯片来完成电平转换。逻辑'0'代表数据为1,逻辑'1'代表数据为0。

发送逻辑单元:

UART内部的发送逻辑由发送保持寄存器(holding register)和发送移位寄存器(shifting register)

组成。当主设备向发送寄存器(txdata)写数据时,如果移位寄存器发送完上一个数据后,

就会把该数据载入。数据就会从最低位开始通过TXD引脚从位移寄存器一位一位移出。

由于有了保持寄存器和位移寄存器的双缓冲,串口在把数据移出的同时又可以向保持寄存器

写入新的数据。主端口还可以实时监控发送status寄存器,可以读取发送准备好位(trdy),

发送位移寄存器空位(tmt),发送溢出位(toe)。

接收逻辑单元:

UART内部的接收逻辑由接收保持寄存器(holding register)和接收移位寄存器(shifting register)

组成。当移位寄存器接收完一个完整的数据后,主设备就可以读取接收保持寄存器(txdata)的数据。

由于有了保持寄存器和位移寄存器的双缓冲,串口在把数据移到保持寄存器的同时,又可以向接收

位移寄存器移入新的数据了。主端口还可以实时监控接收status寄存器,可以读取接收准备好位(rrdy),

接收溢出位(roe),停止侦测位(brk),奇偶校验位(pe),帧错误位(fe)。

波特率的产生:

波特率可以通过以下两种方式产生:

1。在系统生成时设定固定的值。

2。设置16位的分配寄存器(divisor register)。

当波特率在系统生成时被设成固定值时,系统生成后是不能被改变的。相反,把波特率设成可变的话,在系统生成后,可以通过软件设定分配寄存器的值来改变波特率。

下面是波特率和分配因子的计算方法:

divisor = int( (clock frequency)/(baud rate) + 0.5 )

baud rate = (clock frequency)/(divisor + 1)

数据位数的设定:

数据的数据位、停止位、奇偶校验位在系统生成时是可以配置的。一旦系统生成后,这些参数是不能被

改变的。

数据流(DMA)的控制方式:

UART可以支持流模式的Avalon传送方式。这样可以使得uart准备好接受下一个字符时主端口才会向它发送数据,或者uart接收到数据时主端口才去读它接收的数据。此时可以设置SOPC Builder来选择给uart构造

end of packet寄存器。

在加入end of packet 寄存器后,uar就会在基地址+5的位置多了一个寄存器;在status寄存器中多一位

eop位;在control寄存器中多一位ieop位;在Avalon总线上多一个endofpacket信号用来和支持流模式数据

传输的主端口进行接口。如果没有设定该寄存器,则不会加入上述资源。

End-of-packet(EOP)侦测可以决定UART和支持流模式传输的Avalon主端口在什么时候中止流模式数据传输。EOP侦测可以和DMA控制器中一起使用,例如,可以实现将UART中接收到的数据自动写入存储器,直到接收到一个

特定的字符。这个中止字符的就是被写入到endofpacket寄存器的值。

软件编程模式:

HAL 系统库支持

Altera公司为Nios II系统提供了设备驱动,该驱动将HAL层的字符型设备驱动集成到了HAL系统库中。HAL用户可以通过熟悉的HAL API和ANSI C标准库,而不是访问UART的寄存器组。用户可以使用ioctl()请求来控制和uart硬件相关的操作。

(注:如果在程序中使用HAL设备驱动来访问UART的话,此时直接对设备的寄存器进行访问会干扰设备驱动的正常运行。)

对于Nios II CPU用户来说,HAL系统库的API提供了完整的对UART的访问函数。Nios II的程序把uart当成一个字符型的设备,发送和接收数据都使用ANSI C标准库函数。

下面的代码示范了一个最简单的应用,用printf()打印一段消息到stdout。在这个例子中HAL系统库已经

配置了一个串口作为stdout。

----------------------------------------------------------------------------------------------

#include

int main ()

{

printf("Hello world.\n");

return 0;

}

----------------------------------------------------------------------------------------------

下面的代码示范了如何通过C标准库从uart读字符和向uart发送消息。在这个例子中程序把该设备当成

和HAL文件系统中任何其他的节点一样来处理。

----------------------------------------------------------------------------------------------

/* A simple program that recognizes the characters 't' and 'v' */

#include

#include

int main ()

{

char* msg = "Detected the character 't'.\n";

FILE* fp;

char prompt = 0;

fp = fopen ("/dev/uart1", "r+"); //Open file for reading and writing

if (fp)

{

while (prompt != 'v')

{ // Loop until we receive a 'v'.

prompt = getc(fp); // Get a character from the UART.

if (prompt == 't')

{ // Print a message if character is 't'.

fwrite (msg, strlen (msg), 1, fp);

}

}

fprintf(fp, "Closing the UART file.\n");

fclose (fp);

}

return 0;

}

---------------------------------------------------------------------------------------------

驱动实现的两种选择:Fast vs. Small

根据不同系统的需要,uart驱动提供了两种形式:快速模式和小模式。快速模式是默认模式。这两种模式都支持C标准库函数和HAL API。

快速模式是一种中断实现方式,这种方式可以使得CPU在UART未准备好收发数据时做其他的事情。

小模式是一种查询方式,这种方式必须一直在等待uart准备好以后才能收发数据。使能小模式可以

通过两种方式:1。设置HAL系统库工程属性,开启small footprintf(这种方法也会影响其他设备驱动);2。定义预处理宏-DALTERA_AV ALON_UART_SMALL ,使用这个选项不会影响到其他设备的驱动。ioctl()操作:

uart驱动支持ioctl()函数,该函数允许程序基于HAL层的设备相关操作请求。

------------------------------------------------------------------------------------------

请求含义

TIOCEXCL 锁定设备避免被再次访问。对该设备用open()函数再次访问会失败,直到这个设备的文件描述符被关闭,或者用TIOCNXCL ioctl请求解锁。在使用该请求时

"arg"参数可忽略。

TIOCNXCL 对前一次的访问解锁。在使用该请求时"arg"参数可忽略。

以下请求只对快速模式有效:

TIOCMGET 向termios结构填入内容,返回当前的设备配置情况。指向这个结构的指针是作为ioctl的"opt"参数。

TIOCMSET 根据输入termios结构的值来配置设备。指向这个结构的指针是作为ioctl的 "arg"参数。

-----------------------------------------------------------------------------------------

termios结构在Newlib C标准库里被定义。在/components/altera_hal/HAL

/inc/sys/termios.h文件中有它的定义。

软件开发文件:

UART的核还配有以下软件开发文件。这些文件定义了底层硬件的接口,并且提供了HAL驱动。应用程序开发者不要去修改这些文件。

altera_avalon_uart_regs.h

该文件定义了寄存器映射,提供了符号名称来访问底层硬件。这些符号名称只是被设备驱动函数所使用。

altera_avalon_uart.h,altera_avalon_uart.c

该文件实现了uart HAL系统库的设备驱动。

另外,UART还支持第一代Nios处理器遗留的SDK子程序。

UART的中断行为:

UART会输出一个IRQ信号到Avalon总线接口,它可以和任何主设备接口,例如,Nios II处理器。主外设必须读status寄存器来决定是哪种类型中断。

每一种中断会在status和interrupt-enable寄存器中有相应的位。当任意一种中断条件满足时,

相应的寄存器位就会被置位,直到完全响应中断才会被清除。中断信号输出信号在任何status寄存器

的某一位被置位且那一位是被中断使能的。而主外设通过清除status寄存器来相应这个IRQ。

在系统复位时,所有的中断使能寄存器的位都被置为0,因此只有当主外设对中断使能寄存器的

一位或多位置1时,才能产生IRQ信号。

C语言程序设计教程 教学大纲

附件一 C语言程序设计 教学大纲

C语言程序设计 一、本大纲适用专业、层次、总课时 1.适用专业:计算机类 2.层次:大专 3.总课时:64学时 二、课程性质和任务 《C语言程序设计》是计算机应用专业的专业必修课程,主要任务是介绍C语言中的数据类型,运算,语句结构及其程序设计的基本方法。目的是使学生掌握一门高级程序设计语言,学会利用C语言解决一般应用问题,并为后续的专业课程奠定程序设计基础。《C语言程序设计》是一门实践性很强的课程,必须通过上机操作才能掌握所学的知识,所以要特别强调讲授与上机操作相结合,要保证学生有充分的上机条件。 三、课程的基本要求与目标 根据市场对高职网络人才培养规格的需求特点,本课程的总目标是:“以学生为主体,以学生的学习为中心”,通过课程的实施,帮助学生学会学习。使学生的知识、情感、技能得到全面发展,既为今后的专业课程学习打下良好的知识与技能基础,又培养良好的态度,为其将来从事专业活动和未来的职业生涯打下基础。课程内容以“学其所用,用其所学”突出高职教育特点,确保人才培养目标的实现。课程目标如下: (1)知识目标:要求学生掌握基本的程序编写技能。学会利用常见的C程序开发工具的使用,掌握开发环境的配置,掌握常见菜单命令的使用以及整个窗口的布局设置。掌握结构化或模块化程序设计技能,学会数组、函数、三大控制结构、结构体和共用体以及指针的使用。为软件后期维护和管理提供必要的技术支持。 (2)能力目标: C语言程序设计的课程开设是从学生的角度出发,注重培养学生良好的动手实践习惯,注重培养学生严谨的行事风格,尤其注重挖掘学生的潜质,注重培养与社会接轨,培养学生具有踏实工作作风,良好的观察和思考能力强以及团队合作能力。 (3)情感目标:学生提高自己的独立思考和判断能力,通过这种方式能够对工作任务进行有效分析和寻求解决方案;加强自身的程序设计实践能力;培养从事软件研发的职业素养。在学习过程中使学生学会利用网络资源与他人进行交流与

第5章-C语言程序设计(第2版)教材习题答案

【教材】《C语言程序设计(第2版)》清华大学出版社,黄保和,江弋编著。2011年10月第二版。ISBN:978-7-302-26972-4。售价:35元。 【答案版本】本习题答案为2012年2月修订版本。 一、选择题 1. 设有程序段”int k=10; while(k=0) k=k-1;”,则下面叙述正确的是D)循环体语句一次也不执行。 A. while循环执行10次 B. 循环是无限循环 C. 循环体语句执行一次 D. 循环体语句一次也不执行 2. 设有程序段”int x=0,s=0;while(!x!=0) s+=++x; printf(“%d”,s);”则A)运行程序段后输出1。 A. 运行程序段后输出1 B. 程序段执行无限次 C. 运行程序段后输出0 D. 程序段中的控制表达式是非法的 3. 下面循环语句中,错误的是D) int a=1,b=2;do b-- while(b= =0);。 A. int a=1,b=2; while(b--); B. int a=1,b=2; do a++; while(a==b); C. int a=1,b=2; while(a=3); D. int a=1,b=2; do b-- while(b==0); 4. 已知”int i=5;”,下列do…while循环语句的循环次数为C) 5。 do{ printf(“%d\n”,i--); } while(i!=0); A. 0 B. 1 C. 5 D. 无限 5. 循环语句”for(int i=0,j=10; i==j; i++,j--)”的循环次数是A) 0。 A. 0 B. 5 C. 10 D. 无限 6. 下述有关break语句的描述中,不正确的是C) break语句用于if语句的内嵌语句内,它结束该if语句。 A. break语句用于循环体内,它将结束该循环 B. break语句用于开关语句,它结束该开关语句 C. break语句用于if语句的内嵌语句内,它结束该if语句 D. break语句在一个循环体内可使用多次 7. 下面关于循环语句的描述中,错误的是B)循环体内必须同时出现break语句和continue 语句。 A. 循环体内可以包含有循环语句 B. 循环体内必须同时出现break语句和continue语句 C. 循环体内可以出现选择语句 D. 循环体可以是空语句 8. 以下不是死循环的是D)for(;(c=getchar()!=’\n’);)printf(“%c”,c);。 A. for(; ; x+=i); B. while(1) { x++; } C. for( i=10; ; i--) sum+=i; D. for( ; (c=getchar() )!=’\n’ ; ) printf( “%c”,c); 9. 执行语句”for(i=0;i++<3;);”后,变量i的值为C) 4。 A.2 B. 3 C. 4 D. 5 10.语句”for(x=0,y=0;y!=1&&x<4;x++);”是C)循环4次。 A. 无限循环 B. 循环次数不定 C. 循环4次 D. 循环3次

C语言程序设计课程设计报告

C语言程序设计课程设 计报告 内部编号:(YUUT-TBBY-MMUT-URRUY-UOOY-DBUYI-0128)

《C语言程序设计》课程设计报告 (2013— 2014学年第 3 学期) 题目: C语言课程设计 专业:软件工程 班级:软件工程技术2班 姓名学号: 1 林燕萍 指导教师:吴芸 成绩: 计算机科学与技术系 2014 年6月23日

目录 一、课程设计的目的与要求 (1) 二、方案实现与调试 (3) 2.1 掷骰子游戏 (5) 2.2 射击游戏 (7) 2.3 计算存款本息之和 (8) 2.4肇事逃逸 (10) 2.5 礼炮 (12) 2.6 汽车加油 (14) 2.7 大优惠 (16) 2.8 金币 (19) 三、课程设计分析与总结 (23) 附录程序清单 (25) 一、课程设计的目的与要求(含设计指标) C语言是一种编程灵活,特色鲜明的程序设计语言。C语言除了基知识,如概念,方法和语法规则之外更重要的是进行实训,以提高学习者的动手和编程能力,从应试课程转变为实践工具。这是学习语言的最终目的。结合多年来的教学经验,根据学生的学习情况,为配合教学过程,使“项目教学法”能在本质上促使学生有更大进步,特编写了该《C 语言程序设计任务书》,以在实训过程中给学生提供帮助。达到如下目的: 1.在课程结束之前,让学生进一步了解C程序设计语言的编程功能;

2.让学生扎实掌握C程序设计语言的相关知识; 3.通过一些有实际意义的程序设计,使学生体会到学以致用,并能将程序设计的知识与专业知识有效地结合,更全面系统地了解行业知识。 编写程序要求遵循如下基本要求: ①模块化程序设计 ②锯齿型书写格式 ③必须上机调试通过 二、方案实现与调试 2.1掷骰子游戏 2.1.1 题目内容的描述 1) 两人轮流掷骰子,每次掷两个,每人最多掷10次。 2) 将每人每次的分值累加计分 3) 当两个骰子点数都为6时,计8分;当两个点数相等且不为两个6时,计7分;当两个点数不一样时,计其中点数较小的骰子的点数。4) 结束条件:当双方都掷10次或经过5次后一方累计分数多出另一方的30%及以上。最后显示双方分数并判定优胜者。 2.1.2输入数据类型、格式和内容限制和输出数据的说明 数据类型:整型;内容限制:随机数的产生;输入数据结果:胜利的一方 2.1.3主要模块的算法描述

(完整版)C语言程序设计教程第五章练习题题目

单选题 1、关于数组的定义与初始化,下列哪一项是错误的() A.int arr[5] = {1,2,3,4,5}; B.int arr[] = {1,2,3,4,5}; C.int arr[5] = {1,2,3}; D.int arr[5] = {1,2,3,4,5,6}; 2、在定义数组int arr[10]后,下列选项中对arr的引用正确的是() A.arr[10] B.arr[6.3] C.arr(6) D.arr[0] 3、在C语言中,引用数组元素时,其数组下标的数据类型允许是() A.整型常量 B.整型表达式 C.整型常量或整型表达式 D.任何类型的表达式 4、若int arr[5] = {1,2,3}; 则arr[2]的值为() A.1 B.2 C.3 D.null 5、在执行int arr[][3] = {1,2,3,4,5,6}:语句后,arr[1][0]的值为() A.4 B.1 C.2 D.5 6、关于二维数组,下列选项能正确定义并赋初值的是() A.int n = 5,b[n][n]; B.int a[1][2] = {{1},{3}}; C.int c[2][] = {{1,2},{3,4}}; D.int a[3][2] = {{1,2},{3,4}}; 7、阅读下列程序段: char s[18] = "a book!"; printf("%.4s\n", s); 其输出结果为() A.a book! B.a book C.a bo D.a 8、阅读下列程序: int a[4][4] = { { 1, 3, 5, }, { 2, 4, 6 }, { 3, 5, 7 } }; printf("%d%d%d%d\n", a[0][0], a[1][1], a[2][2], a[3][3]);

C语言程序设计教程答案 杨路明 郭浩志

C语言程序设计教程 习题答案 总主编杨路明 主审郭浩志 文件摘自CSDN

习题1 1、算法描述主要是用两种基本方法:第一是自然语言描述,第二是使用专用工具进行算法描述 2、c语言程序的结构如下: 1、c语言程序由函数组成,每个程序必须具有一个main函数作为程序的主控函数。 2、"/*"与"*/"之间的内容构成c语言程序的注释部分。 3、用预处理命令#include可以包含有关文件的信息。 4、大小写字母在c语言中是有区别的。 5、除main函数和标准库函数以外,用户可以自己编写函数,程序一般由多个函数组成,这些函数制定实际所需要做的工作。 例如: void main() { int a,b,c,s; a=8;b=12;c=6; s=a+b*c; printf("s=%d\n",s); } 3、c语言的特点: 1、c语言具有结构语言的特点,程序之间很容易实现段的共享; 2、c语言的主要结构成分为函数,函数可以在程序中被定义完成独立的任务,独立地编译成代码,以实现程序的模块化。 3、c语言运算符丰富,运算包含的范围很广; 4、c语言数据类型丰富。 5、c语言允许直接访问物理地址,即可直接对硬件进行操作,实现汇编语言的大部分功能; 6、c语言语法限制不太严格,程序设计自由度大,这样是c语言能够减少对程序员的束缚; 7、用c语言编程,生成的目标代码质量高,程序执行效率高,可移植性好; 4、合法标识符:AB12、leed_3、EF3_3、_762、PAS、XYZ43K2 不合法标识符:a*b2、8stu、D.K.Jon、if、ave#xy、#_DT5、C.D 5、F2:将当前编辑器中文件存盘 F10:调用主菜单 F4:程序运行到光标所在行 Ctrl+F9:当前编辑环境下,进行编译、连接且运行程序; Alt+F5:将窗口切换到DOS下,查看程序运行结果 6、 (1): ******************** welcome you very good ******************** (2): please input three number;5,7,8 max number is:8 7、main 8、User screen、Alt+F5

C语言程序设计教程第一章练习题题目

单选题 1、下列语言中不属于计算机语言的三大类的是(C)。 A.机器语言 B.汇编语言 C.脚本语言 D.高级语言 2、下列说法中不正确的是(C) A.计算机语言大致可分为三大类,即机器语言、汇编语言和高级语言 B.C语言是一种通用的、过程式的编程语言,具有高效、灵活、可移植等优点 C.C语言属于汇编语言 D.高级语言比汇编语言更贴近于人类使用的语言,易于理解、记忆和使用 3、以下开发工具中不属于主流的开发工具的是(B) A.Visual Studio B.Xcode C.Code::Block D.Eclipse 4、下列选项是对主流开发工具的介绍,其中错误的是(B) A.Visual Studio支持C/C++、C#、F#、VB等多种程序语言的开发和测试 B.Code::Block是一个免费的跨平台IDE,支持C、C++和Fortan程序的开发 C.Eclipse是一种被广泛使用的免费跨平台IDE,最初由IBM公司开发 D.Vim是一款功能非常强大的IDE ( 和其他IDE不同的是,Vim本身并不是一个用于开发计算机程序的IDE,而是一款功能非常强大的文本编辑器,它是UNIX系统上Vi编辑器的升级版。) 5、下列选项中,不属于开发一个C语言应用程序的具体实现步骤的是(A) A.启动开发工具 B.添加源文件 C.编写代码 D.运行程序 6、下列选项中,关于main()函数叙述不正确的是(C) A.一个完整的C语言程序中,有且只能有一个main()函数 B.main()函数是程序的主入口,程序总是从main()函数开始执行 C.如果没有声明main()函数,程序将从第1行开始执行 D.main()函数可以有返回值,也可以没有返回值 7、下面程序中,合法的选项是(D) A.#includeint main() { printf("hello world\n"); return 0; } B.#includeint man() { printf("hello world\n"); return 0; } C.#includeint main() { printf("hello world\n") return 0; } D.#includeint main() { print("hello world\n"); return 0; } 8、下面程序中,运行结果为“1,2”的是(A) A.#includeint main() { int a = 1; int b = 2; printf("%d %d\n",a,b); return 0; } B.#includeint main() { int a = 1; int b = 2; printf("%d,"a); printf("%d\n",b); return 0; } C.#includeint main() { int a = 1, b = 2; printf("%d,,%d\n",a,b); return 0; }

C语言程序设计课程作业

C语言程序设计课程作业_A 一、单选题 1. (4分)设有以下定义int k=7, x=12;,则能使值为3的表达式是() ? A. x%=(k%=5) ? B. x%=(k-k%5) ? C. x%=k ? D. (x%=k)-(k%=5) 答案D 解析C语言程序设计/数据类型与运算/整型算术表达式 2. (4分)以下程序的输出结果是? #include main() { int x=020,y=0x20,z=20; printf('%d,%d,%d ', x,y,z); } ? A. 20,20,20 ? B. 32,16,20 ? C. 16,32,20 ? D. 20,32,20 答案C 解析C语言程序设计/数据类型及运算 3. (4分)C语言中while和do while循环的主要区别是( ) ? A. do-while的循环至少无条件执行一次

? B. while循环控制条件比do-while的循环控制条件严格 ? C. do-while允许从外部转入到循环体内 ? D. do-while的循环体不能是复合语句 答案A 解析C语言程序设计/循环程序设计/while语句与do-while语句 4. (4分)执行语句scanf('%d,%d',&m,&n);使m和n的值分别为1和2,正确输入是( ) ? A. 1 ? B. 1 2 ? C. 1,2 ? D. 12,2 答案C 解析C语言程序设计/顺序程序设计/整型数据的格式输入 5. (4分)sizeof(float)是( ) ? A. 一个双精度型表达式 ? B. 一个整型表达式 ? C. 一种函数调用 ? D. 一个不合法的表达式 答案B 解析C语言程序设计/数据类型与运算/实型变量存储 6.

C语言程序设计教程课后习题答案

第1章 1-3 CAB 4 .c .obj .exe 5 /* */ 6 ; 7 算法 8 ①中级语言:C语言具有高级语言的先进思想又能直接对存储器进行操作,能进行位运算,能实现汇编语言的大部分功能,生成目标代码质量高,程序执行效率高。 ②结构化语言:C语言用函数作为程序模块,以实现程序的模块化,语言简洁、紧凑,具有结构化的特点。 ③可移植性好:C语言不包含依赖硬件的输入输出机制,使C语言本身不依赖于硬件系统,可移植性好。 9 #include main( ) { ; } 10 #include “stdio.h” main() { printf(“This is my first C Program!”); } 第2章 1.yes 2.-3 3.2,1 4.1)a!=b||a<=c 2)x>=4||x<=-4 5.x>20&&x<30||x<-100 6.#include main() { int x; printf(“please input an integar:”); scanf("%d",&x); if(x%5==0&&x%7==0) printf("yes\n"); else printf("no\n"); } 7. #include main() { int year,month; printf("please input the year and month:"); scanf("%d%d",&year,&month);

switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12:printf("this month have 31 days."); break; case 4: case 6: case 9: case 11:printf("this month have 30 days."); break; case 2:if(year%4==0&&year%100!=0||year%400==0) { printf("this month have 29 days."); break; } else { printf("this month have 28 days."); break; } } } 8. #include main() { float money; int year; printf("\nplease input the money and the year:"); scanf("%f%d",&money,&year); if(year==1) money+=money*0.00315*12*year; if(year==2) money+=money*0.00330*12*year; if(year==3||year==4) money+=money*0.00345*12*year; if(year>=5&&year<=7) money+=money*0.00375*12*year; if(year>=8) money+=money*0.00420*12*year; printf("the money is:%f",money); } 第3章

《C语言程序设计》课程设计

《C语言程序设计》课程设计 刘力斌 一、意义和目的 C语言是光信息科学与技术专业的重要专业基础课。在很多后续课程中,都要使用到C语言。 学生通过对C语言的学习,已经具备了使用C语言编写简单的应用程序的能力。为了加强程序设计基础,开设课程设计课,使学生对C语言有更全面的理解,进一步提高运用C语言编程解决实际问题的能力,同时,为后续课程的学习夯实基础。 课程设计目的: 提高用程序设计解决实际问题的能力。 通过提出算法、指定输入输出来设计一个解决方案。 用C语言合理地开发两个简洁有效的程序代码来实现该设计。 测试程序是否工作且满足设计指标并评价其效率。 二、目标 完成本课程设计的学生应能在以下几方面证明你们的能力: A、分析问题。各种简单的与计算机有关的案例中所需要的输出结果,把大问题分解成小问题,使用自顶向下或类似设计方法给出模块化或计划。 B、提出算法执行特定任务。模块表示为算法,使用自顶向下或伪代码等设计手段将模块细化成更详细的成分,清楚地表明顺序、选择和重复等到控制结构。 C、把一个算法变为用C语言编写的结构化程序。 D、用合适的测试方法检查程序是否符合最初的要求,为不合适数据设计错误陷阱,并提供错误信息来帮助用户。 E、写出清晰的用户文档,确保用户或者通过遵循程序中的指示或者使用程序设计者编写的文档能成功地运行程序。 F、写出技术文档,对程序中主要标示符的含义或作用加以说明,并提供一个完整的程序流程图。 G、调试程序、测试数据过程成功。

三、要求 参加本课程设计的学生,应当认真完成本课程设计的全部过程。并以最终课程设计成果来证明其独立完成各种实际任务的能力。从而,反映出理解和运用本课程知识的水平和能力。 完成课程设计应提交如下文档: ①程序的总体设计和算法分析。 ②技术文档 ③用户文档 ④源程序代码清单。 ⑤测试数据和测试过程记录。 ⑥遇到的问题及解决方法分析。 四、选题 每人一个题,具体题目可以参考附录。 第一题:链表操作题(包括建立、插入、删除、打印等)(参考教材); 第二题:文件操作,具体题目最好是自拟。 如果选题确实有困难的同学,可参考后面参考题目来完成本课程设计(成绩要影响)。 五、评价 评价是检测学生理解问题和解决问题能力的一个重要手段,教师将根据学生提交的一套文件中,严格检查以下各项任务完成情况: 1、课程设计文档是否齐全。 2、程序的用户文档 如果在程序执行期间有足够的指导信息显示在屏幕上显示,这些用户文档可以是很简要的,也许只限于解释如何装入并运行程序。 3、问题或任务的陈述(描述问题,而且问题是合理原始的、应当包括输 入、输出及其预期范围。)是否正确。 4、问题的解决方案采取由顶向下设计的形式,在适当的地方使用伪代 码,把整个解决方案划分成若干模块。 5、程序完成后的代码应当加以注解。最少应清楚指出每一个模块。 6、用于检查程序的测试数据,或者对一个控制程序给出测试的例程。测 试应考虑探索通过程序的几条路径,在合适的地方选择打印输出来。 7、程序的技术文档

C语言程序设计教程 清华大学出版社 陈明主编 第4章答案

第4章习题解答 一、选择题 1.在C语言中,函数返回值的类型最终取决于 A)函数定义时的函数首部所说明的函数类型B)return语句中表达式值的类型C)调用函数时主调函数所传递的实参类型D)函数定义时形参的类型 解析:函数返回值类型最终取决于定义函数时所定义的函数类型。 答案:A 2.设函数Fun()的定义形式为: void Fun(char ch, float x){} 则以下对函数Fun()的调用语句中,正确的是。 A)Fun("abc", ; B)t = Fun('D', ; C)Fun('65', ; D)Fun(32, 32); 解析:选项A中"abc"是字符串,与形参不匹配:由于Fun函数的返回值类型为void,所以选项B中进行了赋值操作是不正确的;在选项C中,'65'是不合法的字符形式,单引号中应该是单个字符。只有选项D才是合法的函数调用形式。 答案:D 3.有以下程序: /* 文件路径名:ex4_1_3\ */ #include <> /* 标准输入/输出头文件*/ int f1(int x, int y) { return x > y x : y; } int f2(int x, int y) { return x > y y : x; } int main(void) /* 主函数main() */ { int a = 4, b = 3, c = 5, d = 2, e, f, g; /* 定义变量*/ e = f2(f1(a, b), f1(c, d)); f = f1(f2(a, b), f2(c, d));/* 调用函数*/ g = a + b + c + d - e - f; /* 算术运算*/ printf("%d,%d,%d\n", e, f, g); /* 输出e,f,g */ return 0; /* 返回值0, 返回操作系统*/ } 程序运行后的输出结果是。 A)4,3,7 B)3,4,7 C)5,2,7 D)2,5,7 解析:函数f1用于求两个数中的最大数,而函数f2用于求两个数中的最小数。因此有:e=f2(f1(a,b),f1(c,d))=f2(f1(4,3),f1(5,2))= f2(4,5)=4; f=f1(f2(a,b),f2(c,d)) =f1(f2(4,3),f2(5,2)) =f1(3,2)=3; g=a+b+c+d-e-f=4+3+5+2-4-3=7。 答案:A

《C语言程序设计实践教程》答案-完整版

4.2练习题 一、选择题 1.D 2.B 3.A 4.B和D 5.C 6.A 7.B 二、填空题 1.//或/* */ 2.主或main 3.函数首部和函数体4.编译和连接 5.分号 5.2练习题 一、选择题 1.A 2.D 3.B 4.B 5.C 6.C 7.D 8.A 9.B 10.B 11.D 12.B 13.A或B 14.C 15.B

17.D 18.D 19.C 20.D 21.B 22.A 23.D 24.C 25.C 26.B 27.C 28.D 29.A 30.B 二、填空题 1.102,10 2.#define 宏名字符串 3.1 4.n=1 5.-4 6.a=1,b= ,c=2 7.c=A 8.n1=%d\nn2=%d 9.a+b>c&&a+c>b&&b+c>a 10.ch>=’a’&&ch<=’z’|| ch>=’A’&&ch<=’Z’11.7 12.0 13.11110000 14.8,4 6.2练习题 一、选择题 1.A 2.C 3.D 4.C 5.A

7.A 8.D 9.B 10.C 11.A 12.A 13.C 14.B 15.正确答案为:12345678 二、填空题 1.10 2.y=1 x%i==0 3.屏幕中间输出一个由星号组成的菱形4.1 5.13 6.(cx=getchar())!=-1 front=cx; 7.m%n 8.4 9.*p px=&x py=&y 三、读程序,写结果 1.-1 2.3,1,-1, 3.a=16,y=60 4.x=12,y=4 5.59 7.2练习题 一、选择题 1.B 2.C 3.C 4.A 5.D

新编C语言程序设计教程(机械工业出版社-钱雪忠-吕莹楠)

新编C语言程序设计教程 习题及实验题部分答案 第1章 C 语言概述 1 习题 一、选择题 ADCDB CCBBA 二、简答题 1、什么是语言?语言分几类?各有什么特点? 语言: 语言是思维的载体。人和计算机打交道,必须要解决一个“语言”沟通的问题。如今人与计算机之间有许多种类的“语言”的。 语言分类: 机器二进制语言、汇编语言(低级)和高级语言(第三代、第四代、……) 各自特点: 1)机器二进制语言:用0、1两个数字编写的计算机能直接运行的程序的语言,机器语言执行效率高,但难编写、难懂、难移植。 2)汇编语言(低级):汇编语言的特点是使用一些“助记符号”来替代那些难懂难记的二进制代码,所以汇编语言相对于机器指令便于理解和记忆,但它和机器语言的指令基本上是一一对应,两者都是针对特定的计算机硬件系统的,可移植性差,因此称它们都是“面向机器的低级语言”。 3)高级语言:高级语言类似自然语言(主要是英语),由专门的符号根据词汇规则构成单词,由单词根据句法规则构成语句,每种语句有确切的语义并能由计算机解释。高级语言包含许多英语单词,有“自然化”的特点;高级语言书写计算式子接近于熟知的数学公式的规则。高级语言与机器指令完全分离,具有通用性,一条高级语言语句常常相当于几条或几十条机器指令。 2、汇编语言与高级语言有何区别? 高级语言程序要比汇编语言要易懂、明了、简短得多;高级语言与机器指令完全分离,具有通用性,一条高级语言语句常常相当于几条或几十条机汇编语言指令;高级语言要经过解释或编译来执行的,而汇编语言程序通过汇编程序来生成机器程序来执行的。 3、什么是程序? 完成某一特定任务的一组指令序列,或者说,为实现某一算法的指令序列称为“程序”。不同计算机语言有不同的计算机程序。 4、C语言中为何要加注释语句? 注释部分,起到说明语句或程序的作用。程序中应添加必要的注释,来增强程序的阅读与理解。注释用来向用户提示或解释程序的意义。

C语言程序设计课程设计大全

C语言课程设计 一、课程设计目的 ◆进一步巩固和复习C 程序设计的基础知识。 ◆培养学生结构化程序、模块化程序设计的方法和能力。 ◆提高学生调试程序的技巧和软件设计的能力。 ◆提高学生分析问题、解决问题以及综合利用C 语言进行程序设计的能力。◆了解软件的编制过程。 ◆树立团队合作精神 二、课程设计内容 设计要求 可自己选定一信息管理方面的题目,最多5人一组。 题目一:职工信息管理系统设计 https://www.sodocs.net/doc/1f4321046.html,/view/76e2ddceda38376baf1fae81.html 职工信息包括职工号、姓名、性别、年龄、学历、工资、住址、电话等(职工号不重复)。试设计一职工信息管理系统,使之能提供以下功能: 系统以菜单方式工作 职工信息录入功能(职工信息用文件保存)--输入 职工信息浏览功能--输出 查询和排序功能:(至少一种查询方式)--算法 按工资查询 按学历查询等 职工信息删除、修改功能(任选项) 题目二:图书信息管理系统设计 https://www.sodocs.net/doc/1f4321046.html,/view/6751448ad0d233d4b14e69c2.html 图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、价格等。试设计一图书信息管理系统,使之能提供以下功能: 系统以菜单方式工作 图书信息录入功能(图书信息用文件保存)--输入 图书信息浏览功能--输出 查询和排序功能:(至少一种查询方式)--算法 按书名查询 按作者名查询 图书信息的删除与修改(可选项) 题目三:学生信息管理系统设计 https://www.sodocs.net/doc/1f4321046.html,/view/1423e5e8e009581b6bd9eb62.html 学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。试设计一学生信息管理系统,使之能提供以下功能: 系统以菜单方式工作 学生信息录入功能(学生信息用文件保存)---输入

《C语言程序设计》课程标准

《C语言程序设计》课程标准 课程编码: 03012208 课程模块:专业必修课 学时: 90 课程类型: B类(理论+实践) 适用专业:计算机网络专业 1. 概述 C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。 C语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复 杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作。由于C语言实 现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。既可用于系统软 件的开发,也适合于应用软件的开发。 本课程旨在使学生掌握程序设计的基本方法及思维,形成程序设计基本思想,掌握程序 调试的基本方法,使学生初步具备程序设计能力,为学生进一步学习其他专业课程和今后从 事网络技术工作打下坚实的基础。 1.1课程的性质 《C语言程序设计》是一门专业必修课,是学习其它工科课程的基础。掌握程序设计的 前提是掌握程序设计语言,C语言以其灵活性和实用性受到了广大计算机应用人员的喜爱。 一旦掌握了C语言,就可以较为轻松地学习后续的Java程序设计、数据库技术等程序设计 语言。本课程以程序设计思想为主线,介绍C语言的基本概念和程序设计的思想和方法, 培养学生运用C语言解决实际问题的能力。 前导课程:计算机文化基础等。 后继课程:Java程序设计、数据库技术、信息安全技术、网络操作系统等。 1.2课程设计理念 通过对多家IT企业的走访,我们了解到自学能力、动手能力、团队协作能力是现代企 业对人才的共同要求。因而我们也把培养具有这些能力的学生作为我们的课程目标,把对这 些能力的培养融入到平常的授课过程中。对以计算机网络、汽车电子等专业为代表的学生, 主要注重项目分析,流程图设计以及编程技巧和方法的培养,为进一步培养软件项目综合开 发和应用能力作准备。 1、基于工作过程,以职业能力培养为重点,与行业企业合作进行的课程开发与设计。 在课程的讲授过程中,采用任务驱动的模式,以案例教学为主。在学生掌握了相应知识 点后,再提出新的问题,要求学生通过修改已有的代码加以解决。在修改代码的过程中,既 培养了学生的自学能力,又锻炼了学生的动手能力。 另外,我们把企业中的一些要求带到了教学过程中。例如代码必须加注释,标识名必须 用英文单词等。 2、课程设计充分体现了职业性、实践性和开放性的要求。

《C语言程序设计教程》习题参考答案

《C语言程序设计教程》习题参考答案 祝胜林主编 华南理工大学出版社 【习题1】 (1) 【习题2】 (2) 【习题3】 (3) 【习题4】 (5) 【习题5】 (8) 【习题6】 (11) 【习题7】 (14) 【习题8】 (16) 【习题9】 (16) 【习题10】 (18)

一、简答题(在课本中寻找答案,略) 1.1C程序的基本结构包括哪些内容? 1.2如何定义标识符? 1.3输入格式、输出格式的组成包括哪些内容? 1.4C语言函数分为哪两类? 1.5计算表达式的值应该考虑哪些方面? 1.6上机调试程序的步骤如何? 二、判断并改错 1.7C程序执行的入口是main()函数,所以main函数必须放在程序的开头。 错误:main函数可以放在程序的任何位置。并不限定在程序的开头。 1.8定义一个函数包括数据说明部分和执行语句部分,两者可以交叉出现。 错误:不可以交叉出现,数据说明部分在执行语句部分的前面。 1.9编辑与编译不是一回事。 错误:不是一回事。编辑完成源程序的输入和修改;编译是对源程序进行语法检查,如果无语法错误,则生成目标程序。 1.10scanf("%d,%d",&x,&y);的正确输入格式:3,4<回车>。 正确 1.11注释内容太多会影响程序的执行效率。 错误:不会影响程序的执行效率。因为在编译时,编译系统将注释内容删除或用空格代替,所以注释内容不会编译到目标程序中。 1.12所有的数学公式可以直接出现在源程序中。 错误:数学公式需要转换成C语言能够接受的公式才能出现在源程序中。 三、编程题 1.13在屏幕上输出自己名字的拼音。 提示:中文名字叫?张三?,对应的拼音为?Zhang San?,输出用printf()函数。 1.14 输入圆的半径,求圆的周长,并将结果保留两位小数输出到屏幕上。 提示:定义圆的半径r,圆的周长:2*3.14*r,输出结果保留2位小数可以用%.2f 1.15输入两个整数,输出其中最大者。 提示:模仿例1.3 1.16 输入三个整数,输出其中最小者。 提示: min(min(a,b),c);

C语言程序设计课程总结

本课程总结 姚琳主编(第二版) 第一章C语言程序设计概述 目的:初步了解C语言程序,学会使用C语言环境编辑运行C程序。 要求:掌握程序设计语言、程序、算法的概念,了解算法的特点,熟悉算法的设计步骤,掌握用流程图表达算法的方法。了解C语言程序的结构特点,掌握在Turbo C集成环境下编辑、运行简单C语言程序的方法。 教学重点:C语言程序的结构特点;在VC集成环境下运行C程序 教学难点:算法设计和算法描述。 一.算法: 算法:就是解决问题的方法。 计算机算法可分为两类别: 数值运算算法 —求数值解,用在科学计算。 非数值运算算法 —求非数值解,用在事物处理。 数值运算算法 例如:已知三角形的底a等8,高h等14,求三角形的面积s。 则 数值运算算法为: 1、a=8 a的值等于8 2、h=14 h的值等于14 3、s=a*h/2 计算面积S

非数值运算算法 例如从湛江乘火车去北京开会,其算法为: 1、买火车票 2、按时到车站 3、登上火车 4、到北京站后乘电车到会场 5、参加会议 二.C语言的特点: 1·C语言简洁、紧凑,使用方便、灵活。 5·语法限制不太严格,程序设计自由度大。 6·C语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。 3·数据结构类型丰富。 4·具有结构化的控制语句。 7·生成目标代码质量高,程序执行效率高。 8·与汇编语言相比,用C语言写的程序可移植性好。 2·运算符丰富。共有34种。C把括号、赋值、逗号等都作为运算符处理。 三.C语言的基本结构 (1)函数是组成C程序的基本单位,一个C的源程序有且只有一个main函数,但可以有若干个其它的函数。 (2)一个函数由两个部分组成: 函数的首部:函数的第一行,包括函数名、函数类型、函数参数(形参)名、参数类型等。 函数体:由声明和执行两部分组成。 (3)一个C程序总是从main函数开始执行的,不管main函数在整个程序中的位置如何。 (4)C程序书写格式自由,一行内可以写几个语句,一个语句可以分写在多

C语言程序设计课程设计练习题

《C语言程序设计》练习题 1.输入10个整数,输出其中最大者和最小者。 2.判断输入的任意年是否为闰年。 3.输入一个年、月、日,输出该日是本年中的第几天。 4.求两个正整数m和n的最大公约数和最小公倍数。 5.输出100~1000之间的素数输出。 6.求解方程ax2+bx+c=0的根,其中a、b、c是键盘输入的双精度数。 7.求由双精度数a、b、c组成的三角形的面积。 8.输入球的半径r(双精度数),计算球的表面积和体积。 9.编写交换两个整数的函数(使用指针)。 10.编写一个函数,返回函数本身被调用的次数。 11.输入两个运算数和一个算术运算符,编程实现四则运算,并输出运算结果。 12.编写一个摄氏温度和华氏温度转换程序(双精度数)。 13.打印九九乘法表。 14.打印由*组成的九层高的等腰三角形。 15.输出signed char、unsigned char、signed short、unsigned short、signed int、unsigned int、signed long、unsigned long、float、double所能表示的最大值和最小值。 16.从键盘输入的字符串,将其中的大写字母变成小写字母,将小写字母变成大写字母。 17.输入一个字符串,统计其中的字母、数字、空白符及其它符号的个数。 18.编写一个程序,输入x,当x>0,输出y=1,当x<0,输出y=-1,当x=0,输出y=0。 19.将百分制成绩转换为等级(优秀[90~100]、良好[80~90)、中等[70~80)、及格[60~70)、不及格[0~60) )成绩。 20.根据输入的利润,计算奖金:利润低于或等于10万元时,奖金为利润的10%;利润低于或等于20万元时,高于10万元部分的奖金为利润的7.5%;利润低于或等于40万元时,高于20万元部分的奖金为利润的5%;利润低于或等于60万元时,高于40万元部分的奖金为利润的2.5%;利润高于100万元时,高于60万元部分的奖金为利润的1%。 21.输入一个不多于5位的正整数,计算其位数、各位之和、逆序输出各位数字。 22.求1+2+3+…+n之和,n由键盘输入。 23.求1!+2!+3!+…+n!,n由键盘输入。

c语言程序设计教材全部答案

C教材习题答案 习题1 一.填空题 1.C程序是由(函数)构成的,一个C程序中至少包含(main函数)。因此,(函数)是C程序的基本单位。 2.C程序注释是由(/*)和(*/)所界定的文字信息组成的。 3.函数体一般包括(声明部分)和(执行部分)。 二.判断题 1.一个C程序的执行总是从该程序的main函数开始,在main函数最后结束。(正确)2.main函数必须写在一个C程序的最前面。(错误) 3.一个C程序可以包含若干的函数。(正确) 4.C程序的注释部分可以出现在程序的任何位置,它对程序的编译和运行不起任何作用。但是可以增加程序的可读性。(正确) 5.C程序的注释只能是一行。(错误) 6.C程序的注释不能是中文文字信息。(错误) 8.可以使用Turbo C来编译和连接一个C程序。(正确) 9.可以使用Turbo C来运行一个C程序。(正确) 10.可以使用Turbo C来实时调试(即动态调试)一个C程序。(正确) 三、在c++6.0中输入如下的程序,编译、连接通过后显示结果 (1)#include“stdio.h” void main() { printf(“*”) printf(“***”); printf(“*****”); printf(“*******”); } 答案: * *** ***** ******* (2)已知底和高,计算三角形的面积。 #include“stdio.h” void main()

{int bottom,high,area;/*bottom表示底,high表示高,area表示面积*/ bottom=4; high=6; area=bottom*high/2; printf(“the area is%d\n”,area); } 答案: the area is12 四、算法设计:请试着分别用自然语言或、程序流程图和NS图描述如下算法。 1.设计一个程序在屏幕上显示如下的文字 HELLO WELCOME YOU 2.打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其个位数字立方 和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三 次方+3的三次方。 3.对输入的某学生成绩,如果学习成绩>=90分的同学用A表示,60-89分之间的用B 表示,60分以下的用C表示。 4.一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程 找出1000以内的所有完数。 5.一只猴子摘了N个桃子第一天吃了一半又多吃了一个,第二天又吃了余下的一半又 多吃了一个,到第十天的时候发现还有一个,问共有多少个桃子。 答案: 1.#include“stdio.h” main() { printf(“HELLO WELCOME YOU”); } 2.水仙花数产生在100到999之间,利用穷举法,对此范围之内的所有数一个个进行测试,关键是要对每一个三位数分离出它的三个数字。具体的算法是: n%10,得到个位,(n/10)%10,得到百位数字,n/100,得到个位数字。再利用水仙花数的含义来判断该数是否满足条件。 #include“stdio.h” main() { int n,,i,j,k; for(n=100;n<=999;n++) { i=n%10; j=(n/10)%10; k=n/100;

相关主题