谁可以给我一个复杂点的C语言例子,要无错的,我刚学编程,很好奇

谁可以给我一个复杂点的C语言例子,要无错的,我刚学编程,很好奇,第1张

这是我做的课程设计,虽然不是很复杂,但对初学者来说已经足够做参考了。

#include <REG52.H>

#include <INTRINS.H>

sbit speaker=P2^3

sbit RS=P2^4 //P2.4

sbit RW=P2^5 //P2.5

sbit E=P2^6 //P2.6

sbit set=P3^4 //设置键

sbit enter=P3^5//确认键

sbit add1=P3^6//加1键

sbit sub1=P3^7//减1键

bit k=0,f=0,alarmflag1,alarmflag2,xx//k为0表示运行状态,k为1表示设置状态;f为0表示第一行显示,f为1表示第二行显示,alarmflag表示闹钟设置的标号,xx用来给speaker响

char sec,min,hour,week,day,month,year,n,m,hourn,minn,alarm

unsigned char count,key

unsigned char lcdd[]="0123456789"

bit naozhong

/*声明调用函数*/

void dispd()//日期显示函数

void dispt()//时间显示函数

void disalarm()

unsigned char keys()//按键扫描函数

void lcd_w_cmd(unsigned char com)//写命令字函数

void lcd_w_dat(unsigned char dat)//写数据函数

unsigned char lcd_r_start() //读状态函数

void int1()//LCD初始化函数

void delay(unsigned char t) //可控延时函数

void delay1()//软件实现延时函数,5个机器周期

void main()

{

TMOD=0x01//设置为定时器模式1

TH0=0x3c//晶振12MHz,定时时间50ms

TL0=0xb0

IE=0x82 //开全局中断和定时中断

TR0=1 //启动雀掘定时器

sec=0//秒

min=0

minn=0//分

hour=0

hourn=0//时

week=0//星期

day=13//日

month=6//月

year=11//年

count=0 //中断次备岁颂数清0

n=-3 //设置键按下次数,第一行日期

m=-3 //设置键按下次数,第二行时间

xx=1

P0=0xff// 送全1到P0口

int1() // 初始化LCD

delay(255)

while(1)

{

key=keys() /仿郑/读取按键

switch(key)

{

case 0xef: //按下设置键

{

TR0=0

k=1

if(f==0)

{

n=n+3

if(n==9)

{

n=0

m=0

f=1

}

}

else

{

m=m+3

if(alarm==0)

{

if(m==12)

{

m=0

n=0

f=0

}

}

else

{

if(m==6)

m=0

}

}

if(f==0)

{

lcd_w_cmd(0x0d)

lcd_w_cmd(0x86+n)

}

else

{

lcd_w_cmd(0x0d)

if(alarm==0)

lcd_w_cmd(0xc4+m)

else lcd_w_cmd(0xc7+m)

}

} break

case 0xdf: //按下确认键

{

k=0

TR0=1

n=-3

m=-3

f=0

if(alarm==1)

{

alarm=0

alarmflag1=1

lcd_w_cmd(0x01)

}

if(alarmflag2==1)

{

alarmflag1=0

alarmflag2=0

lcd_w_cmd(0x01)

}

} break

case 0xbf: //按下加1键

{

if(k==1)

{

if(f==0)

{

if(n==0){year++if(year==100) year=0}

else if(n==3) {month++if(month==13) month=1}

else {day++if(day==32) day=1}

dispd() //调用第一行显示函数

lcd_w_cmd(0x0d)//光标闪烁

lcd_w_cmd(0x86+n)//返回设置值显示地址

}

else

{

if(alarm==0)

{

if(m==0){hour++if(hour==24) hour=0}

else if(m==3) {min++if(min==60) min=0}

else if(m==6){sec++if(sec==60) sec=0}

else {week++if(week==7) week=0}

dispt() //调用第二行显示函数

lcd_w_cmd(0x0d)//光标闪烁

lcd_w_cmd(0xc4+m)//返回设置值显示地址

}

else

{

if(m==0){hourn++if(hourn==24) hourn=0}

else if(m==3) {minn++if(minn==60) minn=0}

disalarm() //调用第二行显示函数

lcd_w_cmd(0x0d)//光标闪烁

lcd_w_cmd(0xc7+m)//返回设置值显示地址

}

}

}

} break

case 0x7f: //按下减1键

{

if(k==1)

{

if(f==0)

{

if(n==0){year--if(year<0) year=99}

else if(n==3) {month--if(month==0) month=12}

else {day--if(day==0) day=31}

dispd() //调用第一行显示函数

lcd_w_cmd(0x0d)//光标闪烁

lcd_w_cmd(0x86+n)//返回设置值显示地址

}

else

{

if(alarm==0)

{

if(m==0){hour--if(hour<0) hour=23}

else if(m==3) {min--if(min<0) min=59}

else if(m==6){sec--if(sec<0) sec=59}

else {week--if(week<0) week=6}

dispt() //调用第二行显示函数

lcd_w_cmd(0x0d)//光标闪烁

lcd_w_cmd(0xc4+m)//返回设置值显示地址

}

else

{

if(m==0){hourn--if(hourn<0) hourn=23}

else if(m==3) {minn--if(minn<0) minn=59}

disalarm() //调用第二行显示函数

lcd_w_cmd(0x0d)//光标闪烁

lcd_w_cmd(0xc7+m)//返回设置值显示地址

}

}

}

} break

case 0xf7:

{

k=1

alarm=1

f=1

lcd_w_cmd(0x01)

disalarm()

m=3

}break

}

if(k==0)

{

if(alarmflag1==1)

{

if((hour==hourn)&&(min==minn))

{

speaker=xx

xx=~xx

if( alarmflag2==0)

lcd_w_cmd(0x01)

disalarm()

alarmflag2=1

}

else

{

dispd()

dispt()

}

}

else

{

dispd()

dispt()

}

} //调用LCD显示函数

}

}

