代码
python趣味编程代码

python趣味编程代码以下是一些趣味的Python编程代码示例:猜数字游戏:import randomnumber = random.randint(1, 100)guess = int(input("猜一个1到100之间的数字:"))while guess != number:if guess < number:print("猜小了!")else:print("猜大了!")guess = int(input("再猜一次:"))print("恭喜,你猜对了!")打印九九乘法表:for i in range(1, 10):for j in range(1, i+1):print(f"{i} ×{j} = {i*j}", end="")print()猜单词游戏:import randomwords = ["apple", "banana", "orange", "peach", "watermelon"] word = random.choice(words)hidden_word = "_" * len(word)print("猜单词游戏!")print(hidden_word)while hidden_word != word:guess = input("猜一个字母:")new_hidden_word = ""for i in range(len(word)):if guess == word[i]:new_hidden_word += guesselse:new_hidden_word += hidden_word[i]hidden_word = new_hidden_wordprint(hidden_word)print("恭喜,你猜对了!单词是", word)这些代码示例可以让你在学习编程的同时体验一些趣味和挑战。
代码名词解释

代码名词解释1. 什么是代码?代码是计算机程序的一种形式,它是一系列指令的集合,用于告诉计算机如何执行特定任务。
代码可以由程序员使用特定的编程语言编写,并通过编译器或解释器转换为计算机可以理解和执行的机器语言。
2. 代码的作用和重要性代码在现代社会中扮演着至关重要的角色。
以下是代码的几个主要作用:控制计算机行为代码告诉计算机执行特定任务,包括处理数据、运行应用程序、控制设备等。
通过编写不同的代码,我们可以实现各种不同的功能和行为。
解决问题通过编写代码,我们可以将复杂问题分解为更小、更易管理和理解的部分。
通过合理组织和设计代码,我们可以以一种系统化和可重复的方式解决问题。
自动化任务通过编写自动化脚本或程序,我们可以自动执行重复性、繁琐或耗时的任务。
这样可以提高效率并减少人工错误。
构建应用程序应用程序是指向用户提供某种功能或服务的软件。
通过编写代码,开发人员可以构建各种类型的应用程序,包括桌面应用程序、移动应用程序、Web应用程序等。
促进创新和科技发展代码是科技发展的驱动力之一。
通过编写代码,人们可以实现新的功能和创新的想法。
代码也为人们提供了学习和探索计算机科学的平台。
代码的重要性在现代社会中不可忽视。
几乎所有行业都依赖于计算机系统和软件应用程序来提供服务、管理数据和进行决策。
3. 常见的编程语言编程语言是用于编写代码的规则和结构。
以下是几种常见的编程语言:CC是一种通用高级编程语言,由Dennis Ritchie于1972年开发。
它具有高效性、可移植性和灵活性,并被广泛应用于系统软件、嵌入式系统等领域。
JavaJava是一种面向对象的编程语言,由Sun Microsystems(现为Oracle)于1995年推出。
它具有跨平台性、可靠性和安全性,并广泛应用于企业级应用程序开发、Android应用程序开发等领域。
PythonPython是一种简单易学且功能强大的高级编程语言,由Guido van Rossum于1989年开发。
代码大全

