您的位置:

c语言pins,c语言平方怎么打出来

本文目录一览:

求大神们帮忙!!单片机ATmega8515读取RTC(DS1302)的时间信息的C语言程序,只要读秒,分,时,这三个信息

#includereg52.h //包含单片机寄存器的头文件

#includeintrins.h //包含_nop_()函数定义的头文件

unsigned char code digit[10]={"0123456789"}; //定义字符数组显示数字

sbit SCLK=P1^0; //位定义1302芯片的接口,时钟输出端口定义在P1.0引脚

sbit DATA=P1^1; //位定义1302芯片的接口,数据输出端定义在P1.1引脚

sbit RST=P1^2; //位定义1302芯片的接口,复位端口定义在P1.2引脚

/*****************************************************

函数功能:延时若干微秒

入口参数:n

***************************************************/

void delaynus(unsigned char n)

{

unsigned char i;

for(i=0;in;i++);

}

/*****************************************************

函数功能:向1302写一个字节数据

入口参数:x

***************************************************/

void Write1302(unsigned char dat)

{

unsigned char i;

SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备

delaynus(2); //稍微等待,使硬件做好准备

for(i=0;i8;i++) //连续写8个二进制位数据

{

DATA=dat0x01; //取出dat的第0位数据写入1302 低位在前

,高位在后

delaynus(2); //稍微等待,使硬件做好准备

SCLK=1; //上升沿写入数据

delaynus(2); //稍微等待,使硬件做好准备

SCLK=0; //重新拉低SCLK,形成脉冲

dat=1; //将dat的各数据位右移1位,准备写入

下一个数据位

}

}

/*****************************************************

函数功能:根据命令字,向1302写一个字节数据

入口参数:Cmd,储存命令字;dat,储存待写的数据

***************************************************/

void WriteSet1302(unsigned char Cmd,unsigned char dat)

{

RST=0; //禁止数据传递

SCLK=0; //确保写数居前SCLK被拉低

RST=1; //启动数据传输

delaynus(2); //稍微等待,使硬件做好准备

Write1302(Cmd); //写入命令字

Write1302(dat); //写数据

SCLK=1; //将时钟电平置于高电平状态

RST=0; //禁止数据传递

}

/*****************************************************

函数功能:从1302读一个字节数据

入口参数:x

***************************************************/

unsigned char Read1302(void)

{

unsigned char i,dat;

delaynus(2); //稍微等待,使硬件做好准备

for(i=0;i8;i++) //连续读8个二进制位数据

{ dat=1;

if(DATA==1) //如果读出的数据是1

dat|=0x80; //将1取出,写在dat的最高位

SCLK=1; //将SCLK置于高电平,为下降沿读出

delaynus(2); //稍微等待

SCLK=0; //拉低SCLK,形成脉冲下降沿

delaynus(2); //稍微等待

}

return dat; //将读出的数据返回

}

/*****************************************************

函数功能:根据命令字,从1302读取一个字节数据

入口参数:Cmd

***************************************************/

unsigned char ReadSet1302(unsigned char Cmd)

{

unsigned char dat;

RST=0; //拉低RST

SCLK=0; //确保写数居前SCLK被拉低

RST=1; //启动数据传输

Write1302(Cmd); //写入命令字

dat=Read1302(); //读出数据

SCLK=1; //将时钟电平置于已知状态

RST=0; //禁止数据传递

return dat; //将读出的数据返回

}

/*****************************************************

函数功能: 1302进行初始化设置

***************************************************/

void Init_DS1302(void)

{

unsigned char flag;

flag= ReadSet1302(0x81);

if(flag0x80) { //判断时钟芯片是否关闭

WriteSet1302(0x8E,0x00); //根据写状态寄存器命令

字,写入不保护指令

WriteSet1302(0x80,((55/10)4|(55%10))); //根据写秒寄存器命

令字,写入秒的初始值

WriteSet1302(0x82,((59/10)4|(59%10))); //根据写分寄存器命

令字,写入分的初始值

WriteSet1302(0x84,((23/10)4|(23%10))); //根据写小时寄存器命

令字,写入小时的初始值

WriteSet1302(0x86,((18/10)4|(18%10))); //根据写日寄存器命令

字,写入日的初始值

WriteSet1302(0x88,((6/10)4|(6%10))); //根据写月寄存器命令字

,写入月的初始值

WriteSet1302(0x8c,((9/10)4|(9%10))); //根据写年寄存器命令

字,写入年的初始值

WriteSet1302(0x90,0xa5); //打开充电功能 选择2K

电阻充电方式

WriteSet1302(0x8E,0x80); //根据写状

态寄存器命令字,写入保护指令

}

}