/*延时函数*/

void delay(unsigned char t)

{

unsigned char j,i

for(i=0i<ti++)

for(j=0j<20j++)

}

/*延时函数1*/

void delay1()

{

_nop_()

_nop_()

_nop_()

}

/*LCD初始化函数*/

void int1()

{

lcd_w_cmd(0x3c)// 设置工作方式

lcd_w_cmd(0x0c)// 设置光标

lcd_w_cmd(0x01)// 清屏

lcd_w_cmd(0x06)// 设置输入方式

lcd_w_cmd(0x80)// 设置初始显示位置

}

/*LCD读状态函数*/

//返回值:返回状态字,最高位D7=0,LCD控制器空闲;D7=1,LCD控制器忙

unsigned char lcd_r_start()

{

unsigned char s

RW=1 //RW=1,RS=0,读LCD状态

delay1()

RS=0

delay1()

E=1 //E端时序

delay1()

s=P0 //从LCD的数据口读状态

delay1()

E=0

delay1()

RW=0

delay1()

return(s) //返回读取的LCD状态字

}

/*LCD写命令函数*/

void lcd_w_cmd(unsigned char com)

{

unsigned char i

do { // 查LCD忙 *** 作

i=lcd_r_start()// 调用读状态字函数

i=i&0x80 // 与 *** 作屏蔽掉低7位

delay(2)

} while(i!=0)// LCD忙,继续查询,否则退出循环

RW=0

delay1()

RS=0 // RW=0,RS=0,写LCD命令字

delay1()

E=1 //E端时序

delay1()

P0=com //将com中的命令字写入LCD数据口

delay1()

E=0

delay1()

RW=1

delay(255)

}

/*LCD写数据函数*/

void lcd_w_dat(unsigned char dat)

{

unsigned char i

do { // 查忙 *** 作

i=lcd_r_start()// 调用读状态字函数

i=i&0x80// 与 *** 作屏蔽掉低7位

delay(2)

} while(i!=0)// LCD忙,继续查询,否则退出循环

RW=0

delay1()

RS=1 // RW=1,RS=0,写LCD数据

delay1()

E=1 // E端时序

delay1()

P0=dat // 将dat中的显示数据写入LCD数据口

delay1()

E=0

delay1()

RW=1

delay(255)

}

/*****定时中断函数*****/

void timer0() interrupt 1

{

TH0=0x3c

TL0=0xb0

count++

if(count==20)

{

count=0

sec++

if(sec==60)

{

sec=0

min++

if(min==60)

{

min=0

hour++

if(hour==24)

{

hour=0

week++

day++

if(week==7) week=0

if(day==29&&month==2&&year%4!=0) {day=1month++}

else if(day==30&&month==2&&year%4==0) {day=1month++}

else if(day==31&&(month==4||month==6||month==9||month==11)) {day=1month++}

else if(day==32&&(month==1||month==3||month==5||month==7||month==8||month==10||month==12)) {day=1month++}

if(month==13)

{

month=1

year++

if(year==100) year=0

}

}

}

}

}

}

/*按键扫描函数*/

unsigned char keys()