1.开心的过每一天[M] [ftc=#ef6ea8][fts=6][ftf=wingdings]{[/ft][/ft][/ft][/ft][/ft] -[U][B][ftc=#F49BC1]每兲[/B][/U][/ft][ftc=#bdbcbd]都要[[B][ftc=#00ffff]微笑[/ft][/B]]/[B][ftc=#bdbcbd]ナ 夶滴[ftc=#eaadea]smī1e。
[/ft][/B] [M][B]- 开々[ffg,#000000,#EE1D24][B]vv[/ft][/B]゛過每⒈/兲[/M] [M] [ftf=Comic Sans MS][fts=4] Never Give Up! -┈﹣-┈﹣--┈﹣-┈﹣- [/ft][ftf=Webdings]2,恶搞搞笑的[M]---------------[B]上帝[/B][U]對[/U]大熊貓[ftc=ED008C]說:[/ft]我可以[U]滿足你[/U]三個愿望。
- {[U]大熊貓[B]想了想[em]e20[/em][/B][/U]}說:-〔我[B]這輩子[/B][em]e24[/em][U]就[/U]兩個愿望,- [[B][U][ftc=00AEEF]第一個愿望[/ft][/U][/B]]?〕- [B]就是[/B]找個中醫[ftc=FBAF00]把[/ft]黑眼圈[U]治好[/U][em]e29[/em] - 再[B][ftc=17BCB4]有[/ft][/B]就是[U][B]我[/B],[/U]就想[B][ftc=37B400]照[/ft][/B] [[B][U][ftc=EE1D24]張[/U]~![/ft][/B]]彩色[em]e26[/em][B]照[/B][U]片[/U]!-----[em]e13[/em]-----[/M]3,璀璨星光[M][fts=6][ftc=#FF0000]*[/ft][/ft][/M][M][ftc=#FF0000]━[/ft]━[ftc=#FF0000]━[/ft]━[ftc=#FF0000]━[/ft]━[ftc=#FF0000]━[/ft]━[ftc=#FF0000]━[/ft]━[ftc=#FF0000]━[/ft]━[ft c=#FF0000]━[/ft]━[ftc=#FF0000]━[/ft]━[ftc=#FF0000]━[/ft]━[ftc=# FF0000]━[/ft]━[/M][M]《这世界总需要一些温情来不停地感动我们。
电脑代码一览表

电脑代码一览表(总9页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--代码一览表1 0×00000001 不正确的函数。
2 0×00000002 系统找不到指定的档案。
3 0×00000003 系统找不到指定的路径。
4 0×00000004 系统无法开启档案。
5 0×00000005 拒绝存取。
6 0×00000006 无效的代码。
7 0×00000007 储存体控制区块已毁。
8 0×00000008 储存体空间不足,无法处理这个指令。
9 0×00000009 储存体控制区块地址无效。
10 0×0000000A 环境不正确。
11 0×0000000B 尝试加载一个格式错误的程序。
12 0×0000000C 存取码错误。
13 0×0000000D 资料错误。
14 0×0000000E 储存体空间不够,无法完成这项作业。
15 0×0000000F 系统找不到指定的磁盘驱动器。
16 0×00000010 无法移除目录。
17 0×00000011 系统无法将档案移到其它的磁盘驱动器。
18 0×00000012 没有任何档案。
19 0×00000013 储存媒体为写保护状态。
20 0×00000014 系统找不到指定的装置。
21 0×00000015 装置尚未就绪。
22 0×00000016 装置无法识别指令。
23 0×00000017 资料错误 (cyclic redundancy check)24 0×00000018 程序发出一个长度错误的指令。
25 0×00000019 磁盘驱动器在磁盘找不到持定的扇区或磁道。
C语言代码大全

------------------------------------------------------------------------摘自宋鲁生程序设计大赛乘法口诀表#include <stdio.h>#include <conio.h>void main(void){int i,j,x,y;clrscr();printf("\n\n * * * 乘法口诀表* * * \n\n");x=9;y=5;for(i=1;i<=9;i++){gotoxy(x,y);printf("%2d ",i);x+=3;}x=7;y=6;for(i=1;i<=9;i++){gotoxy(x,y);printf("%2d ",i);y++;}x=9;y= 6;for(i=1;i<=9;i++){for(j=1;j<=9;j++){gotoxy(x,y);printf("%2d ",i*j);y++;}y-=9;x+=3;}printf("\n\n");}用一维数组统计学生成绩#include <stdio.h>void main(){char SelectKey,CreditMoney,DebitMoney;while(1){do{clrscr();puts("=========================");puts("| Please select key: |");puts("| 1. Quary |");puts("| 2. Credit |");puts("| 3. Debit |");puts("| 4. Return |");puts("=========================");SelectKey = getch();}while( SelectKey!='1' && SelectKey!='2' && SelectKey!='3' &&SelectKey!='4' );switch(SelectKey){case '1':clrscr();puts("================================");puts("| Your balance is $1000. |");puts("| Press any key to return... |");puts("================================");getch();break;case '2':do{clrscr();puts("==================================");puts("| Please select Credit money: |");puts("| 1. $50 |");puts("| 2. $100 |");puts("| 3. Return |");puts("==================================");CreditMoney = getch();}while( CreditMoney!='1' && CreditMoney!='2' && CreditMoney!='3' );switch(CreditMoney){case '1':clrscr();puts("=========================================");puts("| Your Credit money is $50,Thank you! |");puts("| Press any key to return... |");puts("=========================================");getch();break;case '2':clrscr();puts("==========================================");puts("| Your Credit money is $100,Thank you! |");puts("| Press any key to return... |");puts("==========================================");getch();break;case '3':break;}break;case '3':do{clrscr();puts("====================================");puts("| Please select Debit money: |");puts("| 1. $50 |");puts("| 2. $100 |");puts("| 3. $500 |");puts("| 4. $1000 |");puts("| 5. Return |");puts("====================================");DebitMoney = getch();}while( DebitMoney!='1' && DebitMoney!='2' && DebitMoney!='3' &&DebitMoney!='4' && DebitMoney!='5' );switch(DebitMoney){case '1':clrscr();puts("===========================================");puts("| Your Debit money is $50,Thank you! |");puts("| Press any key to return... |");puts("===========================================");getch();break;case '2':clrscr();puts("===========================================");puts("| Your Debit money is $100,Thank you! |");puts("| Press any key to return... |");puts("===========================================");getch();break;case '3':clrscr();puts("===========================================");puts("| Your Debit money is $500,Thank you! |");puts("| Press any key to return... |");puts("===========================================");getch();break;case '4':clrscr();puts("===========================================");puts("| Your Debit money is $1000,Thank you! |");puts("| Press any key to return... |");puts("===========================================");getch();break;case '5':break;}break;case '4':clrscr();puts("================================");puts("| Thank you for your using! |");puts("| Good bye! |");puts("================================");return;}}模拟ATM(自动柜员机)界面#include <stdio.h> void main(){int Password=0,Number=0,price=58,i=0;while( Password != 1234 ){if( i >= 3 )return;i++;puts("Please input Password: ");scanf("%d",&Password);}i=0;while( Number!=price ){do{puts("Please input a number between 1 and 100: ");scanf("%d",&Number);printf("Your input number is %d\n",Number);}while( !(Number>=1 && Number<=100) );if( Number >= 90 ){printf("Too Bigger! Press any key to try again!\n");}else if( Number >= 70 && Number < 90 ){printf("Bigger!\n");}else if( Number >= 1 && Number <= 30 ){printf("Too Small! Press any key to try again!\n");}else if( Number > 30 && Number <= 50 ){printf("Small! Press any key to try again!\n");}else{if( Number == price ){printf("OK! You are right! Bye Bye!\n");}else if( Number < price ){printf("Sorry,Only a little smaller! Press any key to try again!\n");}else if( Number > price ){printf(" Sorry, Only a little bigger! Press any key to try again!\n");}getch();}}用二维数组实现矩阵转置/* 用二维数组实现矩阵的转置*/#include <stdio.h>#define ROW 3#define COL 4main(){int matrixA[ROW][COL],matrixB[COL][ROW];int i,j; clrscr();printf("Enter elements of the matrixA,");printf("%d*%d:\n",ROW,COL);for( i=0; i<ROW; i++ ){for( j=0; j<COL; j++ ){scanf("%d",&matrixA[i][j]);}}for( i=0; i<ROW; i++ ){for( j=0; j<COL; j++ ){matrixB[j][i] = matrixA[i][j];}}printf("MatrixB,");printf("%d*%d:\n",COL,ROW);for( i=0; i<COL; i++ ){for( j=0; j<ROW; j++ ){printf("%8d",matrixB[i][j]);}printf("\n");}printf("\n Press Any Key to Quit... \n");getch();}求解二维数组的最大/最小元素#define MAXN 20int a[MAXN][MAXN];main(){int min, /* 存储最小值*/max; /* 存储最大值*/int row,col,n;clrscr();printf("Please input the order of the matrix:\n");/* 输入方阵的阶次*/ scanf("%d",&n);printf("Please input the elements of the matrix,\n from a[0][0] to a[%d][%d]:\n",n-1,n-1);for(row=0;row<n;row++)for(col=0;col<n;col++)scanf("%d",&a[row][col]);for(min=a[0][0],row=0;row<n;row++){/* 从每行选出最大数*/for(max=a[row][0],col=1;col<n;col++)/*从row行选出最大数*/if(max<a[row][col])max=a[row][col];if(min>max)/* 保存至row行的最小数*/min=max;}printf("The minimum of maximum number is %d\n",min);for(max=a[0][0],row=0;row<n;row++){/* 每行选出最小数*/for(min=a[row][0],col=1;col<n;col++)/* 从row行选出最小数*/ if(min>a[row][col])min=a[row][col];if(max<min)/*保存至row行的最大数*/max=min;}printf("The maximum of minimum numbers is %d\n",max);printf("\nPress any key to quit...\n");getch();}利用数组求前n个质数#define N 50main(){int primes[N];int pc,m,k; clrscr();printf("\n The first %d prime numbers are:\n",N);primes[0]=2;/*2是第一个质数*/pc =1;/*已有第一个质数*/m =3;/*被测试的数从3开始*/while(pc<N){/*调整m使它为下一个质数*/k=0;while(primes[k]*primes[k]<=m)if(m%primes[k]==0){/*m是合数*/m+=2;/*让m取下一个奇数*/k=1;/*不必用primes[0]=2去测试m,所以k从一开始*/}elsek++;/*继续用下一个质数去测试*/primes[pc++]=m;m+=2;/*除2外,其余质数均是奇数*/}/*输出primes[0]至primes[pc-1]*/for(k=0;k<pc;k++)printf("%4d",primes[k]);printf("\n\n Press any key to quit...\n ");getch();}编制万年历#include "stdio.h"long int f(int year,int month){/*f(年,月)=年-1,如月<3;否则,f(年,月)=年*/if(month<3) return year-1;else return year;} long int g(int month){/*g(月)=月+13,如月<3;否则,g(月)=月+1*/if(month<3) return month+13;else return month+1;} long int n(int year,int month,int day){/*N=1461*f(年、月)/4+153*g(月)/5+日*/return 1461L*f(year,month)/4+153L*g(month)/5+day;} int w(int year,int month,int day){/*w=(N-621049)%7(0<=w<7)*/return(int)((n(year,month,day)%7-621049L%7+7)%7);} int date[12][6][7];int day_tbl[ ][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};main(){int sw,leap,i,j,k,wd,day;int year;/*年*/char title[]="SUN MON TUE WED THU FRI SAT";clrscr();printf("Please input the year whose calendar you want to know: ");/*输入年*/scanf("%d%*c",&year);/*输入年份值和掠过值后的回车*/sw=w(year,1,1);leap=year%4==0&&year%100||year%400==0;/*判闰年*/for(i=0;i<12;i++)for(j=0;j<6;j++)for(k=0;k<7;k++)date[i][j][k]=0;/*日期表置0*/for(i=0;i<12;i++)/*一年十二个月*/for(wd=0,day=1;day<=day_tbl[leap][i];day++){/*将第i+1月的日期填入日期表*/date[i][wd][sw]=day;sw=++sw%7;/*每星期七天,以0至6计数*/if(sw==0) wd++;/*日期表每七天一行,星期天开始新的一行*/} printf("\n|==================The Calendar of Year %d=====================|\n|",year);for(i=0;i<6;i++){/*先测算第i+1月和第i+7月的最大星期数*/for(wd=0,k=0;k<7;k++)/*日期表的第六行有日期,则wd!=0*/wd+=date[i][5][k]+date[i+6][5][k];wd=wd?6:5;printf("%2d %s %2d %s |\n|",i+1,title,i+7,title);for(j=0;j<wd;j++){printf(" ");/*输出四个空白符*//*左栏为第i+1月,右栏为第i+7月*/for(k=0;k<7;k++)if(date[i][j][k])printf("%4d",date[i][j][k]);else printf(" ");printf(" ");/*输出十个空白符*/for(k=0;k<7;k++)if(date[i+6][j][k])printf("%4d",date[i+6][j][k]);else printf(" ");printf(" |\n|");}/*scanf("%*c");/*键入回车输出下一个月的日历*/}puts("=================================================================|") ;puts("\n Press any key to quit...");getch();}对数组元素排序rest(int a[], int n){int i,low,high,t; for(i=0,low=0,high=n-1;i<=high;) {if(a[i]>0){/*a[i]与a[high]交换,随之high减1*/t=a[i];a[i]=a[high];a[high]=t;high--;}else if(a[i]==0)i++; /* 掠过该元素*/else{/*a[i]与a[low]交换,随之low增1, i增1*/t=a[i];a[i]=a[low];a[low]=t;low++;i++;}}}int s[]={8,4,0,-1,6,0,-5};main(){int i;clrscr();printf("\n The arry before rest is:\n");for(i=0;i<sizeof(s)/sizeof(s[0]);i++)printf("%4d",s[i]);rest(s,sizeof(s)/sizeof(s[0]));printf("\n The arry after rest is:\n");for(i=0;i<sizeof(s)/sizeof(s[0]);i++)printf("%4d",s[i]);printf("\n Press any key to quit...\n");getch();}任意进制数的转换/* 函数trans将无符号整数n翻译成d(2<=d<=16)进制表示的字符串s */ #define M sizeof(unsigned int)*8int trans(unsigned n, int d, char s[]){static char digits[] ="0123456789ABCDEF"; /* 十六进制数字的字符*/char buf[M+1];int j, i = M;if(d<2||d>16){s[0]='\0'; /* 不合理的进制,置s为空字符串*/return 0; /* 不合理的进制,函数返回0 */}buf[i]='\0';do{buf[--i]=digits[n%d]; /*译出最低位,对应字符存入对应工作数组中*/n/=d;}while(n);/* 将译出在工作数组中的字符串复制到s */for(j=0;(s[j]=buf[i])!='\0';j++,i++);/* 其中控制条件可简写成s[j]=buf[i] */return j;}/* 主函数用于测试函数trans() */main(){unsigned int num = 253;int scale[]={2,3,10,16,1};char str[33];int i;clrscr();for(i=0;i<sizeof(scale)/sizeof(scale[0]);i++){if(trans(num,scale[i],str))printf("%5d = %s(%d)\n",num,str,scale[i]);elseprintf("%5d => (%d) Error! \n",num,scale[i]);}printf("\n Press any key to quit...\n");getch();}判断回文数/* 函数circle用于判断正整数n的d进制数表示形式是否是回文数*/ int circle(int n, int d){int s=0,m=n;while(m){s=s*d+m%d;m/=d;}return s==n;}/* main函数用于测试circle函数*/int num[]={232,27,851};int scale[]={2,10,16};main(){int i,j;clrscr();for(i=0;i<sizeof(num)/sizeof(num[0]);i++)for(j=0;j<sizeof(scale)/sizeof(scale[0]);j++)if(circle(num[i],scale[j]))printf("%d -> (%d) is a Circle Number!\n",num[i],scale[j]);elseprintf("%d -> (%d) is not a Circle Number!\n",num[i],scale[j]);printf("\n Press any key to quit...\n");getch();}求解钢材切割的最佳订单#include <stdio.h>#define N 20#define DELTA 2int bestlen;int bestsele[N];int sele[N];int n;int orderlen[N];int total;main(){int i;clrscr();printf("\n Please enter total length of the steel:\n");/* 输入钢材总长*/scanf("%d",&total);printf("\n Please enter number of order:\n"); /* 输入定单数*/ scanf("%d",&n);printf("\n Please enter the orders:\n"); /* 输入各定单*/for(i=0;i<n;i++)scanf("%d",&orderlen[i]);bestlen=0; /*最佳解用料的初值*/for(i=0;i<n;i++)sele[i]=bestsele[i]=0; /*置当前选择和最佳选择初值*/try(); /* 调用函数求解*/for(i=0;i<n;i++) /* 输出结果*/if(bestsele[i])printf("order %d length = %d\n",i+1,orderlen[i]);printf("\n Press any key to quit...");getch();}try(){int i,len;for(len=i=0;i<n;i++) /* 求当前选中的用料量*/if(sele[i])len+=orderlen[i]+DELTA;if(len-DELTA<=total) /* 注意最后一段可能不需要切割*/{if(bestlen < len){/* 找到一个更好的解*/bestlen = len;for(i=0;i<n;i++)bestsele[i]=sele[i];}for(i=0;i<n;i++) /* 对所有未选定单逐一作选中尝试循环*/if(!sele[i]){sele[i]=1; /* 做选中尝试*/try();sele[i]=0;}}}指向数组的指针main(){int x,y,z; /* 定义三个int型变量*/int *xp = &x, /* 定义指针变量xp,并赋值为x的地址,使xp指向x */ *yp = &y, /* 定义指针变量yp,并赋值为y的地址,使yp指向y */*zp = &z; /* 定义指针变量zp,并赋值为z的地址,使zp指向z */int t;printf("\nPlease input x,y,z:\n");scanf("%d%d%d",xp,yp,zp); /* 通过变量的指针,为变量输入值*/ if(*xp>*yp) /* 通过指向变量的指针引用变量的值*/{t=*xp; /* 通过指向变量的指针引用变量的值*/*xp=*yp;/* 通过指向变量x的指针xp,引用变量x的值*/*yp=t; /* 通过指向变量y的指针yp,引用变量y的值*/}if(*xp>*zp) /* 通过指向变量的指针,引用变量的值*/{t=*xp; /* 通过指向变量x的指针xp,引用变量x的值*/*xp=*zp;/* 通过指向变量x的指针xp,引用变量x的值*/*zp=t; /* 通过指向变量z的指针zp,引用变量z的值*/}if(*yp>*zp) /* 通过指向变量的指针,引用变量的值*/{t=*yp; /* 通过指向变量的指针,引用变量的值*/*yp=*zp;/* 通过指向变量y的指针yp,引用变量y的值*/*zp=t;/* 通过指向变量z的指针zp,引用变量z的值*/}printf("x = %d\ty = %d\tz = %d\n",x,y,z);printf("\nPress any key to quit...\n");getch();}阿拉伯数字转换为罗马数字#include <stdio.h>#define ROWS 4#define COLS 4int nums[ROWS][COLS]={{1000,1000,1000,1000},{900,500,400,100},{90,50,40,10},{9,5,4,1}};char *roms[ROWS][COLS]={{"m","m","m","m"}, {"cm","d","cd","c"},{"xc","l","xl","x"},{"ix","v","iv","i"}}; main(int argc,char *argv[ ]){int low,high;char roman[25]; if(argc<2){ printf("Usage:roman decimal_number\n");/*运行程序需带整数参数*/}high=low=atoi(argv[1]);/*将第一个参数转换成整数*/checknum(low);if(argc>2){/*带两个参数*/high=atoi(argv[2]);checknum(high);if(low>high){low=high;high=atoi(argv[1]);}}elselow=1;for(;low<=high;low++){to_roman(low,roman);printf("%d\t%s\n",low,roman);}} checknum(int val)/*检查参数合理性*/{if(val<1||val>9999){printf("The number must be in range 1..9999.\n");exit(0);}}to_roman(int decimal,char roman[ ])/*将整数转换成罗马数字表示*/ {int power,index;roman[0]='\0';for(power=0;power<ROWS;power++)for(index=0;index<COLS;index++)while(decimal>=nums[power][index]){strcat(roman,roms[power][index]);decimal-=nums[power][index];}}通讯录的输入输出#include <stdio.h>#define ZIPLEN 10#define PHONLEN 15/*struct addr类型定义*/ struct addr{char *name;/*姓名*/char *address;/*地址*/char zip[ZIPLEN];/*邮政编码*/char phone[PHONLEN];/*电话号码*/}; main()/*本主函数示意上述输入输出函数的用法*/{struct addr p[100];int i,j;clrscr();for(i=0;readaddr(p+i);i++);for(j=0;j<i;j++) writeaddr(p+j);puts("\n Press any key to quit...");getch();} /* 函数readaddr用于输入一个通信录函数*/int readaddr(struct addr *dpt){int len;char buf[120];/*输入字符串的缓冲区*/ printf("\nPlease input theName:\n");/*输入姓名*/if(scanf("%s",buf)==1){len=strlen(buf);dpt->name=(char *)malloc(len+1);/*申请存贮姓名的空间*/ strcpy(dpt->name,buf);}else return 0;/*Ctrl+Z结束输入*/printf("Please input the Address:\n");/*输入地址*/if(scanf("%s",buf)==1){len=strlen(buf);dpt->address=(char *)malloc(len+1);/*申请存贮地址的空间*/ strcpy(dpt->address,buf);}else{/*Ctrl+Z结束输入*/free(dpt->name);/*释放存贮姓名的空间*/return 0;}printf("Please input the Zip code:\n");/*输入邮编*/if(scanf("%s",buf)==1)strncpy(dpt->zip,buf,ZIPLEN-1);else{free(dpt->name);/*释放存贮姓名的空间*/free(dpt->address);/*释放存贮地址的空间*/return 0;/*Ctrl+Z结束输入*/}printf("Please input the Phone number:\n");/*输入电话号码*/ if(scanf("%s",buf)==1)strncpy(dpt->phone,buf,PHONLEN-1);else{free(dpt->name);free(dpt->address);return 0;/*Ctrl+Z结束输入*/}return 1;} /* 函数writeaddr用于输出通讯录*/int writeaddr(struct addr*dpt){printf("Name : %s\n", dpt->name);/*输出姓名*/printf("Address : %s\n", dpt->address);/*输出地址*/printf("Zip : %s\n", dpt->zip);/*输出邮编*/printf("Phone : %s\n\n", dpt->phone);/*输出电话号码*/}扑克牌的结构表示enum suits{CLUBS,DIAMONDS,HEARTS,SPADES}; struct card{enum suits suit;char value[3];};struct card deck[52];char cardval[][3]= {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};char suitsname[][9]={"CLUBS","DIAMONDS","HEARTS","SPADES"}; main() {int i,j;enum suits s;clrscr();for(i=0;i<=12;i++)for(s=CLUBS;s<=SPADES;s++){j=i*4+s;deck[j].suit=s;strcpy(deck[j].value,cardval[i]);}for(j=0;j<52;j++)printf("(%s%3s)%c",suitsname[deck[j].suit],deck[j].value,j%4==3?'\n':'\t');puts("\nPress any key to quit...");getch();}用“结构”统计学生成绩#include <stdio.h>#define N 200#define SCORES 5#define NUMLEN 10struct std_type{char no[NUMLEN];/*学号*/char *name;/*名字符串指针*/int scores[SCORES];/*五门功课的成绩*/};struct std_type students[N];int order[N];int total[N]; /*[函数]输入一个学生信息函数*/int readastu(struct std_type *spt){int len,j;char buf[120];/*输入字符串的缓冲区*/ printf("\nNumber : ");/*输入学号*/if(scanf("%s",buf)==1)strncpy(spt->no,buf,NUMLEN-1);elsereturn 0;/*Ctrl+Z结束输入*/printf("Name : ");/*输入姓名*/if(scanf("%s",buf)==1){len=strlen(buf);spt->name=(char *)malloc(len+1);/*申请存贮姓名的空间*/ strcpy(spt->name,buf);}else return 0;/*Ctrl+Z结束输入*/printf("Scores : ");/*输入成绩*/for(j=0;j<SCORES;j++)if(scanf("%d",spt->scores+j)!=1)break;if(j==0)/*一个成绩也未输入*/{free(spt->name);/*释放存贮姓名的空间*/return 0;}for(;j<SCORES;j++)/*少数未输入的成绩用0分代之*/ spt->scores[j]=0;return 1;} /*[函数]输出一个学生信息的函数*/int writeastu(struct std_type *spt){int i; printf("Number : %s\n",spt->no);/*输出学号*/printf("Name : %s\n",spt->name);/*输出姓名*/printf("Scores : ");/*输出成绩*/for(i=0;i<SCORES;i++)printf("%4d",spt->scores[i]);printf("\n\n");} main(){int n,i,j,t; clrscr();for(n=0;readastu(students+n);n++);/*采用冒泡法对学生信息数组排序*/for(i=0;i<n;i++){order[i]=i;/*预置第i个输入的学生*/for(t=0,j=0;j<SCORES;j++)/*求第i个学生的总分*/t+=students[i].scores[j];total[i]=t;}/*冒泡排序*/for(i=0;i<n-1;i++)/*共扫视n-1遍*/for(j=0;j<n-1-i;j++)if(total[order[j]]<total[order[j+1]]){/*交换名次*/t=order[j];order[j]=order[j+1];order[j+1]=t;}for(j=0;j<n;j++)/*输出*/writeastu(students+order[j]);printf("\n Press any key to quit...\n");getch();}报数游戏#include <stdio.h>struct ele{int no;struct ele *link;}main(){int n,m,i;struct ele *h,*u,*p;clrscr();printf("Please input n&m:\n");scanf("%d%d",&n,&m);/*输入n和m*/h=u=(struct ele *)malloc(sizeof(struct ele));/*形成首表元*/ h->no=1;for(i=2;i<=n;i++)/*形成其余的n-1个表元*/{u->link=(struct ele *)malloc(sizeof(struct ele));u=u->link;u->no=i;/*第i个表元置编号i*/}u->link=h;/*末表元后继首表元,形成环*/puts("\nThe numbers of who will quit the cycle in turn are:"); while(n){for(i=1;i<m;i++)/*掠过m-1个表元*/u=u->link;p=u->link;/*p指向第m个表元*/u->link=p->link;/*第m个表元从环中脱钩*/printf("%4d",p->no);free(p);/*释放第m个表元占用的空间*/n--;}printf("\n\n Press any key to quit...\n");getch();}学生成绩管理程序/*学生成绩管理程序编制一个统计学生考试分数的管理程序。
(完整版)C语言代码大全

摘自宋鲁生程序设计大赛乘法口诀表#include <stdio.h>#include <conio.h>void main(void){int i,j,x,y;clrscr();printf("\n\n * * * 乘法口诀表* * * \n\n");x=9;y=5;for(i=1;i<=9;i++){gotoxy(x,y);printf("%2d ",i);x+=3;}x=7;y=6;for(i=1;i<=9;i++){gotoxy(x,y);printf("%2d ",i);y++;}x=9;y= 6;for(i=1;i<=9;i++){for(j=1;j<=9;j++){gotoxy(x,y);printf("%2d ",i*j);y++;}y-=9;x+=3;}printf("\n\n");}用一维数组统计学生成绩#include <stdio.h>void main(){char SelectKey,CreditMoney,DebitMoney;while(1){do{clrscr();puts("=========================");puts("| Please select key: |");puts("| 1. Quary |");puts("| 2. Credit |");puts("| 3. Debit |");puts("| 4. Return |");puts("=========================");SelectKey = getch();}while( SelectKey!='1' && SelectKey!='2' && SelectKey!='3' &&SelectKey!='4' );switch(SelectKey){case '1':clrscr();puts("================================");puts("| Your balance is $1000. |");puts("| Press any key to return... |");puts("================================");getch();break;case '2':do{clrscr();puts("==================================");puts("| Please select Credit money: |");puts("| 1. $50 |");puts("| 2. $100 |");puts("| 3. Return |");puts("==================================");CreditMoney = getch();}while( CreditMoney!='1' && CreditMoney!='2' && CreditMoney!='3' );switch(CreditMoney){}break; case '3':do{ case '1':clrscr();puts("=========================================");puts("| Your Credit money is $50,Thank you! |");puts("| Press any key to return... |");puts("=========================================");getch();break;case '2':clrscr();puts("==========================================");puts("| Your Credit money is $100,Thank you! |");puts("| Press any key to return... |");puts("==========================================");getch();break;case '3':break;clrscr();puts("====================================");puts("| Please select Debit money: |");puts("| 1. $50 |");puts("| 2. $100 |");puts("| 3. $500 |");puts("| 4. $1000 |");puts("| 5. Return |");puts("====================================");DebitMoney = getch();}while( DebitMoney!='1' && DebitMoney!='2' && DebitMoney!='3' &&DebitMoney!='4' && DebitMoney!='5' );switch(DebitMoney){case '1':clrscr();puts("===========================================");puts("| Your Debit money is $50,Thank you! |");puts("| Press any key to return... |");puts("===========================================");getch();break;case '2':clrscr();puts("===========================================");puts("| Your Debit money is $100,Thank you! |");puts("| Press any key to return... |");puts("===========================================");getch();break;case '3':clrscr();puts("===========================================");puts("| Your Debit money is $500,Thank you! |");puts("| Press any key to return... |");puts("===========================================");getch();break;case '4':clrscr();puts("===========================================");puts("| Your Debit money is $1000,Thank you! |");puts("| Press any key to return... |");puts("===========================================");getch();break;case '5':break;}break;case '4':clrscr();puts("================================");puts("| Thank you for your using! |");puts("| Good bye! |");puts("================================");return;}}模拟ATM(自动柜员机)界面#include <stdio.h> void main(){int Password=0,Number=0,price=58,i=0;while( Password != 1234 ){if( i >= 3 )return;}i=0; i++;puts("Please input Password: "); scanf("%d",&Password);while( Number!=price ){do{puts("Please input a number between 1 and 100: ");scanf("%d",&Number);printf("Your input number is %d\n",Number);}while( !(Number>=1 && Number<=100) );if( Number >= 90 ){printf("Too Bigger! Press any key to try again!\n");}else if( Number >= 70 && Number < 90 ){printf("Bigger!\n");}else if( Number >= 1 && Number <= 30 ){printf("Too Small! Press any key to try again!\n");}else if( Number > 30 && Number <= 50 ){}else{printf("Small! Press any key to try again!\n");if( Number == price ){printf("OK! You are right! Bye Bye!\n");}else if( Number < price ){printf("Sorry,Only a little smaller! Press any key to try again!\n");}else if( Number > price ){printf(" Sorry, Only a little bigger! Press any key to try again!\n");}getch();}}用二维数组实现矩阵转置/* 用二维数组实现矩阵的转置*/#include <stdio.h>#define ROW 3#define COL 4main(){int matrixA[ROW][COL],matrixB[COL][ROW];int i,j; clrscr();printf("Enter elements of the matrixA,");printf("%d*%d:\n",ROW,COL);for( i=0; i<ROW; i++ ){for( j=0; j<COL; j++ ){scanf("%d",&matrixA[i][j]);}}for( i=0; i<ROW; i++ ){for( j=0; j<COL; j++ ){matrixB[j][i] = matrixA[i][j];}}printf("MatrixB,");printf("%d*%d:\n",COL,ROW);for( i=0; i<COL; i++ ){for( j=0; j<ROW; j++ ){printf("%8d",matrixB[i][j]);}printf("\n");}printf("\n Press Any Key to Quit... \n");getch();}求解二维数组的最大/最小元素#define MAXN 20int a[MAXN][MAXN];main(){int min, /* 存储最小值*/max; /* 存储最大值*/int row,col,n;clrscr();printf("Please input the order of the matrix:\n");/* 输入方阵的阶次*/ scanf("%d",&n);printf("Please input the elements of the matrix,\n from a[0][0] to a[%d][%d]:\n",n-1,n-1);for(row=0;row<n;row++)for(col=0;col<n;col++)scanf("%d",&a[row][col]);for(min=a[0][0],row=0;row<n;row++){/* 从每行选出最大数*/for(max=a[row][0],col=1;col<n;col++)/*从row 行选出最大数*/if(max<a[row][col])max=a[row][col];if(min>max)/* 保存至row 行的最小数*/min=max;}printf("The minimum of maximum number is %d\n",min);for(max=a[0][0],row=0;row<n;row++){/* 每行选出最小数*/for(min=a[row][0],col=1;col<n;col++)/* 从row 行选出最小数*/ if(min>a[row][col])min=a[row][col];if(max<min)/*保存至row 行的最大数*/max=min;}printf("The maximum of minimum numbers is %d\n",max);printf("\nPress any key to quit...\n");getch();}利用数组求前n 个质数#define N 50main(){int primes[N];int pc,m,k; clrscr();printf("\n The first %d prime numbers are:\n",N);primes[0]=2;/*2 是第一个质数*/pc =1;/*已有第一个质数*/m =3;/*被测试的数从3 开始*/while(pc<N){/*调整m 使它为下一个质数*/k=0;while(primes[k]*primes[k]<=m)if(m%primes[k]==0){/*m 是合数*/m+=2;/*让m 取下一个奇数*/k=1;/*不必用primes[0]=2 去测试m,所以k 从一开始*/}elsek++;/*继续用下一个质数去测试*/primes[pc++]=m;m+=2;/*除2 外,其余质数均是奇数*/}/*输出primes[0]至primes[pc-1]*/for(k=0;k<pc;k++)printf("%4d",primes[k]);printf("\n\n Press any key to quit...\n ");getch();}编制万年历#include "stdio.h"long int f(int year,int month){/*f(年,月)=年-1,如月<3;否则,f(年,月)=年*/if(month<3) return year-1;else return year;} long int g(int month){/*g(月)=月+13,如月<3;否则,g(月)=月+1*/if(month<3) return month+13;else return month+1;} long int n(int year,int month,int day){/*N=1461*f(年、月)/4+153*g(月)/5+日*/return 1461L*f(year,month)/4+153L*g(month)/5+day;} int w(int year,int month,int day){/*w=(N-621049)%7(0<=w<7)*/return(int)((n(year,month,day)%7-621049L%7+7)%7);} int date[12][6][7];int day_tbl[ ][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};main(){int sw,leap,i,j,k,wd,day;int year;/*年*/char title[]="SUN MON TUE WED THU FRI SAT";clrscr();printf("Please input the year whose calendar you want to know: ");/*输入年*/scanf("%d%*c",&year);/*输入年份值和掠过值后的回车*/sw=w(year,1,1);leap=year%4==0&&year%100||year%400==0;/*判闰年*/for(i=0;i<12;i++)for(j=0;j<6;j++)for(k=0;k<7;k++)date[i][j][k]=0;/*日期表置0*/for(i=0;i<12;i++)/*一年十二个月*/for(wd=0,day=1;day<=day_tbl[leap][i];day++){/*将第i+1 月的日期填入日期表*/date[i][wd][sw]=day;sw=++sw%7;/*每星期七天,以0 至6 计数*/if(sw==0) wd++;/*日期表每七天一行,星期天开始新的一行*/} printf("\n|==================The Calendar of Year %d=====================|\n|",year);for(i=0;i<6;i++){/*先测算第i+1 月和第i+7 月的最大星期数*/for(wd=0,k=0;k<7;k++)/*日期表的第六行有日期,则wd!=0*/wd+=date[i][5][k]+date[i+6][5][k];wd=wd?6:5;printf("%2d %s %2d %s |\n|",i+1,title,i+7,title);for(j=0;j<wd;j++){printf(" ");/*输出四个空白符*//*左栏为第i+1 月,右栏为第i+7 月*/for(k=0;k<7;k++)if(date[i][j][k])printf("%4d",date[i][j][k]);else printf(" ");printf(" ");/*输出十个空白符*/for(k=0;k<7;k++)if(date[i+6][j][k])printf("%4d",date[i+6][j][k]);else printf(" ");printf(" |\n|");}/*scanf("%*c");/*键入回车输出下一个月的日历*/}puts("=================================================================|") ;puts("\n Press any key to quit...");getch();}对数组元素排序rest(int a[], int n){int i,low,high,t; for(i=0,low=0,high=n-1;i<=high;) {if(a[i]>0){/*a[i]与a[high]交换,随之high 减1*/t=a[i];a[i]=a[high];a[high]=t;high--;}else if(a[i]==0)i++; /* 掠过该元素*/else{/*a[i]与a[low]交换,随之low 增1, i 增1*/t=a[i];a[i]=a[low];a[low]=t;low++; i++;}}}int s[]={8,4,0,-1,6,0,-5};main(){int i;clrscr();printf("\n The arry before rest is:\n");for(i=0;i<sizeof(s)/sizeof(s[0]);i++)printf("%4d",s[i]);rest(s,sizeof(s)/sizeof(s[0]));printf("\n The arry after rest is:\n");for(i=0;i<sizeof(s)/sizeof(s[0]);i++)printf("%4d",s[i]);printf("\n Press any key to quit...\n");getch();}任意进制数的转换/* 函数trans 将无符号整数n 翻译成d(2<=d<=16)进制表示的字符串s */ #define M sizeof(unsigned int)*8int trans(unsigned n, int d, char s[]){static char digits[] ="0123456789ABCDEF"; /* 十六进制数字的字符*/char buf[M+1];int j, i = M;if(d<2||d>16){s[0]='\0'; /* 不合理的进制,置s 为空字符串*/return 0; /* 不合理的进制,函数返回0 */}buf[i]='\0';do{buf[--i]=digits[n%d]; /*译出最低位,对应字符存入对应工作数组中*/n/=d;}while(n);/* 将译出在工作数组中的字符串复制到s */for(j=0;(s[j]=buf[i])!='\0';j++,i++);/* 其中控制条件可简写成s[j]=buf[i] */return j;}/* 主函数用于测试函数trans() */main(){unsigned int num = 253;int scale[]={2,3,10,16,1};char str[33];int i;clrscr();for(i=0;i<sizeof(scale)/sizeof(scale[0]);i++){if(trans(num,scale[i],str))printf("%5d = %s(%d)\n",num,str,scale[i]);elseprintf("%5d => (%d) Error! \n",num,scale[i]);}printf("\n Press any key to quit...\n");getch();}判断回文数/* 函数circle 用于判断正整数n 的d 进制数表示形式是否是回文数*/ int circle(int n, int d){int s=0,m=n;while(m){s=s*d+m%d;m/=d;}return s==n;}/* main 函数用于测试circle 函数*/int num[]={232,27,851};int scale[]={2,10,16};main(){int i,j;clrscr();for(i=0;i<sizeof(num)/sizeof(num[0]);i++)for(j=0;j<sizeof(scale)/sizeof(scale[0]);j++)if(circle(num[i],scale[j]))printf("%d -> (%d) is a Circle Number!\n",num[i],scale[j]);elseprintf("%d -> (%d) is not a Circle Number!\n",num[i],scale[j]);printf("\n Press any key to quit...\n");getch();}求解钢材切割的最佳订单#include <stdio.h>#define N 20#define DELTA 2int bestlen;int bestsele[N];int sele[N];int n;int orderlen[N];int total;main(){int i;clrscr();printf("\n Please enter total length of the steel:\n");/* 输入钢材总长*/scanf("%d",&total);printf("\n Please enter number of order:\n"); /* 输入定单数*/ scanf("%d",&n);printf("\n Please enter the orders:\n"); /* 输入各定单*/for(i=0;i<n;i++)scanf("%d",&orderlen[i]);bestlen=0; /*最佳解用料的初值*/for(i=0;i<n;i++)sele[i]=bestsele[i]=0; /*置当前选择和最佳选择初值*/try(); /* 调用函数求解*/for(i=0;i<n;i++) /* 输出结果*/if(bestsele[i])printf("order %d length = %d\n",i+1,orderlen[i]);printf("\n Press any key to quit...");getch();}try(){int i,len;for(len=i=0;i<n;i++) /* 求当前选中的用料量*/if(sele[i])len+=orderlen[i]+DELTA;if(len-DELTA<=total) /* 注意最后一段可能不需要切割*/{if(bestlen < len){/* 找到一个更好的解*/bestlen = len;for(i=0;i<n;i++)bestsele[i]=sele[i];}for(i=0;i<n;i++) /* 对所有未选定单逐一作选中尝试循环*/if(!sele[i]){sele[i]=1; /* 做选中尝试*/try();sele[i]=0;}}}指向数组的指针main(){int x,y,z; /* 定义三个int 型变量*/int *xp = &x, /* 定义指针变量xp,并赋值为x 的地址,使xp 指向x */ *yp = &y, /* 定义指针变量yp,并赋值为y 的地址,使yp 指向y */ *zp = &z; /* 定义指针变量zp,并赋值为z 的地址,使zp 指向z */int t;printf("\nPlease input x,y,z:\n");scanf("%d%d%d",xp,yp,zp); /* 通过变量的指针,为变量输入值*/if(*xp>*yp) /* 通过指向变量的指针引用变量的值*/{t=*xp; /* 通过指向变量的指针引用变量的值*/*xp=*yp;/* 通过指向变量x 的指针xp,引用变量x 的值*/*yp=t; /* 通过指向变量y 的指针yp,引用变量y 的值*/}if(*xp>*zp) /* 通过指向变量的指针,引用变量的值*/{t=*xp; /* 通过指向变量x 的指针xp,引用变量x 的值*/*xp=*zp;/* 通过指向变量x 的指针xp,引用变量x 的值*/*zp=t; /* 通过指向变量z 的指针zp,引用变量z 的值*/}if(*yp>*zp) /* 通过指向变量的指针,引用变量的值*/{t=*yp; /* 通过指向变量的指针,引用变量的值*/*yp=*zp;/* 通过指向变量y 的指针yp,引用变量y 的值*/*zp=t;/* 通过指向变量z 的指针zp,引用变量z 的值*/}printf("x = %d\ty = %d\tz = %d\n",x,y,z);printf("\nPress any key to quit...\n");getch();}阿拉伯数字转换为罗马数字#include <stdio.h>#define ROWS 4#define COLS 4int nums[ROWS][COLS]={{1000,1000,1000,1000},{900,500,400,100},{90,50,40,10},{9,5,4,1}};char *roms[ROWS][COLS]={{"m","m","m","m"}, {"cm","d","cd","c"},{"xc","l","xl","x"},{"ix","v","iv","i"}}; main(int argc,char *argv[ ]){int low,high;char roman[25]; if(argc<2){ printf("Usage:roman decimal_number\n");/*运行程序需带整数参数*/}high=low=atoi(argv[1]);/*将第一个参数转换成整数*/checknum(low);if(argc>2){/*带两个参数*/high=atoi(argv[2]);checknum(high);if(low>high){low=high;high=atoi(argv[1]);}}elselow=1;for(;low<=high;low++){to_roman(low,roman);printf("%d\t%s\n",low,roman);}} checknum(int val)/*检查参数合理性*/{if(val<1||val>9999){printf("The number must be in range 1..9999.\n");exit(0);}}to_roman(int decimal,char roman[ ])/*将整数转换成罗马数字表示*/ {int power,index;roman[0]='\0';for(power=0;power<ROWS;power++)for(index=0;index<COLS;index++)while(decimal>=nums[power][index]){strcat(roman,roms[power][index]);decimal-=nums[power][index];}}通讯录的输入输出#include <stdio.h>#define ZIPLEN 10#define PHONLEN 15/*struct addr 类型定义*/ struct addr{char *name;/*姓名*/char *address;/*地址*/char zip[ZIPLEN];/*邮政编码*/char phone[PHONLEN];/*电话号码*/}; main()/*本主函数示意上述输入输出函数的用法*/{struct addr p[100];int i,j;clrscr();for(i=0;readaddr(p+i);i++);for(j=0;j<i;j++) writeaddr(p+j);puts("\n Press any key to quit...");getch();} /* 函数readaddr 用于输入一个通信录函数*/int readaddr(struct addr *dpt){int len;char buf[120];/*输入字符串的缓冲区*/ printf("\nPlease input theName:\n");/*输入姓名*/if(scanf("%s",buf)==1){len=strlen(buf);dpt->name=(char *)malloc(len+1);/*申请存贮姓名的空间*/ strcpy(dpt->name,buf);}else return 0;/*Ctrl+Z 结束输入*/printf("Please input the Address:\n");/*输入地址*/if(scanf("%s",buf)==1){len=strlen(buf);dpt->address=(char *)malloc(len+1);/*申请存贮地址的空间*/ strcpy(dpt->address,buf);}else{/*Ctrl+Z 结束输入*/free(dpt->name);/*释放存贮姓名的空间*/return 0;}printf("Please input the Zip code:\n");/*输入邮编*/if(scanf("%s",buf)==1)strncpy(dpt->zip,buf,ZIPLEN-1);else{free(dpt->name);/*释放存贮姓名的空间*/free(dpt->address);/*释放存贮地址的空间*/return 0;/*Ctrl+Z 结束输入*/}printf("Please input the Phone number:\n");/*输入电话号码*/ if(scanf("%s",buf)==1)strncpy(dpt->phone,buf,PHONLEN-1);else{free(dpt->name);free(dpt->address);return 0;/*Ctrl+Z 结束输入*/}return 1;} /* 函数writeaddr 用于输出通讯录*/int writeaddr(struct addr*dpt){printf("Name : %s\n", dpt->name);/* 输出姓名*/printf("Address : %s\n", dpt->address);/*输出地址*/printf("Zip : %s\n", dpt->zip);/* 输出邮编*/printf("Phone : %s\n\n", dpt->phone);/*输出电话号码*/}扑克牌的结构表示enum suits{CLUBS,DIAMONDS,HEARTS,SPADES}; struct card{enum suits suit;char value[3];};struct card deck[52];char cardval[][3]= {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};char suitsname[][9]={"CLUBS","DIAMONDS","HEARTS","SPADES"}; main() {int i,j;enum suits s;clrscr();for(i=0;i<=12;i++)for(s=CLUBS;s<=SPADES;s++){j=i*4+s;deck[j].suit=s;strcpy(deck[j].value,cardval[i]);}for(j=0;j<52;j++)printf("(%s%3s)%c",suitsname[deck[j].suit],deck[j].value,j%4==3?'\n':'\t');puts("\nPress any key to quit...");getch();}用“结构”统计学生成绩#include <stdio.h>#define N 200#define SCORES 5#define NUMLEN 10struct std_type{char no[NUMLEN];/*学号*/char *name;/*名字符串指针*/int scores[SCORES];/*五门功课的成绩*/};struct std_type students[N];int order[N];int total[N]; /*[函数]输入一个学生信息函数*/int readastu(struct std_type *spt){int len,j;char buf[120];/*输入字符串的缓冲区*/ printf("\nNumber : ");/*输入学号*/if(scanf("%s",buf)==1)strncpy(spt->no,buf,NUMLEN-1);elsereturn 0;/*Ctrl+Z 结束输入*/printf("Name : ");/*输入姓名*/if(scanf("%s",buf)==1){len=strlen(buf);spt->name=(char *)malloc(len+1);/*申请存贮姓名的空间*/ strcpy(spt->name,buf);}else return 0;/*Ctrl+Z 结束输入*/printf("Scores : ");/*输入成绩*/for(j=0;j<SCORES;j++)if(scanf("%d",spt->scores+j)!=1)break;if(j==0)/*一个成绩也未输入*/{free(spt->name);/*释放存贮姓名的空间*/return 0;}for(;j<SCORES;j++)/*少数未输入的成绩用0 分代之*/ spt->scores[j]=0;return 1;} /*[函数]输出一个学生信息的函数*/int writeastu(struct std_type *spt){int i; printf("Number : %s\n",spt->no);/*输出学号*/printf("Name : %s\n",spt->name);/*输出姓名*/printf("Scores : ");/* 输出成绩*/for(i=0;i<SCORES;i++)printf("%4d",spt->scores[i]);printf("\n\n");} main(){int n,i,j,t; clrscr();for(n=0;readastu(students+n);n++);/*采用冒泡法对学生信息数组排序*/for(i=0;i<n;i++){order[i]=i;/* 预置第i 个输入的学生*/for(t=0,j=0;j<SCORES;j++)/*求第i 个学生的总分*/t+=students[i].scores[j];total[i]=t;}/*冒泡排序*/for(i=0;i<n-1;i++)/*共扫视n-1 遍*/for(j=0;j<n-1-i;j++)if(total[order[j]]<total[order[j+1]]){/*交换名次*/t=order[j];order[j]=order[j+1];order[j+1]=t;}for(j=0;j<n;j++)/* 输出*/writeastu(students+order[j]);printf("\n Press any key to quit...\n");getch();}报数游戏#include <stdio.h>struct ele{int no;struct ele *link;}main(){int n,m,i;struct ele *h,*u,*p;clrscr();printf("Please input n&m:\n");scanf("%d%d",&n,&m);/*输入n 和m*/h=u=(struct ele *)malloc(sizeof(struct ele));/*形成首表元*/ h->no=1;for(i=2;i<=n;i++)/*形成其余的n-1 个表元*/{u->link=(struct ele *)malloc(sizeof(struct ele));u=u->link;u->no=i;/*第i 个表元置编号i*/}u->link=h;/*末表元后继首表元,形成环*/puts("\nThe numbers of who will quit the cycle in turn are:"); while(n){for(i=1;i<m;i++)/*掠过m-1 个表元*/u=u->link;p=u->link;/*p 指向第m 个表元*/u->link=p->link;/*第m 个表元从环中脱钩*/printf("%4d",p->no);free(p);/*释放第m 个表元占用的空间*/n--;}printf("\n\n Press any key to quit...\n");getch();}学生成绩管理程序/*学生成绩管理程序编制一个统计学生考试分数的管理程序。
代码生成方法
代码生成方法代码生成是指通过特定的工具或算法,自动生成计算机程序的过程。
它是一种自动化技术,旨在缩短程序开发的时间,并帮助开发人员避免重复性工作或可能引起错误的任务。
代码生成的方法和技术有很多种,包括模板引擎、元编程、反射、代码注解等,下面将就其中一些方法进行详细介绍。
一、模板引擎模板引擎是一种生成代码的常用方法,它通过定义模板来生成代码。
模板是一种标记语言,用于描述生成的代码的结构和内容。
开发人员可以使用模板引擎,将输入数据与模板结合起来生成代码。
相比较手动编写代码,使用模板引擎可以显著提高代码开发的效率。
模板引擎的常用语言有Jinja2, Mustache, Handlebars等。
以Jinja2为例,其模板语言类似于Python,通常包含变量和控制语句:```{% for item in items %}{{ item }}{% endfor %}```上面的代码中,{% for %}和{% endfor %}是Jinja2的控制语句,用来循环遍历items 列表中的元素,{{ item }}是变量,表示当前元素的值。
使用模板引擎的步骤通常如下:1. 定义模板,确定占位符和控制语句。
2. 准备数据,将需要生成代码的数据提供给模板。
3. 使用模板引擎,将模板和数据结合起来生成代码。
二、元编程元编程是指在运行时生成或操作程序代码的技术。
通过元编程,程序员可以动态地修改和生成程序代码,避免代码重复,并根据不同的数据动态生成适合不同场景的代码。
元编程的技巧包括反射、元类、AST树等。
元类是元编程中最重要的技术之一。
元类可以定义类,属性与方法等,有点像类的工厂,可以动态地创建类。
```NewClass = type('NewClass', (), {})```第一个参数是类的名称,第二个参数为空元组表示不继承任何类,第三个参数为空字典表示不定义任何属性或方法。
通过元编程,程序员可以动态修改和生成代码,例如通过读取外部文件或根据不同的条件生成不同的代码。
简单的python程序代码
简单的python程序代码Python是一门高级编程语言,它的语法简单易懂,非常适合初学者入门。
本文将介绍一些简单的Python程序代码,帮助初学者更好地理解Python编程。
一、输出语句Python中的输出语句非常简洁易懂,只需要使用print函数即可。
例如:print("Hello, world!")输出结果为:二、变量Python中的变量也很容易理解,可以用来储存数据,并且可以被反复调用。
a = 10c = a + bprint(c)30三、条件语句Python中的条件语句分为if语句和if...else语句。
if age >= 18:print("你已经成年了!")else:四、循环语句for i in range(1, 11):12456789五、函数Python中的函数可以用来封装一些代码块,可以使代码更加简洁明了。
def add(a, b):return resultc = add(2, 3)六、列表Python中的列表可以储存多个值,可以用来创建数组或矩阵。
list1 = [1, 2, 3, 4]list2 = ["apple", "banana", "orange"]七、字典Python中的字典也很常用,可用于存储键值对。
dict1 = {"name":"张三", "age":18, "sex":"男"}print(dict1["name"])张三总之,Python是一门非常简单易懂的编程语言,只要掌握了基础语法,就可以开发出功能强大的应用程序。
希望本文能够为初学者提供一些帮助。
电脑指令代码大全
电脑指令代码大全在计算机编程领域,指令代码是一种用于控制计算机硬件执行特定操作的命令集合。
它可以用于实现各种功能,从简单的数学运算到复杂的图形处理。
本文将为大家介绍一些常见的电脑指令代码,帮助大家更好地理解和应用这些代码。
首先,我们来介绍一些常见的数学运算指令代码。
在计算机编程中,我们经常需要对数字进行加减乘除等运算。
比如,加法运算可以使用“add”指令,减法运算可以使用“sub”指令,乘法运算可以使用“mul”指令,除法运算可以使用“div”指令。
这些指令可以帮助我们实现各种复杂的数学运算,从而完成各种计算任务。
除了数学运算,我们还经常需要对数据进行逻辑操作。
比如,我们可能需要对数据进行比较、逻辑与或非运算。
这时,我们可以使用一些逻辑操作指令代码来实现。
比如,比较操作可以使用“cmp”指令,逻辑与操作可以使用“and”指令,逻辑或操作可以使用“or”指令,逻辑非操作可以使用“not”指令。
这些指令可以帮助我们实现各种复杂的逻辑操作,从而完成各种逻辑判断和控制任务。
此外,我们还需要对内存进行读写操作。
在计算机编程中,我们经常需要从内存中读取数据,或者将数据写入内存。
这时,我们可以使用一些内存操作指令代码来实现。
比如,读操作可以使用“load”指令,写操作可以使用“store”指令。
这些指令可以帮助我们实现对内存的读写操作,从而完成各种数据存取任务。
除了上述常见的指令代码,还有一些其他类型的指令代码,比如跳转指令、函数调用指令、IO操作指令等。
这些指令代码可以帮助我们实现各种复杂的控制和交互操作,从而完成各种实际的应用任务。
总的来说,电脑指令代码是计算机编程中非常重要的一部分,它可以帮助我们实现各种复杂的功能和任务。
通过学习和掌握各种指令代码,我们可以更好地理解和应用计算机编程,从而提高自己的编程能力,实现更加丰富和复杂的应用。
希望本文介绍的一些常见的指令代码对大家有所帮助,也希望大家能够进一步深入学习和掌握更多的指令代码,从而在编程领域取得更大的成就。
编程代码大全
编程代码大全编程,这个在当今数字化时代中无处不在的领域,充满了各种神奇和实用的代码。
对于初学者来说,面对浩瀚的编程世界,可能会感到有些迷茫。
那么,就让我们一起来探索一下这个丰富多彩的编程代码世界吧。
首先,我们来谈谈 Python 语言。
Python 以其简洁易懂的语法而备受青睐。
比如,下面这段简单的 Python 代码可以实现打印出“Hello World!”:```pythonprint("Hello World!")```再看一个稍微复杂点的例子,计算两个数的和:```pythonnum1 = 5num2 = 10sum = num1 + num2print("两数之和为:", sum)``````javapublic class HelloWorld {public static void main(String args) {Systemoutprintln("Hello World!");}}```而在 C++中,打印“Hello World!”的代码如下:```c++include <iostream>int main(){std::cout <<"Hello World!"<< std::endl;return 0;}```JavaScript 作为网页开发中常用的语言,也有它独特的魅力。
比如在网页中弹出一个提示框显示“Hello World!”:```javascriptalert("Hello World!");```除了这些常见的编程语言,还有一些特定领域的代码。
比如在数据处理方面,SQL(Structured Query Language)语言就非常重要。
以下是一个简单的 SQL 查询语句,用于从名为“students”的表中获取所有学生的姓名:```sqlSELECT name FROM students;```在网页设计中,HTML(HyperText Markup Language)和 CSS (Cascading Style Sheets)也不可或缺。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <wire.h>#include <eeprom.h>/*** 记录:目前较为稳定的实验参数为33, 66,挂绳貌似能垂直起降,但是真正试飞时依然侧飞* 试飞时,在3秒内飞到10米高,测距周期是100ms,对应的距离是33cm* 起飞时:* 1. 遥控在0~directCtrlRange时,按n*5计算转速,方便调试* 2. 遥控>directCtrlRange时,按n-directCtrlRange+10计算高度,油门按一定速度缓慢上升,直到离地指定的高度* 3. 超声波测距量程是2~180cm,不知道为什么超出量程时会读出7cm的数值,必须注意纠错*/boolean connectToPc = false;long stableTime = 1500000;int directCtrlRange = 40;double fastStep = 1.8;double maxThrottle = 650;/* Gyro sensor */int GYRO_ADDR = 0x68; // 7-bit address: 1101000, change to 0x69 if SDO is Highbyte GYRO_READ_START = 0xA8; //Start register address, total 6 bytes: (XL,XH,YL,YH,ZL,ZH) int gyroXYZ[3];int gyroOffset[3];int gyroCS_Pin = 4;int gyroSDO_Pin = 5;/* Accessory sensor */int ACC_ADDR = 0x53; // 7-bit address, change to 0x53 if SDO is Highbyte ACC_READ_START = 0x32; //Start register address, total 6 bytes: (XL,XH,YL,YH,ZL,ZH)int accXYZ[3];int accOffset[3];/* Compass sensor */int COMP_ADDR = 0x3C >> 1;byte COMP_READ_START = 0x03;int compXYZ[3]; //Notice that it is XZY/* Motor settings */int motorPins[4];int minPWM = 900; //电机控制的PWM最低幅值为0.9ms,最高幅值为2.1msint maxPWM_Delay = 1100; //电机控制的PWM范围,这里记录它们的差并留一点裕度int ctrlPower = 0; //从遥控器发来的控制指令double throttle = 0; //油门范围,从0到1200,对应从minPWM到2100int motorPowers[4];int motorCtrl[8]; //电机控制的顺序和时间,值表示从0.9ms开始,(delayMs-PinIdx)*4/* Ultrasonic sensor */int trigPin = 3;int echoPin = 2; //对应的中断号是0volatile double ultraT1 = 0;volatile double ultraT2 = 0;double distance = 0; //测量的离地距离,单位是厘米double preDistance = 0;double stablePower = 0; //正好可以离地而起的马力(假设保持这个马力,可以匀速上升或下降)int maxDistance = 250; //离地可测量的最大高度int targetDistance = 10; //目标离地高度int ultraCount = 0;/* For testing */int reportType = 0;int reportArr[3];int reportT[3];/* Read from control */int buffer[6]; //0,1: 0xFF, 2: Power, 3: Log Type, 4: P_V alue, 5: I_Valueint bufferIndex = 0;/* PID console */double P_Control, I_Control;double balanceGyro = 0.99; //用于融合陀螺仪和加速度计的角度double balanceAcc = 0.9; // 加速度传感器读数平均,用于消除抖动double balanceSpeed = 0.05; // 用于陀螺仪读数平均(陀螺仪比较精确)double balanceXY = 1, balanceX = 1, balanceY = 1;double angleX, angleY, angleZ, speedX, speedY, accAngleX, accAngleY;double testAngleX;double compAngle;boolean hasReadCompAngle = false;/* Main control start */void setup(){motorPins[0] = 38; //x1motorPins[1] = 43; //x2motorPins[2] = 42; //y1motorPins[3] = 39; //y2for(int i = 0; i < 4; i++) pinMode(motorPins[i], OUTPUT);Serial.begin(9600);Wire.begin();pinMode(gyroCS_Pin, OUTPUT);pinMode(gyroSDO_Pin, OUTPUT);digitalWrite(gyroCS_Pin, 1); //enable I2C for GYROdigitalWrite(gyroSDO_Pin, 0); //set I2C address last bitsetupGyroSensor(250);setupAccSensor();setupCompSensor();pinMode(trigPin, OUTPUT);attachInterrupt(0, blink, CHANGE);digitalWrite(trigPin, 0);// 从EEPROM中读取零点的校准值for(int i = 0; i < 3; i++) {gyroOffset[i] = EEPROM.read(2 * i + 1) << 8;gyroOffset[i] |= EEPROM.read(2 * i);accOffset[i] = EEPROM.read(7 + 2 * i) << 8;accOffset[i] |= EEPROM.read(6 + 2 * i);}}// 用于处理超声波传感器产生的中断,尽量减少在中断函数中处理逻辑void blink(){if(ultraT1 == 0) ultraT1 = micros();else ultraT2 = micros();}int loopIndex = 0;void loop(){if(reportType == 103) {/* 校准模式,在静止的平地上测量N次读数,记录零点误差校准隔一段时间做一次即可,例如季节变化,地点变化等 */gyroOffset[0] = gyroOffset[1] = gyroOffset[2] = 0;accOffset[0] = accOffset[1] = accOffset[2] = 0;int repeatTime = 100;for(int i = 0; i < repeatTime; i++) {// 单次读数大约6ms,校准读数总耗时在0.3秒左右readGyroSensor();readAccSensor();for(int j = 0; j < 3; j++) {gyroOffset[j] += gyroXYZ[j];accOffset[j] += accXYZ[j];}delay(10);}// 读数完毕写入EEPROM,每个字节需要3.3ms写入for(int i = 0; i < 3; i++) {gyroOffset[i] /= repeatTime;EEPROM.write(2 * i, (byte) (gyroOffset[i] & 0xFF));EEPROM.write(2 * i + 1, (byte) ((gyroOffset[i] >> <img src="/wp-includes/images/smilies/icon_cool.gif" alt="8)" class="wp-smiley"> & 0xFF));accOffset[i] /= repeatTime;EEPROM.write(6 + 2 * i, (byte) (accOffset[i] & 0xFF));EEPROM.write(7 + 2 * i, (byte) (accOffset[i] >> 8 & 0xFF));}// 校准完成,恢复成普通模式reportType = 0;}/** 采样率为350Hz,所以每个周期2.857ms。
每个周期中都需要读一次陀螺仪和加速度计, * 用时大约0.7ms;然后剩余的时间分别用来做不同的事情,例如控制电机,计算角度等。
* 然后进行角度姿态的融合,大约需要0.7ms。
这部分放在控制电机的后面,因为0.9ms 开始* 就需要控制电机,时间不够用,放在后面则刚好够用。
* 电机的控制周期是20ms,也就是每7次循环修改一次电机功率*/long t0 = micros(); //记录进入loop的时间if(loopIndex == 1) {for(int i = 0; i < 4; i++) digitalWrite(motorPins[i], HIGH);} else {// digitalWrite需要20微秒,为了读数时间均匀,其他情况统一做相应延时delayMicroseconds(20);}// 读取陀螺仪和加速度计的读数,前1.5秒等待传感器稳定if(t0 > stableTime) {readGyroSensor();readAccSensor();}if(connectToPc && loopIndex == ctrlPower % 7) reportT[0] = (int) (micros() - t0);double newSpeedX, newSpeedY, newAngleX, newAngleY, power, powerX, powerY, adjust;int loopCountLimit;switch(loopIndex) {case 0:// 这时候角度数值已就绪:angleX, angleY, angleZ, speedX, speedY// 但是需要修正45度安装的换算newSpeedX = (speedX + speedY) * 0.707;newSpeedY = (speedY - speedX) * 0.707;// 假设四轴翻转不会超过90度newAngleX = asin((sin(angleX) + sin(angleY)) * 0.707);newAngleY = asin((sin(angleY) - sin(angleX)) * 0.707);// 计算平衡参数adjust = 1;if(throttle > 350) adjust = 500.0 / throttle;balanceX = 1 - (newSpeedX * P_Control + newAngleX * I_Control) * adjust;balanceX = min(max(balanceX, 0), 2);balanceY = 1 - (newSpeedY * P_Control + newAngleY * I_Control) * adjust;balanceY = min(max(balanceY, 0), 2);// 计算油门值if(ctrlPower <= directCtrlRange) {if(throttle > ctrlPower * 5) {// 缓冲下降20ms下降0.8,1秒钟下降40throttle -= fastStep;} else {// 上升之前可以不考虑缓冲问题throttle = ctrlPower * 5;}} else {// 目标离地高度为ctrlPower - directCtrlRange + 10;targetDistance = ctrlPower - directCtrlRange + 10;if(stablePower == 0 && distance > preDistance + 2) {// 100ms内爬升了2cm以上,设置2主要是为了避免读数跳动误差stablePower = throttle;}if(stablePower == 0) {// 处于起飞状态throttle += fastStep;} else {// 可以认为已经离地double newThrottle = stablePower + (targetDistance - distance) * 0.11- (distance - preDistance) * 0.13;if(newThrottle > throttle + fastStep) throttle += fastStep;else if(newThrottle < throttle - fastStep) throttle -= fastStep;else throttle = newThrottle;}// 油门保护,不超过某个最大值(避免飞太快超出控制范围)if(throttle > maxThrottle) throttle = maxThrottle;// directCtrlRange优先控制权if(throttle < directCtrlRange * 5) throttle = directCtrlRange * 5;}// 计算电机功率power = throttle;powerX = power * balanceXY;powerY = power * 2 - powerX;motorPowers[0] = (int) (powerX * balanceX);motorPowers[1] = (int) (powerX * 2) - motorPowers[0];motorPowers[2] = (int) (powerY * balanceY);motorPowers[3] = (int) (powerY * 2) - motorPowers[2];motorCtrl[0] = 9999;for(int i = 0; i < 4; i++) {motorPowers[i] += 5 * i;if(motorPowers[i] > maxPWM_Delay) motorPowers[i] = maxPWM_Delay; if(motorPowers[i] < motorCtrl[0]) {motorCtrl[0] = motorPowers[i];motorCtrl[1] = i;}}// 排序, 设置motorCtrlfor(int i = 1; i < 4; i++) {int pre = motorCtrl[i * 2 - 2];int preIdx = motorCtrl[i * 2 - 1];motorCtrl[i * 2] = 9999;for(int j = 0; j < 4; j++) {if(motorPowers[j] > pre || (motorPowers[j] == pre && j > preIdx)) {if(motorPowers[j] < motorCtrl[i * 2]) {motorCtrl[i * 2] = motorPowers[j];motorCtrl[i * 2 + 1] = j;}}}}// 计算delayMsfor(int i = 0; i < 3; i++) {motorCtrl[6 - i * 2] -= (motorCtrl[4 - i * 2] + 5);}break;case 1:// 控制电机转速,首先运行到0.9msdelayMicroseconds(minPWM + t0 - micros());for(int i = 0; i < 4; i++) {// 根据间隔时间设置低电平if(motorCtrl[i * 2] > 0) delayMicroseconds(motorCtrl[i * 2]);digitalWrite(motorPins[motorCtrl[i * 2 + 1]], LOW);}break;case 2:// 电子指南针读数,这个不需要太精确,所以20ms读一次if(t0 > stableTime) {readCompSensor();}// 从串口获取遥控信息loopCountLimit = 18;while(Serial.available() && loopCountLimit--) {pushData(Serial.read());}break;case 3:// 发送各种报告if(connectToPc) {if(reportType == 1) writeBuffer(gyroOffset, 3);if(reportType == 2) writeBuffer(accOffset, 3);if(reportType == 3) writeBuffer(compXYZ, 3);//if(reportType == 1) writeNums(motorCtrl[0],motorCtrl[1],motorCtrl[2]);//if(reportType == 2) writeNums(motorCtrl[3],motorCtrl[4],motorCtrl[5]);//if(reportType == 3) writeNums(motorCtrl[6],motorPowers[2],motorPowers[3]);if(reportType == 4) writeBuffer(reportArr, 3);if(reportType == 5) writeNums((int)distance, (int)(speedX * 1000), motorPowers[0]);//if(reportType == 5) writeNums(reportArr[1], motorPowers[2], motorPowers[3]);if(reportType == 6) writeBuffer(reportT, 3);}break;case 4:// 测量离地距离,音速340m/s = 34cm/ms = 0.034cm/μs,测量的是来回距离,所以需要除以2if(ultraT1 > 0 && ultraT2 > ultraT1) {double newDistance = (ultraT2 - ultraT1) * 0.017;if(newDistance < 250) {preDistance = distance;if(distance > 100 && newDistance < 10) {// 高度突然变小的情况(从100以上变到小于10,可以认为是超出量程)distance = maxDistance;} else {distance = newDistance;}}}// 考虑到回音等问题,把测量的时间间隔增加到100ms,相当于17米的反射ultraCount++;if(ultraCount >= 5) {ultraT1 = 0;ultraT2 = 0;// 因为每次执行到这个循环是20ms,所以计数器增长到5时进行一次测量ultraCount = 0;// 用10μs的高电平发出触发信号digitalWrite(trigPin, 1);delayMicroseconds(10);digitalWrite(trigPin, 0);}break;default:// 其他扩展功能break;}if(connectToPc && loopIndex == ctrlPower % 7) reportT[1] = (int) (micros() - t0);// 计算角度angleX, angleY, speedX, speedY, accAngleX, accAngleYif(t0 > stableTime) {// 量程为250时,测量值单位是8.75 mdps/digi;// 正确:180/3.1415926*1000/8.75 = 6548.09// 错误:3754.94 = (65536/1000)*(180/3.1415926)double readSpeedX = (gyroXYZ[0] - gyroOffset[0]) / 6548.09; //单位:弧度/秒speedX = balanceSpeed * speedX + (1 - balanceSpeed) * readSpeedX;accAngleX = accAngleX * balanceAcc + atan2(accXYZ[0] - accOffset[0], accXYZ[2]) * (1 - b alanceAcc);angleX = (angleX + readSpeedX * 0.002857) * balanceGyro + accAngleX * (1 - balanceGyro);testAngleX = testAngleX + readSpeedX * 0.002857;reportArr[0] = (int) (angleX * 1000);reportArr[1] = gyroXYZ[0] ;reportArr[2] = (int) (testAngleX * 1000);double readSpeedY = (gyroXYZ[1] - gyroOffset[1]) / 6548.09; //单位:弧度/秒speedY = balanceSpeed * speedY + (1 - balanceSpeed) * readSpeedY;accAngleY = accAngleY * balanceAcc + atan2(accXYZ[1] - accOffset[1], accXYZ[2]) * (1 - b alanceAcc);angleY = (angleY + readSpeedY * 0.002857) * balanceGyro + accAngleY * (1 - balanceGyro);}if(loopIndex == ctrlPower % 7) reportT[2] = (int) (micros() - t0);// 更新loopIndexloopIndex++;if(loopIndex >= 7) loopIndex = 0;// 截止到2.857mst0 = micros() % 2857;delayMicroseconds(2817 - t0);}/* get data from bluetooth devices */void pushData(byte data){//验证是否数据的开始if (bufferIndex < 1 && data != (byte)0xFF) {bufferIndex = 0;} else {buffer[bufferIndex] = data;if (bufferIndex == 5) {setParams();}bufferIndex = (bufferIndex + 1) % 6;}}void setParams(){// 因为超声波中断可能导致数据丢失,所以需要额外的一个字节用于校验 if(buffer[1] ^ buffer[2] ^ buffer[3] ^ buffer[4] == buffer[5]) {ctrlPower = buffer[1];reportType = buffer[2];//P_Control = (20.0 + buffer[3] / 4.0) / 200.0;//I_Control = (20.0 + buffer[4] / 4.0) / 200.0;P_Control = buffer[3] / 100.0;I_Control = buffer[4] / 100.0;if(reportType == 100 && !connectToPc) {Serial.end();connectToPc = true;Serial.begin(115200);}if(reportType == 101) {// 设置为上拉绳调试模式directCtrlRange = maxThrottle / 5;}if(reportType == 102) {// 设置为下拉绳调试模式directCtrlRange = 40;}//if(reportType == 103) {} //校准模式}}/*****************************************************************************/void writeBuffer(int arr[], int len) {byte buff[len * 2 + 2];buff[0] = 0xFF;buff[1] = 0xFF;for(int i = 0; i < len; i++) {buff[i * 2 + 2] = (byte) (arr[i] >> 8 & 0xFF);buff[i * 2 + 3] = (byte) (arr[i] & 0xFF);}Serial.write(buff, len * 2 + 2);}void writeNums(int n1, int n2, int n3) {byte buff[8];buff[0] = 0xFF;buff[1] = 0xFF;buff[2] = (byte) (n1 >> 8 & 0xFF);buff[3] = (byte) (n1 & 0xFF);buff[4] = (byte) (n2 >> 8 & 0xFF);buff[5] = (byte) (n2 & 0xFF);buff[6] = (byte) (n3 >> 8 & 0xFF);buff[7] = (byte) (n3 & 0xFF);Serial.write(buff, 8);}/*****************************************************************************/void writeRegister(byte deviceAddress, byte address, byte val) {Wire.beginTransmission(deviceAddress); // start transmission to deviceWire.send(address); // send register addressWire.send(val); // send value to writeWire.endTransmission(); // end transmission}byte readRegister(int deviceAddress, byte address){Wire.beginTransmission(deviceAddress);Wire.send(address);Wire.endTransmission();Wire.requestFrom(deviceAddress, 1);while(!Wire.available()) {}return Wire.receive();}/*****************************************************************************/int setupGyroSensor(int scale){byte GYRO_CTRL_REG1 = 0x20;byte GYRO_CTRL_REG2 = 0x21;byte GYRO_CTRL_REG3 = 0x22;byte GYRO_CTRL_REG4 = 0x23;byte GYRO_CTRL_REG5 = 0x24;writeRegister(GYRO_ADDR, GYRO_CTRL_REG1, 0x0f);writeRegister(GYRO_ADDR, GYRO_CTRL_REG2, 0x00);writeRegister(GYRO_ADDR, GYRO_CTRL_REG3, 0x08);if(scale == 250){writeRegister(GYRO_ADDR, GYRO_CTRL_REG4, 0x00);}else if(scale == 500){writeRegister(GYRO_ADDR, GYRO_CTRL_REG4, 0x10);}else{writeRegister(GYRO_ADDR, GYRO_CTRL_REG4, 0x30);}writeRegister(GYRO_ADDR, GYRO_CTRL_REG5, 0x00);}void readGyroSensor(){Wire.beginTransmission(GYRO_ADDR);Wire.send(GYRO_READ_START);Wire.endTransmission();Wire.requestFrom(GYRO_ADDR, 6);for(int i = 0; i < 3; i++) {while(!Wire.available()) {}gyroXYZ[i] = Wire.receive(); //Low bytewhile(!Wire.available()) {}gyroXYZ[i] |= (Wire.receive() << 8); //High byte}}/*****************************************************************************/void readAccSensor(){Wire.beginTransmission(ACC_ADDR);Wire.send(ACC_READ_START);Wire.endTransmission();Wire.requestFrom(ACC_ADDR, 6);for(int i = 0; i < 3; i++) {while(!Wire.available()) {}accXYZ[i] = Wire.receive(); //Low bytewhile(!Wire.available()) {}accXYZ[i] |= (Wire.receive() << 8); //High byte}}int setupAccSensor(){writeRegister(ACC_ADDR, 0x2D, 0x28); //Power control}/*****************************************************************************/void readCompSensor(){Wire.beginTransmission(COMP_ADDR);Wire.send(COMP_READ_START);Wire.endTransmission();Wire.requestFrom(COMP_ADDR, 6);for(int i = 0; i < 3; i++) {while(!Wire.available()) {}compXYZ[i] = Wire.receive(); //High bytewhile(!Wire.available()) {}compXYZ[i] = Wire.receive() | (compXYZ[i] << 8); //Low byte}// Switch xzy to xyzint temp = compXYZ[1];compXYZ[1] = compXYZ[2];compXYZ[2] = temp;}int setupCompSensor() {writeRegister(COMP_ADDR, 0x00, 0x70); //Mod settingwriteRegister(COMP_ADDR, 0x02, 0x00); //Mod setting}/*****************************************************************************/。