//如果不想每次都初始化时间,也就是掉电后还想让时钟继续走时的话 就用

上面的语句

/*--------------------这是每次都初始化的语句-----------------*/

/*

WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字

,写入不保护指令

WriteSet1302(0x80,((55/10)4|(55%10))); //根据写秒寄存器命令字

,写入秒的初始值

WriteSet1302(0x82,((59/10)4|(59%10))); //根据写分寄存器命

令字,写入分的初始值

WriteSet1302(0x84,((23/10)4|(23%10))); //根据写小时寄存器命

令字,写入小时的初始值

WriteSet1302(0x86,((18/10)4|(18%10))); //根据写日寄存器命令

字,写入日的初始值

WriteSet1302(0x88,((6/10)4|(6%10))); //根据写月寄存器命令字

,写入月的初始值

WriteSet1302(0x8c,((9/10)4|(9%10))); //根据写年寄存器命令

字,写入年的初始值

WriteSet1302(0x90,0xa5); //打开充电功能 选择2K

电阻充电方式

WriteSet1302(0x8E,0x80); //根据写状态寄存器命令

字,写入保护指令

*/

/********************************************************************

***********

以下是对液晶模块的操作程序

*********************************************************************

**********/

sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚

sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚

sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚

sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚

/*****************************************************

函数功能:延时1ms

(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒

***************************************************/

void delay1ms()

{

unsigned char i,j;

for(i=0;i10;i++)

for(j=0;j33;j++)

;

}

/*****************************************************

函数功能:延时若干毫秒

入口参数:n

***************************************************/

void delaynms(unsigned char n)

{

unsigned char i;

for(i=0;in;i++)

delay1ms();

}

/*****************************************************

函数功能:判断液晶模块的忙碌状态

返回值:result。result=1,忙碌;result=0,不忙

***************************************************/

bit BusyTest(void)

{

bit result;

RS=0; //根据规定,RS为低电平,RW为高电平时,可以读

状态

RW=1;

E=1; //E=1,才允许读写

_nop_(); //空操作

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

result=BF; //将忙碌标志电平赋给result

E=0; //将E恢复低电平

return result;

}

/*****************************************************

函数功能:将模式设置指令或显示地址写入液晶模块

入口参数:dictate

***************************************************/

void WriteInstruction (unsigned char dictate)

{

while(BusyTest()==1); //如果忙就等待

RS=0; //根据规定,RS和R/W同时为低电平时,可

以写入指令

RW=0;

E=0; //E置低电平(根据表8-6,写指令时,E为

高脉冲,

// 就是让E从0到1发生正跳变,所以应先置"0"

_nop_();

_nop_(); //空操作两个机器周期,给硬件反应时间

P0=dictate; //将数据送入P0口,即写入指令或地址

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=1; //E置高电平

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=0; //当E由高电平跳变成低电平时,液晶模块

开始执行命令

}

/*****************************************************

函数功能:指定字符显示的实际地址

入口参数:x

***************************************************/

void WriteAddress(unsigned char x)

{

WriteInstruction(x|0x80); //显示位置的确定方法规定为"80H+地址码

x"

}

/*****************************************************

函数功能:将数据(字符的标准ASCII码)写入液晶模块

入口参数:y(为字符常量)

***************************************************/

void WriteData(unsigned char y)

{

while(BusyTest()==1);

RS=1; //RS为高电平,RW为低电平时,可以写入数据

RW=0;

E=0; //E置低电平(根据表8-6,写指令时,E为高脉冲

// 就是让E从0到1发生正跳变,所以应先置"0"

P0=y; //将数据送入P0口,即将数据写入液晶模块

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=1; //E置高电平

_nop_();

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

E=0; //当E由高电平跳变成低电平时,液晶模块开始执

行命令

}

/*****************************************************

函数功能:对LCD的显示模式进行初始化设置

***************************************************/

void LcdInitiate(void)