{

unsigned char cod,del

P3=0xff

cod=P3&0xff//读入P3口键值

if(cod!=0xff)//先检测有无按键按下

{

delay(100) //去抖

if(cod!=0xff)

{

cod=P3&0xff//读入键值

do//等待键释放

{

P3=0xff

del=P3&0xff

}while(del!=0xff)

return(cod)//返回键值

}

}

return(0xf0) //返回该值

}

/*第一行显示日期函数*/

void dispd()

{

lcd_w_cmd(0x0c)//设置光标不显示、不闪烁

delay(20)

lcd_w_cmd(0x83)//第一行起始显示地址0x80+0x03

delay(20)

lcd_w_dat('2')

delay(2)

lcd_w_dat('0')

delay(2)

lcd_w_dat(lcdd[year/10])

delay(2)

lcd_w_dat(lcdd[year%10])

delay(2)

lcd_w_dat('-')

delay(2)

lcd_w_dat(lcdd[month/10])

delay(2)

lcd_w_dat(lcdd[month%10])

delay(2)

lcd_w_dat('-')

delay(2)

lcd_w_dat(lcdd[day/10])

delay(2)

lcd_w_dat(lcdd[day%10])

delay(2)

}

/*第二行显示时间、星期函数*/

void dispt()

{

lcd_w_cmd(0x0c)//设置光标不显示、不闪烁

delay(20)

lcd_w_cmd(0xc3)//第二行起始显示地址0x80+0x43

delay(20)

lcd_w_dat(lcdd[hour/10])

delay(2)

lcd_w_dat(lcdd[hour%10])

delay(2)

lcd_w_dat(':')

delay(2)

lcd_w_dat(lcdd[min/10])

delay(2)

lcd_w_dat(lcdd[min%10])

delay(2)

lcd_w_dat(':')

delay(2)

lcd_w_dat(lcdd[sec/10])

delay(2)

lcd_w_dat(lcdd[sec%10])

delay(2)

lcd_w_dat(' ')

delay(2)

lcd_w_dat('W')

delay(2)

lcd_w_dat(lcdd[week])

delay(2)

}

void disalarm()

{

lcd_w_cmd(0x0c)//设置光标不显示、不闪烁

delay(20)

lcd_w_cmd(0x80)//第一行起始显示地址0x80+0x03

delay(20)

lcd_w_dat('W')

delay(2)

lcd_w_dat('U')

delay(2)

lcd_w_dat('M')

delay(2)

lcd_w_dat('I')

delay(2)

lcd_w_dat('N')

delay(2)

lcd_w_dat('G')

delay(2)

lcd_w_dat('L')

delay(2)

lcd_w_dat('I')

delay(2)

lcd_w_dat('N')

delay(2)

lcd_w_dat(' ')

delay(2)

lcd_w_dat(' ')

delay(2)

lcd_w_dat('M')

delay(2)

lcd_w_dat('A')

delay(2)

lcd_w_dat('K')

delay(2)

lcd_w_dat('E')

delay(2)

lcd_w_cmd(0x0c)//设置光标不显示、不闪烁

delay(20)

lcd_w_cmd(0xc6)//第二行起始显示地址0x80+0x43

delay(20)

lcd_w_dat(lcdd[hourn/10])

delay(2)

lcd_w_dat(lcdd[hourn%10])

delay(2)

lcd_w_dat(':')

delay(2)

lcd_w_dat(lcdd[minn/10])

delay(2)

lcd_w_dat(lcdd[minn%10])

delay(2)

}

#include "stdafx.h"

#include "iostream.h"

#define M 2000

#define N 8

void magic(int a[M][M], int)

int main(int argc, char* argv[])

{

static int a[M][M]

int d = 12

int n = 8

while(1){

while(1)

{

cout<<"请输入方阵芹森的阶数, 阶数必须能被4整除:"

cin>>n

if(n%4 != 0 )cout<<仿察"笨蛋,看清楚题目!\n"<<endl

else if(n>64)cout<<n<<"! 这么大, 想累死我啊, 不给算了!\n"<<endl

else break

}

//Init

for(int i=1i<=ni++)

{

for(int j=1j<=nj++)

{

a[i][j]=d

d++

// d++

}

}

magic(a, n)

//Print dimension and sum for rows

for( i=1i<=ni++)

{

int sum=0

for(int j=1j<=nj++)

{

cout<<a[i][j]<<"\t"

sum+=a[i][j]

}

cout<<" | "<<sum<<"\n\n"

}

//Print sum of columns

for(i = 1i<=ni++)cout<<"--\t"

cout<<"\n"

for(i=1i<=ni++)

{

int sum = 0

for(int j = 1j<=nj++) sum += a[j][i]

cout<<sum<<"\t"

}

cout<<"\n\n"

char c

cout<<"Continue?(y/n)"

cin>>c

if(c=='n'|| c=='N')break

}

return 0

}

