本文目錄一覽:
- 1、求大神們幫忙!!單片機ATmega8515讀取RTC(DS1302)的時間信息的C語言程序,只要讀秒,分,時,這三個信息
- 2、c語言switch問題/單片機
- 3、c語言 建立一個鏈表,實現增刪改查
- 4、C#中怎麼複製數組
- 5、在C#中,採用什麼屬性表示數組的維數
- 6、怎樣用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) ; // 當按鍵有彈起以後,再執行動作
{ /*這裡自己/設置按鍵按下以後要執行的動作*/}
}
}
希望對您有所幫助!
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/310094.html