{

delaynms(15); //延时15ms,首次写指令时应给LCD一段较

长的反应时间

WriteInstruction(0x38); //显示模式设置:16×2显示,5×7点阵,

8位数据接口

delaynms(5); //延时5ms ,给硬件一点反应时间

WriteInstruction(0x38);

delaynms(5); //延时5ms ,给硬件一点反应时间

WriteInstruction(0x38); //连续三次,确保初始化成功

delaynms(5); //延时5ms ,给硬件一点反应时间

WriteInstruction(0x0c); //显示模式设置:显示开,无光标,

光标不闪烁

delaynms(5); //延时5ms ,给硬件一点反应时间

WriteInstruction(0x06); //显示模式设置:光标右移,字符不

delaynms(5); //延时5ms ,给硬件一点反应时间

WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清

delaynms(5); //延时5ms ,给硬件一点反应时间

}

/**************************************************************

以下是1302数据的显示程序

**************************************************************/

/*****************************************************

函数功能:显示秒

入口参数:x

***************************************************/

void DisplaySecond(unsigned char x)

{

unsigned char i,j; //j,k分别储存十位和个位

i=x/10;//取十位

j=x%10;//取个位

WriteAddress(0x49); //写显示地址,将在第2行第7列开始显示

WriteData(digit[i]); //将百位数字的字符常量写入LCD

WriteData(digit[j]); //将十位数字的字符常量写入LCD

delaynms(50); //延时1ms给硬件一点反应时间

}

/*****************************************************

函数功能:显示分钟

入口参数:x

***************************************************/

void DisplayMinute(unsigned char x)

{

unsigned char i,j; //j,k十位和个位

i=x/10;//取十位

j=x%10;//取个位

WriteAddress(0x46); //写显示地址,将在第2行第7列开始显示

WriteData(digit[i]); //将百位数字的字符常量写入LCD

WriteData(digit[j]); //将十位数字的字符常量写入LCD

delaynms(50); //延时1ms给硬件一点反应时间

}

/*****************************************************

函数功能:显示小时

入口参数:x

***************************************************/

void DisplayHour(unsigned char x)

{

unsigned char i,j; //j,k十位和个位

i=x/10;//取十位

j=x%10;//取个位

WriteAddress(0x43); //写显示地址,将在第2行第7列开始显示

WriteData(digit[i]); //将百位数字的字符常量写入LCD

WriteData(digit[j]); //将十位数字的字符常量写入LCD

delaynms(50); //延时1ms给硬件一点反应时间

}

/*****************************************************

函数功能:显示日

入口参数:x

***************************************************/

void DisplayDay(unsigned char x)

{

unsigned char i,j; //j,k十位和个位

i=x/10;//取十位

j=x%10;//取个位

WriteAddress(0x0c); //写显示地址,将在第2行第7列开始显示

WriteData(digit[i]); //将十位数字的字符常量写入LCD

WriteData(digit[j]); //将个位数字的字符常量写入LCD

delaynms(50); //延时1ms给硬件一点反应时间

}

/*****************************************************

函数功能:显示月

入口参数:x

***************************************************/

void DisplayMonth(unsigned char x)

{

unsigned char i,j; //j,k分别储存十位和个位

i=x/10;//取十位

j=x%10;//取个位

WriteAddress(0x09); //写显示地址,将在第2行第7列开始显示

WriteData(digit[i]); //将十位位数字的字符常量写入LCD

WriteData(digit[j]); //将个位数字的字符常量写入LCD

delaynms(50); //延时1ms给硬件一点反应时间

}

/*****************************************************

函数功能:显示年

入口参数:x

***************************************************/

void DisplayYear(unsigned char x)

{

unsigned char i,j; //j,k分别储存十位和个位

i=x/10;//取十位

j=x%10;//取个位

WriteAddress(0x06); //写显示地址,将在第2行第7列开始显示

WriteData(digit[i]); //将十位位数字的字符常量写入LCD

WriteData(digit[j]); //将个位数字的字符常量写入LCD

delaynms(50); //延时1ms给硬件一点反应时间

}

/*****************************************************

函数功能:主函数

***************************************************/

void main(void)

