刷卡机的ec1
网上关于刷卡机的ec1的刷卡知识比较多,也有关于刷卡机的ec1的问题,今天第一pos网(www.pos-diy.com)为大家整理刷卡常见知识,未来的我们终成一代卡神。
本文目录一览:
1、刷卡机的ec1
刷卡机的ec1
1966 年 Bohm和Jacpini用数学方法证明了只用三个结构和任意数量的布尔型标志就能表示任何算法。这三种结构是
1 顺序;
2 选择(例如,if-else,if-else if,switch);
3 循环(例如,whuile,for,do)。
对于选择结构,由于if…else if 还是不够简洁,switch 就应运而生了,他跟if else if 互为补充关系。switch 提供了点的多路选择。
伪代码:
switch(expression) // expression表达式的值需是整型{ case 整形常量1: 代码块1; break; case 整形常量2: 代码块2; break; default: 代码块3; break;// 此处的break 可以省略}
switch与if…else if的比较实例:
#include <stdio.h>bool IsLeapYear(int y)// 判断是否为闰年{return((y%4==0&&y0!=0)||y@0==0);}int DaysOfMonth(int month,int year)// 判断某月天数的函数{switch(month){case 1:case 3:case 5:case 7:case 8:case 10:case 12:return 31;case 4:case 6:case 9:case 11:return 30;case 2:if(IsLeapYear(year)) return 29; else return 28; default: //return 31; //也可以把上面31天的部分放到这里 break;}return 0;}int DaysOfMonth2(int month,int year)// 判断某月天数的函数{ if(month==2) { if(IsLeapYear(year)) return 29; else return 28; } else if(month==4 || month == 6 || month == 9 || month == 11) return 30; else return 31;}int main(){ int i; for(i=0;i<12;i++) printf("%d ",DaysOfMonth(i+1,2021)); printf("\"); for(i=0;i<12;i++) printf("%d ",DaysOfMonth2(i+1,2022)); getchar(); return 0;}1 整数类型表达式和整数类形常量
expression表达式的值需是整数类型,其值被各个case语句枚举(通常expression本身就是一个枚举变量),也就是每个case标签必须是整数类型常量表达式(constant-expression),指在编译期间进行求值的表达式, 它不能是任何变量。
这里的整数类型包括:short, int ,long, char, enum, bool。
2 case只是一个进入点,非整个swich的的退出点case只负责入口(或进入点)的作用,也就是直落(fall-through)的概念。如要跳出整个which,需要额外的break语句。
在switch语句中,当找到与swith表达式相等的case时,执行case下的语句。case下的所有语句都执行完成后,如果一直没有break,那么程序将会执行到下一个case,而不管它的值是否与switch表达式相等,即多个case之间不具有天然的互斥性。要想使程序执行完一个case后的语句,而不进入下一个case,必须使用break语句,使程序退出switch结构。这样,后面的case也就不执行了。
C语言中switch语句比较特殊,一个分支的结束是依赖break完成的。case只决定—序到哪里执行,而不决定到哪里结束。结束位置由break来决定,没有break就一直执行到switch完整结构结束。
这种“入口”机制自然有其理由所在,如果某几个case语句后都是同样的语句,就没必要重复写,由几个case语句提供入口,同样的语句写一次就行了,如判断某年小月(30天)的判定:
case 4:case 6:case 9:case 11: days = 30;break;
或者:
switch( ch ){case '\': lines += l; /* FALL THRU */case ' ':case '\ ': words += l; /* FALL THRU */default: chars += l;}3 直接跳转
通常,由switch语句进入某个case,是直接跳转(jmp),并不需要逐个比较,逐个进入。其后面是由编译器维护了一份跳转表。之所以能这样操作,也与上述的第1点有关,expression表达式的值枚举到了各个case中,其值都是以整数类型常量存在的,其跳转的间隔在编译期就是已经确定的。这也是其执行效率要高于同等实现的if语句的原因。
直接跳转的实现的汇编(通过jmp汇编指令):
9: switch(month){004010C8 mov eax,dword ptr [ebp+8]004010CB mov dword ptr [ebp-4],eax004010CE mov ecx,dword ptr [ebp-4]004010D1 sub ecx,1004010D4 mov dword ptr [ebp-4],ecx004010D7 cmp dword ptr [ebp-4],0Bh004010DB ja $L538+23h (00401118)004010DD mov edx,dword ptr [ebp-4]004010E0 jmp dword ptr [edx*4+40112Bh]10: case 1:11: case 3:12: case 5:13: case 7:14: case 8:15: case 10:16: case 12:return 31;004010E7 mov eax,1Fh004010EC jmp $L538+25h (0040111a)17: case 4:18: case 6:19: case 9:20: case 11:return 30;004010EE mov eax,1Eh004010F3 jmp $L538+25h (0040111a)21: case 2:if(IsLeapYear(year))004010F5 mov eax,dword ptr [ebp+0Ch]004010F8 push eax004010F9 call @ILT+5(IsLeapYear) (0040100a)004010FE add esp,400401101 and eax,0FFh00401106 test eax,eax00401108 je $L538+1Ch (00401111)22: return 29;0040110A mov eax,1Dh0040110F jmp $L538+25h (0040111a)23: else24: return 28;00401111 mov eax,1Ch00401116 jmp $L538+25h (0040111a)25: default:26: //return 31; //也可以把上面31天的部分放到这里27: break;28: }29: return 0;00401118 xor eax,eax30: }
switch case结构的优点是对分支条件只进行一次判断就可以决定代码的分支流程。但是缺点就是不能进行复杂的条件判断。
4 switch语句内声明局部变量的问题因为case 语句只是标签,它们共属于一个swtich语句块。其声明的变量所在的case部分需要用大括号{}来明确其作用域。
#include<stdio.h>void swap(int *a,int *b);int main(){ char casen ; scanf("%c",&casen); switch(casen) { case 'a' : //shutdown(); break; case 'b' : //leapyear(); break; case 'c' :// 参数的引用传递 { // 未使用大括号有些编译器会报错 int a, b; a = 10; b = 20; swap(&a,&b); printf("%d %d\",a,b); break; } case 'd' : //isprime(); break; case 'e' : //fac(); break; } return 0;}void swap(int *a,int *b){ int t = *a; *a = *b; *b = t;}
-End-
以上就是关于刷卡机的ec1的知识,后面我们会继续为大家整理关于刷卡机的ec1的知识,希望能够帮助到大家!

转载请带上网址:http://www.pos-diy.com/shuakatwo/169797.html