void exchg(int &a, int &b)

{

int t

t = a

a = b

b = t

}

void magic(int a[M][M], int n) // a:= 矩阵 n:= 实际阶数

{

int baseBlock_x=0

int baseBlock_y=0

int MaxBlock = n/4

if(MaxBlock%2==0)

{

for(int bx = 0bx<MaxBlock/2bx++)

for(int by=0by<MaxBlockby++)

{

for(int c = 1c <= 4c++)

{

exchg(a[bx*4+c][by*4+c], a[n+1-bx*4-c][n+1-by*4-c])

exchg(a[bx*4+c][by*4+5-c], a[n+1-bx*4-c][n+1-by*4-5+c])

}

}

}

else

{

for(int bx = 0bx<MaxBlock/2bx++)

{

for(int by=0by<MaxBlockby++)

{

for(int c = 1c <备首茄= 4c++)

{

exchg(a[bx*4+c][by*4+c], a[n+1-bx*4-c][n+1-by*4-c])

exchg(a[bx*4+c][by*4+5-c], a[n+1-bx*4-c][n+1-by*4-5+c])

}

}

}

bx = MaxBlock/2

for(int by=0by<MaxBlockby++)

{

for(int c = 1c <= 2c++)

{

exchg(a[bx*4+c][by*4+c], a[n+1-bx*4-c][n+1-by*4-c])

exchg(a[bx*4+c][by*4+5-c], a[n+1-bx*4-c][n-by*4-4+c])

}

}

}

}

// 电话本Dlg.cpp : 实现文件

//

#include stdafx.h

#include 电话本.h

#include 电话本Dlg.h

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

/正帆中/ C电话本Dlg 对话框

C电话本Dlg::C电话本Dlg(CWnd* pParent /*=NULL*/)

: CDialog(C电话本Dlg::IDD, pParent)

{

m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME)

}

void C电话本Dlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX)

}

BEGIN_MESSAGE_MAP(C电话本Dlg, CDialog)

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

//}}AFX_MSG_MAP

ON_EN_CHANGE(IDC_EDIT1, C电话本Dlg::OnName)

ON_EN_CHANGE(IDC_EDIT2, C电话本Dlg::OnPhoto)

ON_EN_CHANGE(IDC_EDIT3, C电话本Dlg::OnAddress)

ON_EN_CHANGE(IDC_EDIT4, C电话本Dlg::OnShow)

ON_BN_CLICKED(IDC_BUTTON1, C电话本轿李Dlg::OnFill)

ON_BN_CLICKED(IDC_BUTTON2, C电话本Dlg::OnInsert)

ON_BN_CLICKED(IDC_BUTTON3, C电话本Dlg::OnFind)

ON_BN_CLICKED(IDC_BUTTON4, C电话本Dlg::OnDelete)

ON_BN_CLICKED(IDC_BUTTON5, C电话本Dlg::OnEdit)

ON_BN_CLICKED(IDC_BUTTON7, C电话本Dlg::OnSave)

END_MESSAGE_MAP()

// C电话本Dlg 消息处理程序

BOOL C电话本Dlg::OnInitDialog()

{

CDialog::OnInitDialog()

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动

// 执行此 *** 作

SetIcon(m_hIcon, TRUE) // 设置大图标

SetIcon(m_hIcon, FALSE) // 设置小图标

// TODO: 在此添加额外的初始化代码

ifstream InFile(Wab.fsd,ios::in)

listWabList::iterator ItWab

char Tmp1[8],Tmp2[16],Tmp3[32]

Wab.clear()

while(InFile Tmp1 Tmp2 Tmp3)

{

OutWab.Name=Tmp1

OutWab.Photo=Tmp2

OutWab.Address=Tmp3

Wab.push_front(OutWab)

}

C电话本Dlg::OnFill()

return TRUE // 除非将焦点设置到控举山件,否则返回 TRUE

}

// 如果向对话框添加最小化按钮,则需要下面的代码

// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,

// 这将由框架自动完成。

void C电话本Dlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this)// 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_castWPARAM(dc.GetSafeHdc()), 0)

// 使图标在工作矩形中居中

int cxIcon = GetSystemMetrics(SM_CXICON)

int cyIcon = GetSystemMetrics(SM_CYICON)