{

unsigned char second,minute,hour,day,month,year; //分别储存苗

、分、小时,日,月,年

unsigned char ReadValue; //储存从1302读取的数据

LcdInitiate(); //将液晶初始化

WriteAddress(0x01); //写Date的显示地址,将在第1行第2列开始显示

WriteData('D'); //将字符常量写入LCD

WriteData('a'); //将字符常量写入LCD

WriteData('t'); //将字符常量写入LCD

WriteData('e'); //将字符常量写入LCD

WriteData(':'); //将字符常量写入LCD

WriteAddress(0x08); //写年月分隔符的显示地址, 显示在第1行第9列

WriteData('-'); //将字符常量写入LCD

WriteAddress(0x0b); //写月日分隔符的显示地址, 显示在第1行第12列

WriteData('-'); //将字符常量写入LCD

WriteAddress(0x45); //写小时与分钟分隔符的显示地址, 显示在第2行第

6列

WriteData(':'); //将字符常量写入LCD

WriteAddress(0x48); //写分钟与秒分隔符的显示地址, 显示在第2行第9

WriteData(':'); //将字符常量写入LCD

Init_DS1302(); //将1302初始化

while(1)

{

ReadValue = ReadSet1302(0x81); //从秒寄存器读数据

second=((ReadValue0x70)4)*10 + (ReadValue0x0F);//将读出数据

转化

DisplaySecond(second); //显示秒

ReadValue = ReadSet1302(0x83); //从分寄存器读

minute=((ReadValue0x70)4)*10 + (ReadValue0x0F); //将读出数据

转化

DisplayMinute(minute); //显示分

ReadValue = ReadSet1302(0x85); //从分寄存器读

hour=((ReadValue0x70)4)*10 + (ReadValue0x0F); //将读出数据转

DisplayHour(hour); //显示小时

ReadValue = ReadSet1302(0x87); //从分寄存器读

day=((ReadValue0x70)4)*10 + (ReadValue0x0F); //将读出数据转

DisplayDay(day); //显示日

ReadValue = ReadSet1302(0x89); //从分寄存器读

month=((ReadValue0x70)4)*10 + (ReadValue0x0F); //将读出数据

转化

DisplayMonth(month); //显示月

ReadValue = ReadSet1302(0x8d); //从分寄存器读

year=((ReadValue0xf0)4)*10 + (ReadValue0x0F); //将读出数据转

DisplayYear(year); //显示年

}

}

c语言switch问题/单片机

首先告诉你,这不是一个循环程序!使用switch只是相当于if ....else.... 程序是判断wenum的值,wenum的值是0,1,2,3,4,5中的一个。当wenum=0时执行case 0:后面语句遇到break就跳出!,后面的依次类推。 如果是在单片机中,循环一般是在while(1)中来完成的,整个switch应该是循环体中的一部分你的s++也应该是在一个循环语句中实现的,或者在定时器中断中实现。总之要保证s++反复执行!

c语言 建立一个链表,实现增删改查

下面是以前写的一个关于链表的综合操作,你可以看看,应该可以满足你的要求。

/********************************************************************

created: 2009/09/15

created: 16:9:2009 17:20

filename: E:\dd\lianbiao\lianbiao.cpp

author:

purpose: 一个win32 的控制台程序

实现单项链表的数据删除、插入、排序等功能

*********************************************************************/

#include stdio.h

#include "windows.h"

#include "malloc.h"

#define LEN sizeof(struct student)

#define NULL 0

#define N 5 //N为所要创建的链表的长度

int n = 0; //定义全局变量n,表示链表的节点个数

/*******************************************************************

Author/data: /2009/09/15

Description: 声明一个结构体作为链表的节点.

tip: student 只是一个标签,是不能声明变量的

*********************************************************************/

struct student

{

int num;

float cj;

struct student *Pnext;

};

/*******************************************************************

Author/data: /2009/09/15

Description: 创建一个动态链表

参数: 返回链表的第一个节点的地址

x 为链表的长度

*********************************************************************/

struct student *pa(int x)

{

struct student *head;

struct student *p1,*p2;

// n = 0;

p1 = p2 = (struct student *)malloc(LEN); //开辟一个结构体内存

fflush(stdin); // 清除缓冲区数据 避免直接读入缓冲区数据

scanf("%d,%f",p1-num,p1-cj);

head = NULL;

while(p1-Pnext != NULL)

{

n = n+1;

if(n == 1)

{

head = p1; // 链表的头地址

}

else

{

p2-Pnext = p1; //链接链表数据

}

/* 判断是否最后一个 */

if(n = x)

{

p1-Pnext = NULL;

}

else

{

p2 = p1;

p1 = (struct student *)malloc(LEN);

fflush(stdin);

scanf("%d,%f",p1-num,p1-cj);

}

}

return(head);

}

/*******************************************************************

Author/data: /2009/09/15

Description: 输出一个链表

参数: head为第一个节点的地址

*********************************************************************/

void print(struct student *head)

{

struct student *p;

int i = 0;

printf("\nNow,These %d records are:\n",n);

p = head;

if(head != NULL) // 如果链表不是空的,则进行数据输出

{

do

{

printf("%d\t",i++);

printf("%5d %5.1f\n",p-num,p-cj); // 输出链表数据

p = p-Pnext;

}while(p != NULL);

}

}

/*******************************************************************

Author/data: /2009/09/16

Description: 释放动态链表的地址空间

参数: 链表的头地址head

无返回值

*********************************************************************/

void freelinkspace(struct student *head)

{

struct student Ltemp;

Ltemp.Pnext = head-Pnext; // Ltemp 用来存放-next,避免空间被

// 释放后,找不到下一个结点的地址

while(head-Pnext != NULL) // 判断是否已经空间释放到最后一个

{

free(head);

head = Ltemp.Pnext;

Ltemp.Pnext = head-Pnext;

}

free(head); // 释放最后一个结点空间

}

/*******************************************************************

Author/data: /2009/09/15

Description: 删除链表链表中的一个结点

参数: head 为第一个节点的地址

num 为要删除结点的序号(head-num)

*********************************************************************/

struct student *del(struct student *head,int num)

{

struct student *p1,*p2;

p1 = head;

while(p1-num!=num p1-Pnext!=NULL) // 寻找要删除的结点

{

p2 = p1; // p2 存放删除结点的前一个结点地址

p1 = p1-Pnext; // p1 存放要删除的结点

}

if(num == p1-num) // 是否找到要删除结点

{

if(p1 == head) // 删除的是第一个结点

{

head = p1-Pnext;

}

else if(p1-Pnext == NULL) // 删除的是最后一个结点

{

p2-Pnext = NULL;

}

else // 删除中间的结点

{

p2-Pnext = p1-Pnext;

p1-Pnext = NULL;

}

printf("delete: %d\n",num);

n = n-1; // 链表长度 - 1

}

else

{

printf("%d not been found! \n",num);

}

delete(p1);

return(head);

}

/*******************************************************************

Author/data: /2009/09/16

Description: 添加一个结点到链表中

参数: head 为第一个结点的地址指针

stud 为要插入的结点的地址指针

*********************************************************************/

struct student *insert(struct student *head,struct student *stud)

{

struct student *p0,*p1,*p2;

p0 = stud;

p1 = head;

while(p0-nump1-num p1-Pnext!=NULL) // 找到添加结点的位置

{

p2 = p1; // p2 存放要添加的前一个结点的地址

p1 = p1-Pnext; // p1 存放要添加的后一个结点的地址

}

if(p0-num=p1-num p1-Pnext!=NULL)

{

if(p1 == head) // 添加结点到第一个位置

{

p0-Pnext = p1;

head = p0;

}

else

{

p2-Pnext = p0;

p0-Pnext = p1;

}

}

else // 添加结点到最后一个位置

{

p1-Pnext = p0;

p0-Pnext = NULL;

}

n = n+1; // 结点数目 + 1

return(head);

}

/*******************************************************************

Author/data: /2009/09/16

Description: 链表的重新排序===按照.num(不能重复)的大小从小到大排

列链表数据

参数: head 接收链表第一个节点的地址指针

返回值为新生成链表的第一个节点的地址指针

*********************************************************************/

struct student *linkpaix(struct student *head)