CRect rect

GetClientRect(rect)

int x = (rect.Width() - cxIcon 1) / 2

int y = (rect.Height() - cyIcon 1) / 2

// 绘制图标

dc.DrawIcon(x, y, m_hIcon)

}

else

{

CDialog::OnPaint()

}

}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。

//

HCURSOR C电话本Dlg::OnQueryDragIcon()

{

return static_castHCURSOR(m_hIcon)

}

void C电话本Dlg::OnName()

{

CEdit *pMaxLen=(CEdit*)GetDlgItem(IDC_EDIT1)

pMaxLen-SetLimitText(6)

GetDlgItemText(IDC_EDIT1,InWab.Name)

}

void C电话本Dlg::OnPhoto()

{

CEdit *pMaxLen=(CEdit*)GetDlgItem(IDC_EDIT2)

pMaxLen-SetLimitText(11)

GetDlgItemText(IDC_EDIT2,InWab.Photo)

}

void C电话本Dlg::OnAddress()

{

CEdit *pMaxLen=(CEdit*)GetDlgItem(IDC_EDIT3)

pMaxLen-SetLimitText(30)

GetDlgItemText(IDC_EDIT3,InWab.Address)

}

void C电话本Dlg::OnShow()

{

// TODO: 如果该控件是 RICHEDIT 控件,则它将不会

// 发送该通知,除非重写 CDialog::OnInitDialog()

// 函数并调用 CRichEditCtrl().SetEventMask(),

// 同时将 ENM_CHANGE 标志“或”运算到掩码中。

// TODO: 在此添加控件通知处理程序代码

}

void C电话本Dlg::OnFill()

{

CString OutAll,OutTemp,Space,Enter

Space=_T( )

Enter=_T(\r\n)

listWabList::iterator ItWab

for(ItWab=Wab.begin()ItWab!=Wab.end()ItWab )

{

OutWab=*ItWab

OutTemp=OutWab.Name Space OutWab.Photo Space OutWab.Address

OutAll=OutAll OutTemp Enter

}

SetDlgItemText(IDC_EDIT4,OutAll)

}

void C电话本Dlg::OnInsert()

{

Wab.push_front(InWab)

C电话本Dlg::OnFill()

}

void C电话本Dlg::OnFind()

{

CString OutAll,OutTemp,Space,Enter

Space=_T( )

Enter=_T(\r\n)

listWabList::iterator ItWab

for(ItWab=Wab.begin()ItWab!=Wab.end()ItWab )

{

if(ItWab-Name==InWab.Name)

{

OutTemp=ItWab-Name Space ItWab-Photo Space ItWab-Address

OutAll=OutAll OutTemp Enter

}

}

SetDlgItemText(IDC_EDIT4,OutAll)

}

void C电话本Dlg::OnDelete()

{

CString OutAll,OutTemp,Space,Enter

Space=_T( )

Enter=_T(\r\n)

listWabList::iterator ItWab

for(ItWab=Wab.begin()ItWab!=Wab.end()ItWab )

{

if(ItWab-Name==InWab.Name)

{

OutTemp=ItWab-Name Space ItWab-Photo Space ItWab-Address

OutAll=OutAll OutTemp Enter

break

}

}

SetDlgItemText(IDC_EDIT4,OutAll)

if(ItWab!=Wab.end()) Wab.erase(ItWab)

}

void C电话本Dlg::OnEdit()

{

CString OutAll,OutTemp,Space,Enter

Space=_T( )

Enter=_T(\r\n)

listWabList::iterator ItWab

for(ItWab=Wab.begin()ItWab!=Wab.end()ItWab )

{

if(ItWab-Name==InWab.Name)

{

OutTemp=ItWab-Name Space ItWab-Photo Space ItWab-Address

OutAll=OutAll OutTemp Enter

break

}

}

SetDlgItemText(IDC_EDIT4,OutAll)

if(ItWab!=Wab.end())

{

Wab.erase(ItWab)

Wab.push_front(InWab)

}

}

void C电话本Dlg::OnSave()

{

CString Tmp1,Tmp2,Tmp3

ofstream OutFile(Wab.fsd,ios::out)

listWabList::iterator ItWab

for(ItWab=Wab.begin()ItWab!=Wab.end()ItWab )

{

Tmp1=ItWab-Name

Tmp2=ItWab-Photo

Tmp3=ItWab-Address

OutFile Tmp1 ' ' Tmp2 ' ' Tmp3 endl

}

}

只是个用C语言编写的电话本程序 很有实用意义


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12533962.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存