{

struct student *stemp,*ltemp,*shead,*head_h; /* */

struct student *p,*q; /* 申请两个链表指针,用来储存链表交换过

程的中间值 */

head_h = head;

ltemp = head;

p = (struct student *) malloc(LEN);

q = (struct student *) malloc(LEN); /* 为p,q开辟动态存储空间 */

/* -==== 先将链表的第一个数据与其他数据比较 ====- */

while(head-Pnext != NULL)

{

shead = head;

head = head-Pnext;

if(ltemp-num head-num)

{

if(ltemp == shead)

{

ltemp -Pnext = head -Pnext;

head -Pnext = ltemp;

}

else

{

p-Pnext = head -Pnext;

q-Pnext = ltemp -Pnext;

head -Pnext = q-Pnext;

shead -Pnext = ltemp;

ltemp -Pnext = p-Pnext;

}

head_h = head;

head = ltemp;

ltemp = head_h;

}

}

/* -==== 先将链表的第一个数据与其他数据比较 ====- */

/* -==== 比较链表第一个以外的数据 ====- */

while(ltemp -Pnext != NULL)

{

stemp = ltemp;

ltemp = ltemp -Pnext;

head = ltemp;

while(head-Pnext != NULL)

{

shead = head;

head = head-Pnext;

if(ltemp-num head-num)

{

if(ltemp == shead)

{

p-Pnext = head -Pnext;

stemp -Pnext = head;

head -Pnext = ltemp;

ltemp -Pnext = p-Pnext;

}

else

{

p-Pnext = head -Pnext;

q-Pnext = ltemp -Pnext;

stemp -Pnext = head;

head -Pnext = q-Pnext;

shead -Pnext = ltemp;

ltemp -Pnext = p-Pnext;

}

head = ltemp;

ltemp = stemp -Pnext;

}

}

}

/* -==== 比较链表第一个以外的数据 ====- */

free(p);

free(q); // 释放p,q的动态存储空间

return(head_h);

}

/*******************************************************************

Author/data: /2009/09/15

Description: 主函数

参数:

*********************************************************************/

void main()

{

struct student *phead,*pins; // 定义2个链表指针

int delnum, selflog,flog_a = 1,Nf = 1; // 要删除的对象id

char delflog ; // 删除标志y/n

char insflog, flog_nx = 'n';

char flog_free ; // 释放标志

/* === 输入N个数据 === N 为定值

printf("please input %d numbers:\n",N);

phead = pa(N); // 创建一个动态链表,并赋值

print(phead); // 输出链表数据

*/

/* === 输入Nx个数据 === Nx 为输入值 === */

int Nx; // Nx 想要输入的链表长度

printf("How long do you want establish? \t");

fflush(stdin);

scanf("%d",Nx);

/* -== 判断创建的是否是一个空链表 ==- */

while(Nx == 0)

{

printf("您要创建的是一个空链表,是否确定?y/n \t");

fflush(stdin);

scanf("%c",flog_nx);

if(flog_nx == 'n')

{

printf("How long do you want input?\t");

fflush(stdin);

scanf("%d",Nx);

}

else if(flog_nx == 'y') goto endl;

else

{

printf("wrong input!\n");

printf("How long do you want input?\t");

fflush(stdin);

scanf("%d",Nx);

}

}

printf("please input %d numbers: ",Nx);

printf("如:1,3 两个数中间以,隔开\n");

phead = pa(Nx); // 创建一个动态链表,并赋值

print(phead); // 输出链表数据

/* -== 链表操作 ==- */

while(flog_a)

{

if(phead == NULL) {printf("链表已空,无法操作\n"); flog_a = 0; break;}

printf("\n操作\n1:\t插入数据\n2:\t删除数据\n3:\t排序\n4:\t清屏\n5:\t输出现在的链表数据\n0:\texit\n");

printf("\nPlease input:\t");

fflush(stdin);

if(scanf("%d",selflog)) // select flog 选择项

switch(selflog)

{

case 1 :

/* ====== 插入数据到链表 ====== */

printf("insert someone? y/n\t");

fflush(stdin);

scanf("%c",insflog);

while(insflog != 'n')

{

while(insflog != 'y' insflog != 'n')

{

printf("wrnong input,please input again. \n");

printf("another one? y/n\t");

fflush(stdin);

scanf("%c",insflog);

}

printf("please input the date:\n");

pins = (struct student *)malloc(LEN);

fflush(stdin);

scanf("%d,%f",pins-num,pins-cj);

phead = insert(phead,pins);

print(phead);

printf("another one? y/n\t");

fflush(stdin);

scanf("%c",insflog);

while(insflog != 'y' insflog != 'n')

{

printf("wrnong input,please input again. \n");

printf("another one? y/n\t");

fflush(stdin);

scanf("%c",insflog);

}

}

/* ====== 插入数据到链表 ====== */

break;

case 2 :

/* ====== 删除链表中的数据 ====== */

printf("del someone? y/n\t");

fflush(stdin);

scanf("%c",delflog);

while(delflog != 'n' phead != NULL)

{

while(delflog != 'y' delflog != 'n')

{

printf("wrnong input,please input again. \n");

printf("del someone? y/n\t");

fflush(stdin);

scanf("%c",delflog);

}

printf("please input the student what you want del:\n");

fflush(stdin);

scanf("%d",delnum);

phead = del(phead,delnum);

print(phead);

printf("another one? y/n\t");

fflush(stdin);

scanf("%c",delflog);

if((n+1)==0)

{

printf("There is no more num could be del!\n");

break;

}

}

/* ====== 删除链表中的数据 ====== */

break;

case 3 :

/* ====== 排列链表数据 ====== */

printf("\n排序之后:");

phead = linkpaix(phead);

print(phead); // 排序该数据链表

/* ====== 排列链表数据 ====== */

break;

case 4 :// clrscr();

system("cls");

break;

case 5 : print(phead); break;

case 0 : flog_a = 0 ; break; /* 退出 */

default : printf("wrong input\nPlease input again");

break;

}

else printf("非法输入!\n");

}

endl: while(1)

{

if(Nx == 0)

{

printf("Can't establish the link!\n");

break;

}

printf("\n保留数据?y/n\t"); // 是否释放地址空间

fflush(stdin);

scanf("%c",flog_free);

if(flog_free == 'y')

{

break;

}

else if(flog_free == 'n')

{

freelinkspace(phead);

break;

}

else

{

printf("wrong input!\n");

}

}

printf("OVER!\nGOOD LUCK!\n");

}

C#中怎么复制数组

C#中数组复制有多种方法

数组间的复制,int[] pins = {9,3,4,9};int [] alias = pins;这里出了错误,也是错误的根源,以上代码并没有出错,但是根本不是复制,因为pins和alias都是引用,存在于堆栈中,而数据9,3,4,3是一个int对象存在于堆中,int [] alias = pins;只不过是创建另一个引用,alias和pins同时指向{9,3,4,3},当修改其中一个引用的时候,势必影响另一个。复制的意思是新建一个和被复制对象一样的对象,在C#语言中应该有如下4种方法来复制。

方法一:使用for循环

int []pins = {9,3,7,2}

int []copy = new int[pins.length];

for(int i =0;i!=copy.length;i++)

{

copy[i] = pins[i];

}

方法二:使用数组对象中的CopyTo()方法

int []pins = {9,3,7,2}

int []copy2 = new int[pins.length];

pins.CopyTo(copy2,0);

方法三:使用Array类的一个静态方法Copy()

int []pins = {9,3,7,2}

int []copy3 = new int[pins.length];

Array.Copy(pins,copy3,copy.Length);

方法四:使用Array类中的一个实例方法Clone(),可以一次调用,最方便,但是Clone()方法返回的是一个对象,所以要强制转换成恰当的类类型。

int []pins = {9,3,7,2}

int []copy4 = (int [])pins.Clone();

方法五:

string[] student1 = { "$", "$", "c", "m", "d", "1", "2", "3", "1", "2", "3" };

string[] student2 = { "0", "1", "2", "3", "4", "5", "6", "6", "1", "8", "16","10","45", "37", "82" };

ArrayList student = new ArrayList();

foreach (string s1 in student1)

{

student.Add(s1);

}

foreach (string s2 in student2)

{

student.Add(s2);

}

string[] copyAfter = (string[])student.ToArray(typeof(string));

两个数组合并,最后把合并后的结果赋给copyAfter数组,这个例子可以灵活变通,很多地方可以用。

在C#中,采用什么属性表示数组的维数

C#声明数组时,方括号[]必须跟在类型后面,而不是标识符后面

1. 声明一维数组

C#数组的大小不是其类型的一部分,而在C语言中却是数组类型的一部分

int[] mySigArray = new int[4];    //声明数组类型,并使用new关键字为他分配内存空间/*上述声明可分解为以下两步*/int[] mySigArray;                 //声明数组类型mySigArray = new int[4];          //使用new关键字为他分配内存空间

另外C#声明数组时支持分配内存的方括号内是整型变量或变量表达式,只要事先确定了变量的值即可(这个在C语言的C99标准出现之前是不允许的)

int[] mySigArray = new int[n];    //n的值必须事先确定,声明之后即使改变n的值数组大小也不会变

2. 声明多维数组

int[,] myMulArray = new int[4,3]; //声明二维整型数组

3. 声明锯齿数组(数组的数组)

多维数组的大小是矩形的,例如3X3(也可以是是4×3,只需每行大小相同)个元素。而锯齿数组的大小设置比较灵活,在锯齿数组中,每一行都可以有不同的大小,如下图,锯齿数组成锯齿状

int[][] mySawArray = new int[3][];    //注意与二维数组不同,这里有两个方括号

数组的初始化

如果有初始化数据,可以用以下最简单的形式初始化

int[] mySigArray = {1,2,3,4};            //一维数组初始化int[,] myMulArray = {{1,2,3},{4,5,6},{7,8,9}};     //二维数组初始化int[][] mySawArray = {new int[] {1,2},new int[] {3,4,5,6,7,8},new int[] {9,10,11}};   //锯齿数组初始化

数组的访问

1. 访问上述初始化的的数组中单个元素

int i = mySigArray[2];        //i=3int j = myMulArray[2,1];     //j=8int k = mySawArray[2][1];     //k=10注意二维数组与锯齿数组的区别

2. 遍历访问数组元素

C#提供了foreach语句,该语句提供了一种简单、明了的方法来循环访问数组

foreach(int m in myArray)      //将所有数组元素的值加1,myArray可以是一维、多维或锯齿数组{

m++;

}    

另外也可以用for循环遍历数组,使用这种方式可以更好的控制数组元素(知道每次循环中的数组对象是哪个),下面这段代码用foreach语句是无法实现的

for (int i = 0; i mySawArray.Length; i++)

{    for (int j = 0; j mySawArray[i].Length; j++)

{

myMulArray[i,j]=mySawArray[i][j];    //把锯齿数组的每个元素赋值给二维数组中相应的元素    }

}

数组的常用属性和方法

在C#中,数组实际上是对象。System.Array是所有数组类型的抽象基类型,提供创建、操作、搜索和排序数组的方法,因此所有的数组都可以使用它的属性和方法

1. 常用属性

Length:获得一个32位整数,该整数表示Array的所有维数中元素的总数,即数组的元素个数,常用来限制数组下标的大小

2. 常用方法

2.1 数组的复制

在C#中,数组的复制一般分为以下三种:

int[] pins = {3,9,7,2};int[] copy1 = new int[pins.Length];pins.CopyTo(copy1,0);   //使用数组对象的CopyTo()方法进行复制,参数0表示从copy1数组的第一个元素(下标是0)开始放置从pins数组复制过来的值int[] copy2 = new int[pins.Length];Array.Copy(pins,copy2,copy2.Length); //使用Array类的一个静态方法Copy(),参数copy2.Length表示从pins数组的第一个元素开始到copy2数组所能容纳的最后一个元素(copy2.Length)都复制到copy2数组int[] copy3 = (int[])pins.Clone(); //使用数组对象的Clone()方法,它会创建一个新的数组,返回值是一个对象,所以需要强制类型转换成恰当的类型

2.2 数组的排序

排序是编程中常用的算法之一。C#中提供了两个数组排序的方法:

Array.Sort(Array)用于对数组进行从小到大排序

Array.Reverse(Array)用于对数组进行反向排序

int[] pins = {3,9,7,2};

Array.Sort(pins);    //pins={2,3,7,9}Array.Reverse(pins);    //pins={9,7,3,2}

怎样用C语言做一个按钮并设置点击反应

void delay() //延迟子程序

{

unsigned char i,j;

i=5;

while(i--)

for(j=0;j200;j++);

}

uint key() //按键子程序

{

f(k1==0)// 当按键按下时

{

delay( );// 延迟等待

if(k1==0) // 如果按键还是按下的动作,确定按键已经按下

while(!k1) ; // 当按键有弹起以后,再执行动作

{ /*这里自己/设置按键按下以后要执行的动作*/}

}

}

希望对您有所帮助!