在一个多系统登录界面,登录子系统,子系统一直返回多系统登录页面怎么怎么解决

用360急速浏览器
在一个多系统登录界面,登录子系统,子系统一直返回多系统登录页面怎么怎么解决,

2个回答

你这个SSO有问题吧,子系统返回,可能是由于SSO失败了,导致你子系统一直认为你没有登陆,从而跳转到登录页呗,这个只是一个分析方向,具体原因自行分析吧。

为啥不使用单点登录.

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Bank Account Management System 银行账户管理子系统
1.项目描述:项目描述 这是一个基于C/S结构的银行账户在线管理系统,用户可以通过ATM终端界面来操作自己的银行账户. 2.模块JAVAEE. 3.项目详细内容介绍 要求1:封装一个Account类 - 业务数据 写一个账户类(Account),属性并且完全封装(注意:要辨别每个属性的set/get方法是否需要公开):   id:账户号码 长整数(Long)   password:账户密码 字符串类型(String)   name:真实姓名 字符串类型(String)   personId:身份证号码 字符串类型(String)   email:客户的电子邮箱 字符串类型(String)   balance:账户余额 双精度(double) 方法:   deposit: 存款方法,参数类型:double, 返回类型:Account   withdraw:取款方法,参数类型:double, 返回类型:Account 构造方法:   有参和无参,有参构造方法用于设置必要的属性. 要求1:完成以下两种账户类型的编码。   银行的客户分为两大类:储蓄账户(SavingAccount)和信用账户(CreditAccount),两种的账户类型的区别在于:   储蓄账户不允许透支,而信用账户可以透支,并在用户在满足银行条件的情况下允许用户调整自己的透支额度.   注意:   1、CreditAccount需要多一个属性 ceiling 透支额度;   2、CreditAccount需要覆盖(重写)Account中的取款方式withdraw()。 要求2:完成Bank类的编码。 属性: 1.当前所有的账户对象的信息,存放在数组中: Account[]. 2.当前账户数量index. 方法: 用户开户(register) 参数列表: Long 账号, String密码, String确认密码,String 姓名,String身份证号码,String邮箱,int 账户类型;        (Long id, String password, String repassword, String name, String personID, String email, int type) 返回类型:Account 项目需求规定账户类型:0 – 储蓄账户 1 – 信用账户 2 – 可贷款储蓄账户 3– 可贷款信用账户 用户登录(login) 参数列表: Long 账号, String密码;        (Long id, String password) 返回类型:Account 用户存款(deposit) 参数列表: Long 账号, double存款金额;        (Long id, double money) 返回类型:Account 用户取款(withdraw) 参数列表: Long 账号,String 密码,double取款金额;        (Long id, String password, double money) 返回类型:Account 设置透支额度(updateCeiling) 参数列表: Long 账号, String 密码,double透支额度金额;        (Long id, String password, double money) 返回类型:Account  提示:这个方法需要验证账户是否是信用账户 转账功能(transfer)   参数:from转出账户,passwordFrom 转出账号的密码,to转入账户,money转账的金额   (Long from, String passwordFrom, Long to, double money) 返回值:boolean 要求3:另外,请为Bank类添加几个统计方法 1.统计银行所有账户余额总数 2.统计所有信用账户透支额度总数 要求4:编写测试类 写个测试类,测试以上代码能否正常工作。 要求5:覆盖toString方法 查看对象的内容。
Linux系统下使用指纹识别获取sudo权限,使用PAM验证,不弹出自己编写的界面
使用指纹代替密码在Linux系统下获取sudo授权,参考开源fingerprintGUI 编写了PAM模块,该文件中包含pam_sm_authenticate,pam_sm_setcred函数,在pam_sm_authenticate中fork()出一个子进程,在子进程中使用execl运行指纹识别的QT GUI,pam_sm_setcred函数直接返回PAM_SUCCESS,之后修改了sudo的配置文件添加了第一句,后面是系统默认的 auth sufficient libFingerprintPAM.so auth required pam_env.so readenv=1 user_readenv=0 auth required pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0 在root用户下使用命令export DISPLAY=:0.0;xhost +$HOSTNAME,执行sudo命令后不会跳出QT界面,但是打印信息显示QT 界面已经运行了,若是一个空的界面则可以显示,而且即使是识别成功也还是需要输密码,QT新手Linux新手搞得好艰难,跪求大神指点。
求这个多程序实现系统菜单功能整合程序的错误及改正
1.温度转换表 ``` #include <stdio.h> main( ) { float c,f,c1,c2,d; printf("请输入起始温度:") ; scanf("%f",&c1); printf("请输入结束温度:") ; scanf("%f",&c2); printf("请输入间隔温度:") ; scanf("%f",&d); printf(" 温度对照表\n"); printf("------------------------\n"); printf("| 摄氏温度 | 华氏温度 |\n"); for(c=c1;c<=c2;c=c+d) { f=9.0/5*c+32; printf("------------------------\n"); printf("| %5.1f | %5.1f |\n",c,f); } printf("------------------------\n"); } ``` 2.加法练习程序 ``` #include <stdio.h> #include <stdlib.h> #include <time.h> main( ) { int a,b,c; int i,score=0; srand((unsigned)time(NULL)); for(i=0;i<10;i++) { a=rand()%20; b=rand()%20; printf("第%2d题:%d+%d=?\n",i+1,a,b); printf("请输入答案:"); scanf("%d",&c); if(c==a+b) { printf("正确!"); printf("%d+%d=%d\n",a,b,a+b); score=score+10; } else { printf("错误!"); printf("%d+%d=%d\n",a,b,a+b); } } printf("成绩:%d\n",score); } ``` 3.石头剪刀布游戏 ``` #include <stdio.h> #include <stdlib.h> #include <time.h> int rps(int computer,int human) { char *c_string,*h_string; int c_win=1,h_win=-1,dogfall=0; if(computer==0) c_string="石头"; else if(computer==1) c_string="剪刀"; else if(computer==2) c_string="布"; if(human==0) h_string="石头"; else if(human==1) h_string="剪刀"; else if(human==2) h_string="布"; printf("计算机:%s,用户:%s\n",c_string,h_string); switch(computer-human) { case 0: printf("平局!\n"); return(dogfall); case -1: printf("计算机赢!\n"); return(c_win); case -2: printf("用户赢!\n"); return(h_win); case 1: printf("用户赢!\n"); return(h_win); case 2: printf("计算机赢!\n"); return(c_win); } } main() { int computer,human,i=1; int c_win_n=0,h_win_n=0; int flag; srand((unsigned)time(NULL)); printf("石头、剪刀、布游戏\n"); while(1) { printf("\n计算机 %d :%d 用户\n",c_win_n,h_win_n); printf("第%d局:\n",i); computer=rand()%3; printf("请输入(石头-0,剪刀--1,布--2):"); scanf("%d",&human); flag=rps(computer,human); if(flag==1) c_win_n++; if(flag==-1) h_win_n++; if(c_win_n==3) { printf("\n计算机 %d :%d 用户\n",c_win_n,h_win_n); printf("计算机获胜!\n"); break; } if(h_win_n==3) { printf("\n计算机 %d :%d 用户\n",c_win_n,h_win_n); printf("用户获胜!\n"); break; } i++; } } ``` 4.菱形图案 ``` #include <stdio.h> main() { int i,j; for(i=0;i<5;i++) { for(j=0;j<35-i;j++) printf(" "); for(j=0;j<2*i+1;j++) printf("*"); printf("\n"); } for(i=0;i<4;i++) { for(j=0;j<32+i;j++) printf(" "); for(j=0;j<7-2*i;j++) printf("*"); printf("\n"); } } ``` 5.sin图形及数字显示 ``` #include <stdio.h> #include <math.h> #define PI 3.1415926 #define M 8 #define N 14 void printchar(int a[][N]) { int i,j,k; float x,y; for(x=0;x<=360;x=x+15) { y=40+10*sin(x*PI/180); for(k=0;k<y;k++) printf(" "); printf("*"); printf("\n"); } for(i=0;i<M;i++) { for(j=0;j<N;j++) if(a[i][j]==1) printf("#"); else printf(" "); printf("\n"); } } main() { int a[M][N]={ 0,0,0,1,0,0,0,0,0,1,1,1,0,0, 0,0,1,1,0,0,0,0,1,0,0,0,1,0, 0,0,0,1,0,0,0,0,0,0,0,0,1,0, 0,0,0,1,0,0,0,0,0,0,0,1,0,0, 0,0,0,1,0,0,0,0,0,0,1,0,0,0, 0,0,0,1,0,0,0,0,0,1,0,0,0,0, 0,0,0,1,0,0,0,0,1,0,0,0,0,0, 0,1,1,1,1,1,0,1,1,1,1,1,1,0 }; printchar(a); } ``` 6.登录界面 ``` #include <stdio.h> #include <string.h> void wellcome() { printf("\n欢迎使用本系统!\n"); printf("请按任意键...\n"); getch(); } void error() { printf("\n账号或密码错误!\n"); printf("请按任意键...\n"); getch(); } void bye() { printf("您无权使用本系统!\n"); printf("请按任意键...\n"); getch(); } void mygets(char s[]) { char ch,*p=s; ch=getch(); while(ch!='\r') { printf("*"); *p=ch; p++; ch=getch(); } *p='\0'; } int login() { char user[10],pwd[10]; int i,f; for(i=1;i<=3;i++) { printf("账户:"); gets(user); printf("密码:"); mygets(pwd); if(!strcmp(user,"admin") && !strcmp(pwd,"123456")) { f=1; break; } else error(); if(i==3) f=0; } return(f); } main() { if(login()) wellcome(); else bye(); } ``` 7.菜单程序 ``` #include <stdio.h> void wait() { printf("\n请按任意键...\n"); getch(); } void wellcome() { printf("\n欢迎!\n"); wait(); } void bye() { printf("\n再见!\n"); wait(); } void f11() { printf("\n文件功能1\n"); wait(); } void f12() { printf("\n文件功能2\n"); wait(); } void f13() { printf("\n文件功能3\n"); wait(); } void f14() { printf("\n文件功能4\n"); wait(); } void f21() { printf("\n编辑功能1\n"); wait(); } void f22() { printf("\n编辑功能2\n"); wait(); } void f23() { printf("\n编辑功能3\n"); wait(); } void f24() { printf("\n编辑功能4\n"); wait(); } void f31() { printf("\n查看功能1\n"); wait(); } void f32() { printf("\n查看功能2\n"); wait(); } void f33() { printf("\n查看功能3\n"); wait(); } void f34() { printf("\n查看功能4\n"); wait(); } void f41() { printf("\n插入功能1\n"); wait(); } void f42() { printf("\n插入功能2\n"); wait(); } void f43() { printf("\n插入功能3\n"); wait(); } void f44() { printf("\n插入功能4\n"); wait(); } void menu1() { char choice; int f=1; do { printf("\n"); printf("---文件子菜单---\n"); printf(" 1...文件功能1\n"); printf(" 2...文件功能2\n"); printf(" 3...文件功能3\n"); printf(" 4...文件功能4\n"); printf(" 0...返回\n"); printf("请选择[1/2/3/4/0]:"); choice=getch(); switch(choice) { case '1':f11(); break; case '2':f12(); break; case '3':f13(); break; case '4':f14(); break; case '0':f=0; break; } } while(f==1); } void menu2() { char choice; int f=1; do { printf("\n"); printf("---编辑子菜单---\n"); printf(" 1...编辑功能1\n"); printf(" 2...编辑功能2\n"); printf(" 3...编辑功能3\n"); printf(" 4...编辑功能4\n"); printf(" 0...返回\n"); printf("请选择[1/2/3/4/0]:"); choice=getch(); switch(choice) { case '1':f21(); break; case '2':f22(); break; case '3':f23(); break; case '4':f24(); break; case '0':f=0; break; } } while(f==1); } void menu3() { char choice; int f=1; do { printf("\n"); printf("---查看子菜单---\n"); printf(" 1...查看功能1\n"); printf(" 2...查看功能2\n"); printf(" 3...查看功能3\n"); printf(" 4...查看功能4\n"); printf(" 0...返回\n"); printf("请选择[1/2/3/4/0]:"); choice=getch(); switch(choice) { case '1':f31(); break; case '2':f32(); break; case '3':f33(); break; case '4':f34(); break; case '0':f=0; break; } } while(f==1); } void menu4() { char choice; int f=1; do { printf("\n"); printf("---插入子菜单---\n"); printf(" 1...插入功能1\n"); printf(" 2...插入功能2\n"); printf(" 3...插入功能3\n"); printf(" 4...插入功能4\n"); printf(" 0...返回\n"); printf("请选择[1/2/3/4/0]:"); choice=getch(); switch(choice) { case '1':f41(); break; case '2':f42(); break; case '3':f43(); break; case '4':f44(); break; case '0':f=0; break; } } while(f==1); } void menu() { char choice; int f=1; do { printf("\n"); printf("------菜单------\n"); printf(" 1.......文件\n"); printf(" 2.......编辑\n"); printf(" 3.......查看\n"); printf(" 4.......插入\n"); printf(" 0.......退出\n"); printf("请选择[1/2/3/4/0]:"); choice=getch(); switch(choice) { case '1':menu1(); break; case '2':menu2(); break; case '3':menu3(); break; case '4':menu4(); break; case '0':f=0; break; } } while(f==1); } main() { wellcome(); menu(); bye(); } ``` 将以上程序整合为一个综合程序 ``` #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <time.h> #endif #define PI 3.1415926 void wait() { printf("\n请按任意键...\n"); getch(); } void wellcome() { printf("\n欢迎使用本系统!\n"); wait(); } void bye1() { printf("\n您无权使用本系统!\n"); wait(); } void bye2() { printf("\n再见!\n"); wait(); } void error() { printf("\n账号或密码错误!\n"); wait(); } void f1() { float c,f,c1,c2,d; printf("请输入起始温度:") ; scanf("%f",&c1); printf("请输入结束温度:") ; scanf("%f",&c2); printf("请输入间隔温度:") ; scanf("%f",&d); printf(" 温度对照表\n"); printf("------------------------\n"); printf("| 摄氏温度 | 华氏温度 |\n"); for(c=c1;c<=c2;c=c+d) { f=9.0/5*c+32; printf("------------------------\n"); printf("| %5.1f | %5.1f |\n",c,f); } printf("------------------------\n"); wait(); } void f2() { int a,b,c; int i,score=0; srand((unsigned)time(NULL)); for(i=0;i<10;i++) { a=rand()%20; b=rand()%20; printf("第%2d题:%d+%d=?\n",i+1,a,b); printf("请输入答案:"); scanf("%d",&c); if(c==a+b) { printf("正确!"); printf("%d+%d=%d\n",a,b,a+b); score=score+10; } else { printf("错误!"); printf("%d+%d=%d\n",a,b,a+b); } } printf("成绩:%d\n",score); wait(); } void f3() { int rps(int computer,int human) { char *c_string,*h_string; int c_win=1,h_win=-1,dogfall=0; if(computer==0) c_string="石头"; else if(computer==1) c_string="剪刀"; else if(computer==2) c_string="布"; if(human==0) h_string="石头"; else if(human==1) h_string="剪刀"; else if(human==2) h_string="布"; printf("计算机:%s,用户:%s\n",c_string,h_string); switch(computer-human) { case 0: printf("平局!\n"); return(dogfall); case -1: printf("计算机赢!\n"); return(c_win); case -2: printf("用户赢!\n"); return(h_win); case 1: printf("用户赢!\n"); return(h_win); case 2: printf("计算机赢!\n"); return(c_win); } } main() { int computer,human,i=1; int c_win_n=0,h_win_n=0; int flag; srand((unsigned)time(NULL)); printf("石头、剪刀、布游戏\n"); while(1) { printf("\n计算机 %d :%d 用户\n",c_win_n,h_win_n); printf("第%d局:\n",i); computer=rand()%3; printf("请输入(石头-0,剪刀--1,布--2):"); scanf("%d",&human); flag=rps(computer,human); if(flag==1) c_win_n++; if(flag==-1) h_win_n++; if(c_win_n==3) { printf("\n计算机 %d :%d 用户\n",c_win_n,h_win_n); printf("计算机获胜!\n"); break; } if(h_win_n==3) { printf("\n计算机 %d :%d 用户\n",c_win_n,h_win_n); printf("用户获胜!\n"); break; } i++; } } wait(); } void f4() { int i,j; for(i=0;i<5;i++) { for(j=0;j<35-i;j++) printf(" "); for(j=0;j<2*i+1;j++) printf("*"); printf("\n"); } for(i=0;i<4;i++) { for(j=0;j<32+i;j++) printf(" "); for(j=0;j<7-2*i;j++) printf("*"); printf("\n"); } wait(); } void f5() { #define PI 3.1415926 #define M 8 #define N 14 void printchar(int a[][N]) { int i,j,k; float x,y; for(x=0;x<=360;x=x+15) { y=40+10*sin(x*PI/180); for(k=0;k<y;k++) printf(" "); printf("*"); printf("\n"); } for(i=0;i<M;i++) { for(j=0;j<N;j++) if(a[i][j]==1) printf("#"); else printf(" "); printf("\n"); } } main() { int a[M][N]={ 0,0,0,1,0,0,0,0,0,1,1,1,0,0, 0,0,1,1,0,0,0,0,1,0,0,0,1,0, 0,0,0,1,0,0,0,0,0,0,0,0,1,0, 0,0,0,1,0,0,0,0,0,0,0,1,0,0, 0,0,0,1,0,0,0,0,0,0,1,0,0,0, 0,0,0,1,0,0,0,0,0,1,0,0,0,0, 0,0,0,1,0,0,0,0,1,0,0,0,0,0, 0,1,1,1,1,1,0,1,1,1,1,1,1,0 }; printchar(a); } wait(); } void menu() { char choice; int f=1; do { printf("\n"); printf("------菜单------\n"); printf(" 1....温度对照表\n"); printf(" 2....加法练习\n"); printf(" 3....石头、剪刀、步游戏\n"); printf(" 4....菱形图案\n"); printf(" 5....sin图形及数字符号显示\n"); printf(" 0....退出\n"); printf("请选择[1/2/3/4/5/6/7/0]:"); choice=getche(); switch(choice) { case '1':f1(); break; case '2':f2(); break; case '3':f3(); break; case '4':f4(); break; case '5':f5(); break; case '0':f=0; break; } } while(f==1); } void mygets(char s[]) { char ch,*p=s; ch=getch(); while(ch!='\r') { printf("*"); *p=ch; p++; ch=getch(); } *p='\0'; } int login() { char user[10],pwd[10]; int i,f; for(i=1;i<=3;i++) { printf("账户:"); gets(user); printf("密码:"); mygets(pwd); if(!strcmp(user,"admin") && !strcmp(pwd,"123456")) { f=1; break; } else error(); } if(i>3) f=0; return(f); } main() { wellcome(); if(login()) menu(); else bye1(); bye2(); } ``` 结果出错。。。。 ![图片说明](https://img-ask.csdn.net/upload/201912/15/1576385070_394335.png)
我想制作一个电子阅读器用stm32f103rct6,求住制作流程,网上有一个,不是很懂求指教
这是我从网上down的方法,有点不懂,关键就是编程还有MF RC522模块设计,求大虾指教,谢谢 1 硬件设计 1.1 硬件结构设计 RFID阅读器基于STM32单片机设计,芯片型号选择为STM32F103RBT6。该芯片为LQFP64封装, 内部有128 KB Flash和20 KB RAM,采用32位的ARM CortexTM-M3内核, 最高支持主频72 MHz,拥有2个SPI接口、 2个USART接口、1个USB接口、2个I2C接口和7个定时器。支持SWD和JTAG调试模式及IAP和ISP编程。 STM32单片机支持J-Link在线调试,J-Link调试有两种模式:JTAG调试和SWD调试。在线调试的便捷性,可以极大缩短程序的开发周期,提高开发效率。本系统采用的调试模式为SWD模式,只需2根SWDIO和SWCLK信号线,相比JTAG模式更加节约I/O口资源。阅读器的硬件结构框图如图1所示。 1.2 电源模块设计 系统可使用直流电源或电池供电,外部直流电源电压为8.4 V;电池电压为7.2 V,2 600 mA/h的锂电池。电源模块设计原理图如图2所示。 电源模块工作原理:当插座J1连接外部直流电源时,电流可经过D4给电池充电,直流电源经开关JP1连接IRF7404的G极,使IRF7404的D极与S极断开,则系统使用外部直流电源供电;当不使用直流电源、按下开关时,D4可将CD_POWER与电池断开,IRF7404的G极为低电平, IRF7404导通, 则系统使用电池供电。SYS_ POWER电压经过LM2576S-3.3转换为3.3 V为系统的各模块供电。 1.3 MF RC522模块设计 MF RC522是阅读器的读卡芯片,工作频率为13.56 MHz,工作模式支持ISO 14443A标准,芯片内部驱动器可以直接驱动阅读器的天线,无需其他电路。MF RC522具有3种接口模式:SPI接口模式、UART模式和I2C总线模式[3]。其中SPI模式的通信速度最快,可达到10 Mb/s。 MF RC522与主机接口模式有关的两个引脚为IIC和EA:当IIC引脚拉高时,表示当前模式为I2C模式,若IIC引脚为低电平时,再通过EA引脚电平来区分。EA为高电平时,表示SPI模式;为低电平时,则表示UART模式[4]。本设计中MF RC522与MCU采用SPI通信,与AT45DB161共享一个MCU的SPI2接口。 在系统中,MF RC522和天线电路一起作为单独模块使用,以便于更换与维修。天线模块与主板之间通过插座连接。 天线是阅读器中的一个重要组成部分。其作用是向外发射一组固定频率的电磁波,为射频卡提供能量、传递数据。 本系统中使用的是PCB天线,天线的设计关系到阅读器的读写距离,甚至关系到阅读器是否能正常与射频卡通信。RC522的天线设计须注意以下两点:(1)为了让射频卡能获取足够大的能量驱动本身的集成电路,设计天线时应该保证向外辐射足够大的电磁波; (2)为了提高读卡数据的准确性,需要考虑调谐电路的通频带,确保调制信号的准确性。 天线的匹配电路可分为:天线线圈、LC谐振电路和EMC滤波电路。RC522的天线匹配电路如图3所示,其中RQ为品质因素Q的匹配电阻,Lant为天线的电感。 1.4 显示模块设计 阅读器选用2.8英寸的TFT LCD触摸屏。在本系统中移植了GUI模块,使得人机交流界面操作更加便捷、友善。触摸屏为四线电阻屏,使用ADS7843作为A/D转换芯片。ADS7843是内置12位模/数转换、低导通电阻模拟开关的串行接口芯片,模/数转换输出范围0~4 095,工作电压2.7 V~5 V,参考电压VREF为1 V~VCC,转换电压的输入范围为0~VREF,最高转换速率为125 kHz[5]。ADS7843与MCU的接口为SPI1。 驱动层的程序基于硬件平台,主要是为中间服务层提供硬件驱动接口函数,完成底层的硬件操作。编写STM32的内部资源驱动程序时,调用了ST公司的固件库函数。 中间服务层主要是为上层应用程序提供库支持和服务接口。中间服务层的程序在驱动层程序上开发,并封装驱动程序的接口。如FATS文件系统是在AT45DB161的驱动程序上移植,为上层的应用程序提供文件创建、写入、读出、删除等服务;GUI模块是在LCD显示驱动程序上开发,将LCD驱动的画点画线函数封装成不同的控件,在控件上加载相应的数据结构,为界面应用程序提供控件的创建、销毁等操作。 应用层程序是面向用户,通过调用中间服务函数和库函数来完成相应的数据处理和控制功能等。 2.2 Free RTOS实时操作系统 Free RTOS是一个轻量级的操作系统,基本满足较小系统的需要。该操作系统完全免费且源码公开,同时具有可移植、可裁减、调度策略灵活的特点。 在本设计中Free RTOS的任务之间的关系如图5所示。 2.3 GUI模块 GUI模块是一个中间服务层程序,为显示应用程序提供控件显示服务。如控件的显示位置、尺寸、颜色以及控件响应的回调函数入口地址等。在本系统中GUI控件包含有文本框、编辑框、进度条、图像框、下拉列表、按钮等。每个控件都可以注册一个回调函数,这个函数对应了该控件的响应功能函数。 2.4 FAT文件系统 FatFs文件系统是中间服务层程序,建立在AT45DB161驱动程序上,文件系统提供了磁盘I/O接口和应用程序接口。磁盘I/O接口函数位于diskio.c文件,常用的接口函数有读磁盘disk_read()和写磁盘disk_write()。这两个函数分别调用AT45DB161驱动程序的读扇区和写扇区函数。在文件系统中一个扇区的大小为512 B,与AT45DB161的页大小一致。 为了使FatFs文件系统与Windows的文件系统兼容,要使用FAT32格式来格式化磁盘。f_open()函数与f_close()函数必须要成对出现,即打开一个文件操作完成后必须要关闭这个文件。在对文件进行操作前必须先调用f_mount(0,&Fs)函数对工作区进行注册,操作完成后也需要调用f_mount(0,NULL)函数对工作区进行注销。 2.5 MF RC522驱动程序流程 本系统中使用的射频卡为Mifare1 S50,也简称为M1卡,该卡有16个扇区,每个扇区有4个块,每个块可存储16 B的数据。MF RC522对M1卡进行读写控制,分别有寻卡、防碰撞、选卡、认证、读块和写块等过程。 MF RC522驱动程序流程如下: (1)寻卡:寻找感应区内所有符合ISO14443A标准的卡,寻卡成功后,返回卡的类型。 (2)防碰撞:通过防碰撞命令查看多张M1卡之间是否发生碰撞,若发生碰撞,使用防碰撞算法进行处理;若未发生碰撞,则MF RC522与M1卡进行通信,如果通信成功,读出M1卡中的序列号。 (3)选卡:根据M1卡的序列号进行选卡。 (4)密码验证:密码验证模式有验证A密钥和验证B密钥,通过这两种模式来验证块地址、密码和卡片序列号。 (5)读数据块:根据提供的块地址读取块数据。 (6)写数据块:根据提供的块地址写入块数据,操作完成后命令M1卡进入休眠状态。 2.6 AT45DB161D驱动程序 AT45DB161D是一个外部Flash存储器,拥有2 MB的容量,分为4 096个页,可配置为每页512 B,还拥有2个512 B的缓冲区。在主存储器正在编程时,缓冲区允许接收数据,且支持数据流式写入。AT45DB161的初始化包括STM32的引脚配置和SPI2接口配置,初始化之后才能进行读写操作。读写页操作流程如下: (1)读页操作流程 ①检测AT45芯片是否忙。若忙,则继续读忙,直到芯片空闲;若芯片空闲,则执行流程②。 ②向AT45芯片写入命令0x53和页地址。0x53命令是将Flash中整页的数据读到缓冲区1中。 ③向AT45芯片写入命令0xD4和页偏移地址及数据长度。0xD4命令是读缓冲区1中的数据。 ④读页操作完成。 (2)写页操作流程 ①检测AT45芯片是否忙。若忙,则继续读忙,直到芯片空闲;若芯片空闲,则执行流程②。 ②向AT45芯片写入命令0x84、页偏移地址及需要写入的数据。0x84命令是将数据写到缓冲区1中。 ③向AT45芯片写入命令0x83和页地址。0x83命令是将缓冲区1中的数据写到Flash指定的页。使用0x83命令,写入前不需要对页进行擦除操作。 ④写页操作完成。 3 性能测试与实验分析 3.1手持式阅读器的功能测试 需要测试的功能有对M1卡读写、文件读写、与PC机数据通信等功能。为了便于测试上述功能,将本设计应用在校园消费系统上进行测试。测试步骤如下: (1)用串口线将RFID阅读器与PC机相连。运行PC机的上位机程序,设置串口参数为:波特率9 600 b/s,数据位8 bit,停止位1 bit,无校验位,无流控制。 (2)对M1卡读写功能测试。通过上位机软件发送指令和数据至阅读器,阅读器将指定数据写入M1卡。然后再将M1卡数据读出,传回给上位机软件显示,并比较写入数据和读出数据,如图6所示。 (3)文件读写测试。由于读M1卡的数据以文件的形式存放在阅读器的外部Flash中,该Flash由文件系统管理。用USB线连接阅读器和PC机,阅读器以盘符的形式在PC机上显示,从磁盘中将文件复制到PC机上,用上位机软件打开读出软件,记录测试数据。 (4)与PC机数据通信测试。以上两项测试通过则表明阅读器能与PC机进行正常通信。 3.2 性能测试与分析 系统的性能测试主要是锂电池的续航时间及RFID有效读卡距离等。系统性能测试如表1所示。 (1)锂电池的续航时间需要分别测试最长待机时间和连续工作时间。 ①最长待机时间测试:将锂电池充满电,阅读器使用电池供电,将阅读器开机而不使用,记录待机时间。 ②连续工作时间测试:将锂电池充满电,阅读器使用电池供电,编写一个测试程序,让阅读器定时每30 s读取M1卡信息。记录工作时间。 ③用万用表分别测量阅读器的待机消耗电流和工作消耗电流,并记录电流值。 (2)RFID有效读卡距离。将阅读器固定不动,M1卡平行放在阅读器天线平面的正上方200 mm处,将M1卡缓慢向阅读器移动,直到阅读器能正确读取M1卡中数据为止。测量卡与阅读器天线之间的距离并记录数据。 通过对上述的系统功能、性能进行验证,分析实验测出的相应数据,系统的功能基本能达到了初期预设的技术指标。 本文设计的阅读器有良好的人机交流界面,可通过触控操作,显示屏可显示M1卡中存储信息。经过实验证明,在70 mm的范围内能准确读写M1卡中的数据。该阅读器具有超长待机和低功耗的功能。经过实际功能测试,已成功地将该设计应用于校园消费系统。 专注
生产者与消费者问题 ~
金拱门快餐店主要出售汉堡、小吃、饮料和甜品等类型的快餐食品,每种类型的食品有不同的产品,例如饮料类食品有可乐、咖啡、茶饮料等。现在让你担任吉珠金拱门连锁门店的经理,负责销售产品的选定和套餐的设计,你需要使用C/C++的console模式开发一个软件,包含所有销售产品的信息(包括单品和套餐信息),通过一个菜单系统实现顾客的点餐和结算过程,通过管理员权限统计当前结算周期的销售信息(如各产品的销售量、销售额等) 功能需求: (1) 根据面向对象的设计思想,设计一个抽象类作为基类,封装所有具体产品的共有属性和运算。根据你的产品列表,从基类派生出各具体类,包括单品和套餐产品。 (2) 设计一个菜单类,应该包含但不限定下述多层菜单选项 i. 顾客点餐子菜单:商品列表,顾客可一次购买多种产品 ii. 结算子菜单:顾客点餐完毕自动转入结算界面,现实顾客点餐内容及总金额。要求可以返回点餐菜单进行修改。 iii. 管理员子菜单:密码管理,销售统计,退出系统。 (3) 设计一个订单类,封装每一个售出的订单信息,以供数据统计使用。 (4) 使用外部文件存取数据,方便数据的输入输出。
C语言课程设计---商品订购系统 调试
#include <stdio.h> #include <string.h> int inumber = 0; //商品量的统计 int ibuy = 0; //订单的统计 void secondmain(); //管理维护子菜单 void jianpanload(); //输入商品 void scanproduct(); //浏览商品 void searchproduct(); //搜索商品 void dinggou(); //订购商品 void lookdinggou(); //查询订单 void addproduct(); //增加商品 void deleteproduct(); //删除商品 void saveproduct(); //保存商品 void savedinggou(); //保存订单 void wenbenload(); //从文本导入商品 struct product { char name[30]; //商品名 int number; //货号 char vender[30]; //厂家 char filed[100]; //产地 int stock; //存量 double price; //单价 }; struct product a[100]; struct dinggou { int bgname; //货号 int bmany; //订购量 int btime; //日期时间 char bname[100]; //客户名 char baddress[100]; //客户地址 int bnumber; //客户号 }; struct dinggou b[100]; int main(void) { int i; wenbenload(); do { printf("\n\n\n\n\n\n"); printf("**************************欢迎使用商品订购系统v1.0******************************\n"); printf(" ┏━━━━━━━━━━━━━━━━━━━┓\n"); printf(" ┃ 1.浏览商品信息 ┃\n"); printf(" ┃ 2.订购商品 ┃\n"); printf(" ┃ 3.订单查询 ┃\n"); printf(" ┃ 4.搜索商品 ┃\n"); printf(" ┃ 5.管理菜单 ┃\n"); printf(" ┃ 0.退出系统 ┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━━━┛\n"); printf("********************************************************************************\n"); printf("\n\n\t\t请输入你的操作(0~5): "); scanf("%d",&i); switch(i) { case 1: scanproduct(); break; case 2: dinggou(); break; case 3: lookdinggou(); break; case 4: searchproduct(); break; case 5: secondmain(); break; case 0: //退出系统的界面 printf("\n\n\n\n\n\n\n\n"); printf("\n\n\t\t\t欢迎使用本系统\n\n\n\n\n\t\t\t欢迎再次使用\n"); } }while(1); return 0; } //浏览商品 void scanproduct() { int i; printf("\t\t\t\t\t商品信息列表\n"); for (i = 0; i < inumber; i++) { printf("名称 : %s\n",a[i].name); printf("货号 : %d\n",a[i].number); printf("厂家 : %s\n",a[i].vender); printf("产地 : %s\n",a[i].filed); printf("存量 : %d\n",a[i].stock); printf("单价 : %.2lf\n\n\n",a[i].price); } printf("\n\n\n\n\n\n\t\t\t"); printf("返回主菜单\n"); printf("\t\t\t"); //每个/t占8个字节,可理解为空格键 return; } //商品的订购 void dinggou() { char ch; int i, j, t, c = 1; int n = 1; int m = 0; do { switch(n) { case 1: printf("\t\t\t\t商品信息列表\n"); //显示商品的名称、货号信息,以便于订购 printf("名称\t 货号\t 库存\n"); for (i = 0; i < inumber; i++) { printf("%s\t %d\t %d\n\n\n",a[i].name,a[i].number,a[i].stock); } printf("\n\n\n"); printf("\t\t\t\t商品订单\n"); printf("\n\t\t\t请输入你的第%d个订单信息:\n",m + 1); printf("\n\t\t\t货号:"); fflush(stdin); scanf("%d",&b[ibuy].bgname); //检测是否含有此商品 j = 1; for (i = 0; i < inumber; i++) { if(a[i].number == b[ibuy].bgname) { j = 0; t = i; } } //若有商品继续购买项目 if(j == 0) { printf("\n\t\t\t订购量:"); fflush(stdin); scanf("%d",&b[ibuy].bmany); if (a[t].stock >= b[ibuy].bmany) { a[t].stock = a[t].stock - b[ibuy].bmany; //顾客购买后商品的库存计算 printf("\n\t\t\t日期时间:"); fflush(stdin); scanf("%d",&b[ibuy].btime); printf("\n\t\t\t客户名:"); fflush(stdin); gets(b[ibuy].bname); printf("\n\t\t\t客户地址:"); fflush(stdin); gets(b[ibuy].baddress); printf("\n\t\t\t客户号:"); printf("%d\n",b[ibuy].bnumber); ibuy++; m++; printf("\n\n\n\t\t\t\t"); } else { printf("\n\n\t\t\t订购数目超出库存\n"); printf("\t\t\t"); } } //若没有商品的提示及操作 else { printf("\n\n\t\t\t查无此货\n"); printf("\t\t\t"); } case 2: printf("是否继续输入订购?(Y/N)"); fflush(stdin); scanf("%c",&ch); if(ch == 'N' || ch == 'n') { c = 0; break; } else if(ch == 'Y' || ch == 'y') { c = 0; n = 1; break; } else if(ch != 'n' || ch != 'N' || ch != 'Y' || ch != 'y') { n = 0; c = 1; break; } case 0: if(c == 1) { n = 2; } } }while(ch != 'n' && ch != 'N'); return ; } //订单的查询 void lookdinggou() { int i; printf("\t\t\t\t\t订单列表\n"); for (i = 0; i < ibuy; i++) { printf("货号 : %d\n",b[i].bgname); printf("订购量 : %d\n",b[i].bmany); printf("日期时间 : %d\n",b[i].btime); printf("客户名 : %s\n",b[i].bname); printf("客户地址 : %s\n",b[i].baddress); printf("客户号 : %d\n\n\n",b[i].bnumber); } printf("\n\n\n\n\n\n\t\t\t"); printf("返回主菜单\n"); printf("\t\t\t"); return; } //增加商品 void addproduct() { char ch; int i=1; int n = 1; do { switch(n) { case 1: printf("\t\t\t\t商品信息的增加\n"); printf("\t\t\t\t\t注:要重新输入已有及增加的商品\n"); printf("\n\t\t\t请输入你的第%d件商品的信息:\n",i); printf("\n\t\t\t名称:"); fflush(stdin); scanf("%s",a[inumber].name); printf("\n\t\t\t货号:"); fflush(stdin); scanf("%d",&a[inumber].number); printf("\n\t\t\t厂家:"); fflush(stdin); scanf("%s",a[inumber].vender); printf("\n\t\t\t产地:"); fflush(stdin); scanf("%s",a[inumber].filed); printf("\n\t\t\t存量:"); fflush(stdin); scanf("%d",&a[inumber].stock); printf("\n\t\t\t单价:"); fflush(stdin); scanf("%lf",&a[inumber].price); i++; inumber++; case 2: printf("是否继续输入记录?(Y/N)"); fflush(stdin); scanf("%c",&ch); if(ch == 'N' || ch ==' Y'|| ch == 'n'|| ch == 'y') { break; } if(ch ==' Y'|| ch == 'y') { n = 1; break; } case 0: printf("是否继续输入记录?(Y/N)"); fflush(stdin); scanf("%c",&ch); n = 2; } }while(ch != 'n' && ch != 'N'); return; } //删除商品 void deleteproduct() { int i; int j; char ch; int n = 1; do { switch(n) { case 1: printf("\t\t\t\t商品列表\n"); //显示商品的名称、货号信息,以便于下部的删除 for (i = 0; i < inumber; i++) { printf("名称 : %s\n",a[i].name); printf("ID : %d\n",i); printf("库存 : %d\n\n\n",a[i].stock); } //商品的搜索 printf("\n\n\n\t\t\t\t请输入你要删除商品的ID:"); scanf("%d",&j); i = j; while(i < inumber - 1) { strcpy(a[i].name, a[i + 1].name); a[i].number = a[i + 1].number; strcpy(a[i].filed, a[i + 1].filed); a[i].stock = a[i + 1].stock; a[i].price = a[i + 1].price; strcpy(a[i].vender, a[i + 1].vender); i++; } inumber--; case 2: printf("是否继续删除商品?(Y/N)"); fflush(stdin); scanf("%c",&ch); if(ch == 'N' || ch ==' Y'|| ch == 'n'|| ch == 'y') { break; } if(ch ==' Y'|| ch == 'y') { n = 1; break; } case 0: printf("是否继续输入记录?(Y/N)"); fflush(stdin); scanf("%c",&ch); n = 2; } }while(ch != 'n' && ch != 'N'); printf("\n\n\n\n\n\n\t\t\t"); printf("返回附加功能菜单\n"); printf("\t\t\t"); return; } //商品信息的保存 void saveproduct() { FILE *fpgoods; int i; fpgoods = fopen("goodsinfo.out","w"); fprintf(fpgoods,"\t\t\t\t\t\t商品信息列表\n"); //商品信息的录入 for (i = 0; i < inumber; i++) { fprintf(fpgoods,"名称: %s\n",a[i].name); fprintf(fpgoods,"货号: %d\n",a[i].number); fprintf(fpgoods,"厂家: %s\n",a[i].vender); fprintf(fpgoods,"产地: %s\n",a[i].filed); fprintf(fpgoods,"存量: %d\n",a[i].stock); fprintf(fpgoods,"单价: %.2lf\n\n\n",a[i].price); } fclose(fpgoods); printf("\n\n\n\n\n\n\t\t\t\t商品信息保存成功!!!\n"); printf("\t\t\t\t"); return; } //订单的保存信息 void savedinggou() { FILE *fpgoods; int i; fpgoods = fopen("bookrecordinfo.out","w"); fprintf(fpgoods,"\t\t\t\t\t\t订单列表\n"); //商品信息的录入 for (i = 0; i < ibuy; i++) { fprintf(fpgoods,"货号 :%d\n",b[i].bgname); fprintf(fpgoods,"订购量 :%d\n",b[i].bmany); fprintf(fpgoods,"日期时间 :%d\n",b[i].btime); fprintf(fpgoods,"客户名 :%s\n",b[i].bname); fprintf(fpgoods,"客户地址 :%s\n",b[i].baddress); fprintf(fpgoods,"客户号 :%d\n\n\n",b[i].bnumber); } fclose(fpgoods); //保存后信息的反馈 printf("\n\n\n\n\n\n\t\t\t\t信息保存成功!!!\n"); printf("\t\t\t\t"); return; }
这是职工管理系统的源代码,问题主要是无法以正确格式输出文件内容和修改函数不起作用,希望得到指导。
#include<stdio.h> //标准输入输出函数库 #include<string.h> //strcmp函数使用的头文件 #include<stdlib.h> //标准库头文件system(cls)函数需用到 #include<windows.h> //Sleep函数使用的头文件 #include<conio.h> //getch函数使用的头文件 //宏定义 #define LEN_EMPLOYEE sizeof(struct employee)//employee结构体的长度 #define LEN_ADM sizeof(struct adm)//adm结构体的长度 #define EMPLOYEE_NUM 500//职工的数组大小 #define ADM_NUM 10//管理员的数组大小 #define EMPLOYEE_DATA employeer[i].num,employeer[i].name,employeer[i].sex,employeer[i].age,employeer[i].xueli,employeer[i].wage,employeer[i].addr,employeer[i].tel #define ADM_DATA admer[i].account,admer[i].password //结构体的定义 struct employee { int num; //职工号 char name[20]; //姓名 char sex[10]; //性别 int age; //年龄 char xueli[30]; //学历 int wage; //工资 char addr[30]; //家庭住址 char tel[20]; //联系电话 }; struct adm { int num; //管理员的编号 char account[20]; //管理员的账户 char password[20]; //管理员的密码 }; //全局变量 struct employee employeer[EMPLOYEE_NUM]; struct adm admer[ADM_NUM]; //函数声明部分 void showmainmenu();//显示主菜单 void manager_in();//主管登录 void adm_in();//管理员登录 void employee_in();//职工登录 void managermenu();//主管菜单 void employee_display();//浏览职工信息 int employee_search();//查找职工信息 void employee_del();//删除职工信息 void employee_add();//添加职工信息 void employee_xiugai();//修改职工信息 void adm_add();//添加管理员信息 void adm_display();//浏览管理员信息 void adm_del();//删去管理员信息 void adm_xiugai();//修改管理员信息 int employeefile(char * pcMode);//职工文件函数 void saveemployeefile(int employeeid);//保存职工信息文件函数 void showemployee_xiugaimenu();//显示职工修改菜单 int admfile(char * pcMode);//管理员文件 int adm_search();//管理员查找 void showadm_xiugaimenu();//显示管理员修改菜单 void saveadmfile(int admid);//管理员保存文件函数 void admmenu();//管理员菜单 //主函数 int main() { int n; showmainmenu();/*调用showmainmenu函数绘制界面*/ scanf("%d",&n);/*提示用户输入数字*/ getchar(); while(n)/*当n为0时直接退出程序*/ { switch(n) { case 1: manager_in(); break; case 2: adm_in(); break; case 3: employee_in(); break; default: printf("\t\t请输入正确的数字!\n\t\t程序将于3秒后跳转到主菜单"); Sleep(3000); } showmainmenu(); scanf("%d",&n); getchar(); } return 0; } void showmainmenu() { system("cls"); printf("\n\n\n\n\n"); printf("\t|------------------欢迎进入-----------------------|\n"); printf("\t| 职工管理系统 |\n"); printf("\t| 主菜单 |\n"); printf("\t| 身份选择 |\n"); printf("\t| 1.manager |\n"); printf("\t| 2.administrator |\n"); printf("\t| 3.employee |\n"); printf("\t| 0.退出系统 |\n"); printf("\t|-------------------------------------------------|\n"); printf("\n"); printf("\t\t请选择(0-3):"); } void manager_in() { int n,i,j=0; char managername[10]; char managerpassword[20]; printf("将于3秒后转至manager登录界面"); Sleep(3000); system("cls"); for(i=0;i<3;i++) { printf("\n\t\t\t请输入你的用户名:"); scanf("%s",managername); printf("\n\t\t\t请输入你的密码:"); scanf("%s",managerpassword); if(strcmp(managername,"limengqi")==0&&strcmp(managerpassword,"123456")==0) { printf("\n\t\t\t登录成功!"); Sleep(1000); j=1; managermenu(); break; } else printf("\t\t\t输入用户名或者密码错误!"); continue; } scanf("%d",&n); getchar(); while(n) { switch(n) { case 1: employee_display(); break; case 2: employee_search(); break; case 3: employee_del(); break; case 4: employee_add(); break; case 5: employee_xiugai(); break; case 6: adm_add(); break; case 7: adm_display(); break; case 8: adm_del(); break; case 9: adm_xiugai(); break; default: printf("\t\t请输入正确的数字!"); } printf("|按任意键返回子菜单|"); getch(); managermenu(); scanf("%d",&n); getchar(); } } void managermenu() { system("cls"); printf("\n\n\n\n\n"); printf("\t|------------------欢迎进入-----------------------|\n"); printf("\t| 职工管理系统 |\n"); printf("\t| 子菜单 |\n"); printf("\t| 1.浏览职工信息 |\n"); printf("\t| 2.查询职工信息 |\n"); printf("\t| 3.删除职工信息 |\n"); printf("\t| 4.添加职工信息 |\n"); printf("\t| 5.修改职工信息 |\n"); printf("\t| 6.添加管理员信息 |\n"); printf("\t| 7.浏览管理员信息 |\n"); printf("\t| 8.删除管理员信息 |\n"); printf("\t| 9.修改管理员信息 |\n"); printf("\t| 0.返回主菜单 |\n"); printf("\t|-------------------------------------------------|\n"); printf("\n"); printf("\t\t请选择(0-9):"); } void employee_display() { int i,employee_record; system("cls"); employee_record=employeefile("rb"); if(employee_record==-1) printf("文件打开失败,请先添加职工信息!\n"); else if(employee_record==0) printf("文件中没有职工信息!\n"); else { printf("\t|----------------------------------------------------------|\n"); printf("\t %-6s %-10s %-10s %-6s %-10s %-16s %-16s %-20s\n","职工号","姓名","性别","年龄","学历","工资","住址","电话"); for(i=0;i<employee_record;i++) printf("\t %-6s %-10s %-10s %-6s %-10s %-16s %-16s %-20s\n",EMPLOYEE_DATA); printf("\t|----------------------------------------------------------|\n"); } } void employee_add() { FILE *pfemployee;//文件指针 int employee_record,iflagexist,i; char cFlag; system("cls"); employee_record=employeefile("ab+");//ab+追加方式打开或重建二进制文件 if(employee_record==-1) { printf("文件打开失败!\n"); return; } else if(employee_record==0) printf("文件中没有职工信息!\n"); else employee_display();//如果职工信息不为0则显示所有职工信息 /*以下代码为循环录入职工信息*/ printf("请选择是否要输入职工信息(y/n):"); cFlag=getchar(); getchar(); if(cFlag=='n') return; pfemployee=fopen("employee.txt","ab+"); if( pfemployee==NULL) { printf("文件打开失败!\n"); return; } while(cFlag=='y') { if(employee_record>=EMPLOYEE_NUM)//超过容量范围不能继续写入 { printf("记录已满!"); fclose(pfemployee); return; } printf("请输入职工编号:"); do{ iflagexist=0; scanf("%d",&employeer[employee_record].num); getchar(); for(i=0;i<employee_record;i++) { if(employeer[i].num==employeer[employee_record].num) { iflagexist=1; printf("该职工编号已存在,请重新输入:"); break; } } }while( iflagexist==1); //新增的职工基本信息 printf("请输入职工号:"); scanf("%-6d",&employeer[employee_record].num); getchar(); printf("请输入姓名:"); gets(employeer[employee_record].name); printf("请输入性别:"); scanf("%-10s",&employeer[employee_record].sex); getchar(); printf("请输入年龄:"); scanf("%-6d",&employeer[employee_record].age); getchar(); printf("请输入学历:"); gets(employeer[employee_record].xueli); printf("请输入工资:"); scanf("%-16d",&employeer[employee_record].wage); getchar(); printf("请输入住址:"); gets(employeer[employee_record].addr); printf("请输入电话:"); gets(employeer[employee_record].tel); /*将新增的职工信息写入文件中*/ if(fwrite(&employeer[employee_record],LEN_EMPLOYEE,1,pfemployee)!=1) { printf("无法保存该信息!\n"); return; } else { printf("%d号职工信息已保存!\n",employeer[employee_record].num); employee_record++; } printf("继续输入信息吗(y/n)"); cFlag=getchar(); getchar(); } fclose(pfemployee); printf("添加职工信息执行完毕\n"); } int employee_search() { int employeenum,employee_record,employeeid,i; system("cls"); employee_record=employeefile("rb");//以"rb"形式打开文件,如果失败则返回 if(employee_record==-1) { printf("文件打开失败!\n"); printf("|按任意键返回子菜单|"); getch(); return -2;//文件打开失败,返回-2 } else if(employee_record==0) { printf("文件中没有职工信息!\n"); printf("|按任意键返回子菜单|"); getch(); return -3;//文件打开失败,返回-3 } //以下进入查找程序 printf("请输入职工号:"); scanf("%d",&employeenum); getchar(); for(i=0;i<employee_record;i++) { if(employeenum==employeer[i].num ) { employeeid=i;//找到职工记录,返回记录号 printf("\t %-6s %-10s %-10s %-6s %-10s %-16s %-16s %-20s\n","职工号","姓名","性别","年龄","学历","工资","住址","电话"); printf("\t %-6d %-10s %-10c %-6d %-10s %-16d %-16s %-20s\n",EMPLOYEE_DATA); printf("\t|----------------------------------------------------------|\n"); break; } } if(i==employee_record)//遍历循环,没有找到记录,提示用户 { printf("找不到%d号职工信息!\n",employeenum); employeeid=-1; } return employeeid; } void employee_del() { FILE *pfemployee; int employeeid,employee_record,i; char cFlag;//字符型变量用于选择 system("cls"); employeeid=employee_search();//调用查找函数获得职工记录号 if(employeeid==-1) return; employee_record=employeefile("rb"); printf("已找到该职工,是否删除?(y/n)"); cFlag=getchar(); getchar(); if(cFlag=='n') return; else if(cFlag=='y') { for(i=employeeid;i<employee_record-1;i++) employeer[i]=employeer[i+1];//数组依次前移 employee_record--; } pfemployee=fopen("employee.txt","wb"); if(pfemployee!=NULL) { for(i=0;i<employee_record;i++) { if(fwrite(&employeer[i],LEN_EMPLOYEE,1,pfemployee)!=1) { printf("无法保存该信息!\n"); return; } } fclose(pfemployee); printf("该职工信息已删除!\n"); } } void employee_xiugai() { int employeeid,employee_record,iflagexist,n,num,i; system("cls"); employeeid=employee_search();//调用查找函数获得职工记录号 if(employeeid==-1)//未找到该序号的职工,直接返回 return; //找到该序号的职工,可以进行修改操作 employee_record=employeefile("rb"); showemployee_xiugaimenu();//显示修改选项的菜单 scanf("%d",&n); getchar(); switch(n) { case 1: printf("请输入职工编号:"); do { iflagexist=0; scanf("%d",&n); getchar(); for(i=0;i<employee_record;i++) { if(num==employeer[i].num&&i!=employeeid) { iflagexist=1; printf("错误,该职工编号已存在,请重新输入:"); break; } } }while(iflagexist==1); employeer[employeeid].num=num; break; case 2: printf("请输入职工姓名:"); gets(employeer[employee_record].name); break; case 3: printf("请输入性别:"); scanf("%-10s",employeer[employee_record].sex); getchar(); break; case 4: printf("请输入年龄:"); scanf("%-10d",&employeer[employee_record].age); getchar(); break; case 5: printf("请输入学历:"); gets(employeer[employee_record].xueli); break; case 6: printf("请输入工资:"); scanf("%-16d",&employeer[employee_record].wage); getchar(); break; case 7: printf("请输入住址:"); gets(employeer[employee_record].addr); break; case 8: printf("请输入电话:"); gets(employeer[employee_record].tel); break; } //调用saveemployeefile函数将修改记录存入文件 saveemployeefile(employeeid); printf("职工信息修改成功!\n"); } void showemployee_xiugaimenu() { printf("\n"); printf("\t| 1.职工号 |\n"); printf("\t| 2.姓名 |\n"); printf("\t| 3.性别 |\n"); printf("\t| 4.年龄 |\n"); printf("\t| 5.学历 |\n"); printf("\t| 6.工资 |\n"); printf("\t| 7.住址 |\n"); printf("\t| 8.电话 |\n"); printf("\n"); printf("请输入所要修改的信息(输入相应的数字:1-5):"); } int employeefile(char * pcMode)//该函数负责从文件中读取所有的职工信息,并记录employee_record的值 { int employee_record=0; FILE *pfemployee; pfemployee=fopen("employee.txt",pcMode); if(pfemployee==NULL) return -1; while(!feof(pfemployee)) { if(fread(&employeer[employee_record],LEN_EMPLOYEE,1,pfemployee)) employee_record++; } fclose(pfemployee); return employee_record; } void saveemployeefile(int employeeid)//该函数专门负责将职工记录号为employeeid的职工信息写入到文件中 { FILE *pfemployee; pfemployee=fopen("employee.txt","a+"); if(pfemployee!=NULL) { fseek(pfemployee,LEN_EMPLOYEE * employeeid,SEEK_SET); if(fwrite(&employeer[employeeid],LEN_EMPLOYEE,1,pfemployee)!=1) printf("无法保存该信息!\n"); } fclose(pfemployee); } void adm_add() { FILE *pfadm;//文件指针 int adm_record,iflagexist,i; char cFlag; system("cls"); adm_record=admfile("ab+");//ab+追加方式打开或重建二进制文件 if(adm_record==-1) { printf("文件打开失败!\n"); return; } else if(adm_record==0) printf("文件中没有职工信息!\n"); else adm_display();//如果职工信息不为0则显示所有职工信息 /*以下代码为循环录入职工信息*/ printf("请选择是否要输入职工信息(y/n):"); cFlag=getchar(); getchar(); if(cFlag=='n') return; pfadm=fopen("adm.txt","ab+"); if( pfadm==NULL) { printf("文件打开失败!\n"); return; } while(cFlag=='y') { if(adm_record>=ADM_NUM)//超过容量范围不能继续写入 { printf("记录已满!"); fclose(pfadm); return; } printf("请输入管理员编号:"); do{ iflagexist=0; scanf("%d",&admer[adm_record].num); getchar(); for(i=0;i<adm_record;i++) { if(admer[i].num==admer[adm_record].num) { iflagexist=1; printf("该管理员编号已存在,请重新输入:"); break; } } }while( iflagexist==1); //新增的管理员的账户和密码 printf("请输入管理员号:"); scanf("%-6d",&admer[adm_record].num); getchar(); printf("请输入账户:"); gets(admer[adm_record].account); printf("请输入密码:"); gets(admer[adm_record].password); /*将新增的管理员的账户和密码写入文件中*/ if(fwrite(&admer[adm_record],LEN_ADM,1,pfadm)!=1) { printf("无法保存该信息!\n"); return; } else { printf("%d号职工信息已保存!\n",admer[adm_record].num); adm_record++; } printf("继续输入信息吗(y/n)"); cFlag=getchar(); getchar(); } fclose(pfadm); printf("添加管理员账户和密码执行完毕\n"); } void adm_display() { int i,adm_record; system("cls"); adm_record=admfile("rb"); if(adm_record==-1) printf("文件打开失败,请先添加管理员信息!\n"); else if(adm_record==0) printf("文件中没有管理员信息!\n"); else { printf("\t|----------------------------------------------------------|\n"); printf("\t %-6s %-20s %-20s\n","管理员编号","账户","密码"); for(i=0;i<adm_record;i++) printf("\t %-6d %-20s %-20s\n",ADM_DATA); printf("\t|----------------------------------------------------------|\n"); } } void adm_del() { FILE *pfadm; int admid,adm_record,i; char cFlag;//字符型变量用于选择 system("cls"); admid=adm_search();//调用查找函数获得管理员记录号 if(admid==-1) return; adm_record=admfile("rb"); printf("已找到该管理员,是否删除?(y/n)"); cFlag=getchar(); getchar(); if(cFlag=='n') return; else if(cFlag=='y') { for(i=admid;i<adm_record-1;i++) admer[i]=admer[i+1];//数组依次前移 adm_record--; } pfadm=fopen("adm.txt","wb"); if(pfadm!=NULL) { for(i=0;i<adm_record;i++) { if(fwrite(&admer[i],LEN_ADM,1,pfadm)!=1) { printf("无法保存该信息!\n"); return; } } fclose(pfadm); printf("%d号管理员信息已删除!\n",admer[i].num); } } void adm_xiugai() { int admid,adm_record,iflagexist,n,num,i; system("cls"); admid=adm_search();//调用查找函数获得管理员记录号 if(admid==-1)//未找到该序号的管理员,直接返回 return; //找到该序号的管理员,可以进行修改操作 adm_record=admfile("rb"); showadm_xiugaimenu();//显示修改选项的菜单 scanf("%d",&n); getchar(); switch(n) { case 1: printf("请输入管理员编号:"); do { iflagexist=0; scanf("%d",&n); getchar(); for(i=0;i<adm_record;i++) { if(num==admer[i].num&&i!=admid) { iflagexist=1; printf("错误,该管理员编号已存在,请重新输入:"); break; } } }while(iflagexist==1); admer[admid].num=num; break; case 2: printf("请输入管理员账户:"); gets(admer[adm_record].account); break; case 3: printf("请输入管理员密码:"); gets(admer[adm_record].password); break; } //调用saveadmfile函数将修改记录存入文件 saveadmfile(admid); printf("管理员信息修改成功!\n"); } void showadm_xiugaimenu() { printf("\n"); printf("\t| 1.管理员编号 |\n"); printf("\t| 2.账户 |\n"); printf("\t| 3.密码 |\n"); printf("\n"); printf("请输入所要修改的信息(输入相应的数字:1-3):"); } int admfile(char * pcMode)//该函数负责从文件中读取所有的管理员信息,并记录adm_record的值 { int adm_record=0; FILE * pfadm; pfadm=fopen("adm.txt",pcMode); if(pfadm==NULL) return -1; while(!feof(pfadm)) { if(fread(&admer[adm_record],LEN_ADM,1,pfadm)) adm_record++; } fclose(pfadm); return adm_record; } void saveadmfile(int admid)//该函数专门负责将管理员记录号为admid的管理员信息写入到文件中 { FILE *pfadm; pfadm=fopen("adm.txt","r+"); if(pfadm!=NULL) { fseek(pfadm,LEN_ADM * admid,SEEK_SET); if(fwrite(&admer[admid],LEN_ADM,1,pfadm)!=1) printf("无法保存该信息!\n"); } fclose(pfadm); } int adm_search() { int admnum,adm_record,admid,i; system("cls"); adm_record=admfile("rb");//以"rb"形式打开文件,如果失败则返回 if(adm_record==-1) { printf("文件打开失败!\n"); printf("|按任意键返回子菜单|"); getch(); return -2;//文件打开失败,返回-2 } else if(adm_record==0) { printf("文件中没有职工信息!\n"); printf("|按任意键返回子菜单|"); getch(); return -3;//文件打开失败,返回-3 } //以下进入查找程序 printf("请输入职工号:"); scanf("%d",&admnum); getchar(); for(i=0;i<adm_record;i++) { if(admnum==admer[i].num ) { admid=i;//找到职工记录,返回记录号 printf("\t %-6d %-20s %-20s\n","管理员编号","账户","密码"); printf("\t %-6d %-20s %-20s\n",ADM_DATA); printf("\t|----------------------------------------------------------|\n"); break; } } if(i==adm_record)//遍历循环,没有找到记录,提示用户 { printf("找不到%d号职工信息!\n",admnum); admid=-1; } return admid; } void adm_in() { int i,n,k,j=-1,adm_record; char admaccount[20]; char admpassword[20]; FILE *fpadm; adm_record=admfile("rb"); printf("将于3秒后转至administrator登录界面"); Sleep(3000); system("cls"); for(k=0;k<3;k++) { printf("\n\t\t\t请输入你的账户名:"); scanf("%s",admaccount); printf("\n\t\t\t请输入你的登入密码:"); scanf("%s",admpassword); for(i=0;i<adm_record;i++) { if(strcmp(admer[i].account,admaccount)==0&&strcmp(admer[i].password,admpassword)==0) { printf("\n\t\t\t登入成功!"); j=1; admmenu(); goto loop; } else printf("\t\t\t用户名或者密码错误,请重新输入:"); break; } } if(j==-1) { printf("\t连续输入错误3次,即将退出程序\n"); Sleep(1000); exit(0); } loop: scanf("%d",&n); getchar(); while(n) { switch(n) { case 1: employee_display(); break; case 2: employee_search(); break; case 3: employee_del(); break; case 4: employee_add(); break; case 5: employee_xiugai(); break; default: printf("\t\t请输入正确的数字!"); } printf("|按任意键返回子菜单|"); getch(); admmenu(); scanf("%d",&n); getchar(); } } void admmenu() { system("cls"); printf("\n\n\n\n\n"); printf("\t|------------------欢迎进入-----------------------|\n"); printf("\t| 职工管理系统 |\n"); printf("\t| 子菜单 |\n"); printf("\t| 1.浏览职工信息 |\n"); printf("\t| 2.查询职工信息 |\n"); printf("\t| 3.删除职工信息 |\n"); printf("\t| 4.添加职工信息 |\n"); printf("\t| 5.修改职工信息 |\n"); printf("\t| 0.返回主菜单 |\n"); printf("\t|-------------------------------------------------|\n"); printf("\n"); printf("\t\t请选择(0-5):"); } void employee_in() { int n,employee_record; system("cls"); printf("\n\n\n\n\n"); employee_record=employeefile("rb"); if(employee_record==-1) printf("文件打开失败,你的信息还没有被添加!\n"); else if(employee_record==0) printf("文件中没有你的信息!\n"); else { printf("\t|----------------------------------------------------------|\n"); printf("\t %-6s %-10s %-10s %-6s %-10s %-16s %-16s %-20s\n","职工号","姓名","性别","年龄","学历","工资","住址","电话"); printf("请输入你的职工号:\n"); scanf("%d",&n); printf("\t %-6d %-10s %-10c %-6d %-10s %-16d %-16s %-20s\n",employeer[n-1].num,employeer[n-1].name,employeer[n-1].sex,employeer[n-1].age,employeer[n-1].xueli,employeer[n-1].wage,employeer[n-1].addr,employeer[n-1].tel); printf("\t|----------------------------------------------------------|\n"); } }
怎么用队列完成程序的先进先出,实现先来先服务分配算法,模拟实现对独占设备的分配和回收
#include<stdio.h> #include<string.h> #include<stdlib.h> #define false 0 #define true 1 #define n 4 /*宏定义,用于修改设备类型数目*/ #define m 10 /*宏定义,用于修改设备数目*/ struct /*该结构体用于定义设备类表各信息*/ { char type[10]; /*设备类型名*/ int count; /*拥有的设备总台数*/ int remain; /*现存的可用设备台数*/ int address; /*该类设备在设备表中的起始地址*/ } equiptype[n]; /*系统设备类型为n*/ struct /*该结构体用于定义设备表各信息*/ { int number; /*设备绝对编号*/ int lnumber; /*设备相对编号*/ int status; /*设备好坏状态*/ int remain; /*设备是否已被分配*/ char jobname[4]; /*占有设备的作业名*/ } equipment[m]; /*系统设备数为m*/ /**********************子函数:作业设备分配*****************************/ allocate(char *J,char *type,int cc) { int i,t,j; i=0; while(i<n&&strcmp(equiptype[i].type,type)!=0) /*查找欲申请分配的设备类型,strcmp函数用于比较equiptype[i].type与type的大小,若相等则返回0*/ i++; if(i>=n) /*若没有找到欲申请设备*/ { printf("没有找到欲分配的设备,分配失败!"); return(false); } if(equiptype[i].remain<1) /*欲申请设备现存可用台数不足*/ { printf("该类设备数量不足,分配失败!"); break; } t=equiptype[i].address; /* 取出该类设备在设备表中的起始地址赋给t*/ while(!(equipment[t].status==1 && equipment[t].remain==0)) t++; /*该设备类型起始地址加一*/ equiptype[i].remain--; /*剩余设备数减一*/ equipment[t].remain=1; /*状态改为已分配*/ strcpy(equipment[t].jobname,J);/*strcpy为字符串拷贝函数,把J中的字符串拷贝到equipment[t].jobname中*/ equipment[t].lnumber=cc; /*设备相对号写入cc*/ } /**********************子函数:作业设备回收*****************************/ reclaim(char *J,char *type) { int i,t,j,k,nn; i=0; while(i<n&&strcmp(equiptype[i].type,type)!=0) /*查找欲申请归还的设备类型,strcmp函数用于比较equiptype[i].type与type的大小,若相等则返回0*/ i++; if(i>=n) /*若没有找到该类设备*/ { printf("无该类设备,设备回收失败!"); return(false); } t=equiptype[i].address; /*取出该类设备在设备表中的起始地址赋给t*/ j=equiptype[i].count; /*取出该类设备的数量赋给j*/ k=0; nn=t+j; for(;t<nn;t++) if(strcmp(equipment[t].jobname,J)==0&&equipment[t].remain==1) /*若占用某个设备的作业与欲回收的作业相同且状态为已分配*/ { equipment[t].remain=0; /*则将其状态改为未分配*/ k++; /*回收设备计数*/ } equiptype[i].remain= equiptype[i].remain+k; /*该类设备剩余设备数加k*/ if(k==0) /*若回收设备计数值k为0,*/ printf("本作业没有占用这类资源!/n"); } /**********************主函数*****************************/ void main( ) { char J[4]; int i,mm,a; char type[10]; printf("设备类初始化\n "); strcpy(equiptype[0].type,"a"); equiptype[0].count=3; equiptype[0].remain=3; equiptype[0].address=0; strcpy(equiptype[1].type,"b"); equiptype[1].count=2; equiptype[1].remain=2; equiptype[1].address=3; strcpy(equiptype[2].type,"c"); equiptype[2].count=4; equiptype[2].remain=4; equiptype[2].address=5; strcpy(equiptype[3].type,"d"); equiptype[3].count=1; equiptype[3].remain=1; equiptype[3].address=9; for(i=0;i<10;i++) /*初始化设备表*/ { equipment[i].number=i; equipment[i].status=1; equipment[i].remain=0; } while(1) { printf("\n0-退出,1-分配,2-回收,3-显示"); /*功能选择界面*/ printf("\n请选择功能(0-3):"); scanf("%d",&a); switch(a) { case 0 : /*a=0程序结束*/ exit(0); case 1 : /*a=1分配设备*/ for(i=0;i<3;i++) /*输入设备类表初始信息*/ { printf("请输入作业名、作业所需设备类型和设备相对号\n"); scanf("%s%s%d",J,type,&mm); printf("请输入作业名、作业所需设备类型和设备相对号\n"); scanf("%s%s%d",J,type,&mm); printf("请输入作业名、作业所需设备类型和设备相对号\n"); scanf("%s%s%d",J,type,&mm); } allocate(J,type,mm); /*分配设备*/ break; case 2: /*a=2回收设备*/ printf("请输入作业名和作业归还的设备类\n"); scanf("%s%s",J,type); /*输入要回收的作业名及对应的设备类*/ reclaim(J,type); /*回收设备*/ break; case 3: /*a=3 输出设备类表和设备表的内容*/ printf("输出设备类表!\n"); /*输出设备类表内容*/ printf(" 设备类型 设备总量 空闲好设备 起始地址\n"); for(i=0;i<n;i++) printf("%9s%16d%22d%14d\n",equiptype[i].type,equiptype[i].count,equiptype[i].remain,equiptype[i].address); printf("输出设备表:\n"); /*输出设备表内容*/ printf("绝对号 好/坏 已/未分配 占用作业名 相对号\n"); for(i=0;i<m;i++) printf("%3d%11d%15d%15s%9d\n",equipment[i].number,equipment[i].status,equipment[i].remain,equipment[i].jobname,equipment[i].lnumber); } } }
Dev cpp 程序不能在vc中运行求解
学生信息管理系统 ** IDE:Dev-Cpp 4.9.9.2 ** 2014-6-15 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm> #include <vector> using std::sort; using std::vector; /*==存储单元节点==*/ struct student{ //字符数组方便统一输入 char name[50], address[100], score[50], id[20], age[5], birth[20], tel[20], gender[5]; }; vector<student> myvec; /*==========函数声明区==========*/ /*-打印主菜单声明-*/ void printMainMenu(); /*-主界面各函数声明-*/ void enterInformation(); //1 void browseInformation(); //2 void inquireInformation(); //3 void modifyInformation(); //4 void deleteInformation(); //5 void saveToFile(); //6 void readFromFile(); //7 void exitInformation(); //0 /*--主界面函数的子函数声明--*/ void inquireOneStudent(student *); void modifyOneStudent(student *); /*--修改单项信息--*/ void modifyOneId(student *); void modifyOneName(student *); void modifyOneAge(student *); void modifyOneGender(student *); void modifyOneBirth(student *); void modifyOneTel(student *); void modifyOneAddress(student *); void modifyOnescore(student *); void modifyToMain(student *); //这个其实不需要形参,只是为了统一跳转表接口 /*--删除一个学生--*/ void deleteOneStudent(student *); /*--显示一个学生的所有信息--*/ void displayOneStudent(student *); /*--浏览方式--*/ void browsePlain(); //直接浏览 void browseById(); void browseByName(); void browseByBirth(); void browseToMain(); /*--查询方式--*/ void inquireById(); void inquireByName(); /*-函数指针数组-*/ void (*mainPointerArr[])() = { exitInformation, enterInformation, browseInformation, inquireInformation, modifyInformation, deleteInformation, saveToFile, readFromFile }; void (*modifyOne[])(student *) = { modifyToMain, modifyOneId, modifyOneName, modifyOneAge, modifyOneGender, modifyOneBirth, modifyOneTel, modifyOneAddress, modifyOnescore }; void (*browseArray[])() = { browseToMain, browsePlain, browseById, browseByName, browseByBirth }; /*==========函数定义区==========*/ /*-主界面菜单函数-*/ void printMainMenu(){ printf("\t\t\t信息与计算科学一班学生信息管理\n\n"); printf("\t\t ======================================\n"); printf("\t\t ||\t\t1、学生信息录入 \t||\n"); printf("\t\t ||\t\t2、学生信息浏览 \t||\n"); printf("\t\t ||\t\t3、学生信息查询 \t||\n"); printf("\t\t ||\t\t4、学生信息修改 \t||\n"); printf("\t\t ||\t\t5、学生信息删除 \t||\n"); printf("\t\t ||\t\t6、学生信息存档 \t||\n"); printf("\t\t ||\t\t7、学生信息读档 \t||\n"); printf("\t\t ||\t\t0、退出管理系统 \t||\n"); printf("\t\t ======================================\n"); printf("\t\t\t\t\t\t原创作者:王林通\n"); printf("请选择功能:"); int num; scanf("%d", &num); (*mainPointerArr[num])(); } /*-信息录入-*/ void enterInformation(){ //1 system("cls"); printf("输入学生信息:\n"); printf("请输入学号:"); int len; student temp; while(gets(temp.id) && !strlen(temp.id)) ; //过滤缓存回车 printf("请输入姓名:"); while(gets(temp.name) && !strlen(temp.name)) ; //过滤缓存回车 printf("请输入年龄:"); while(gets(temp.age) && !strlen(temp.age)) ; //过滤缓存回车 printf("请输入性别:"); while(gets(temp.gender) && !strlen(temp.gender)) ; //过滤缓存回车 printf("请输入生日:"); while(gets(temp.birth) && !strlen(temp.birth)) ; //过滤缓存回车 printf("请输入电话:"); while(gets(temp.tel) && !strlen(temp.tel)) ; //过滤缓存回车 printf("请输入地址:"); while(gets(temp.address) && !strlen(temp.address)) ; //过滤缓存回车 printf("请输入成绩:"); while(gets(temp.score) && !strlen(temp.score)) ; //过滤缓存回车 myvec.push_back(temp); system("cls"); printf("OK,录入成功,该学生信息如下:\n"); len = myvec.size() - 1; inquireOneStudent(&myvec[len]); } void browseInformation(){ //2 if(myvec.empty()){ printf("没有检测到任何学生信息!请在录入后再浏览!\n系统将返回到主界面\n"); system("pause"); browseToMain(); } printf("请选择功能:\n"); printf("1、直接浏览\n"); printf("2、按学号排序后浏览\n"); printf("3、按姓名排序后浏览\n"); printf("4、按生日排序后浏览\n"); printf("0、返回主菜单\n"); int num; scanf("%d", &num); (*browseArray[num])(); browseInformation(); } void inquireInformation(){ //3 if(myvec.empty()){ printf("没有数据,无法查询!系统将退到主菜单\n"); system("pause"); browseToMain(); return; } printf("请选择功能:"); printf("1、输入学号查询\n"); printf("2、输入姓名查询\n"); printf("0、返回主菜单\n"); int num; scanf("%d", &num); if(num == 1) inquireById(); else if(num == 2) inquireByName(); system("pause"); browseToMain(); } void modifyInformation(){ //4 printf("请输入要更改的学生学号:"); char buf[20]; while(gets(buf), !strlen(buf)) ; //依然是过滤空串 vector<student>::iterator it = myvec.begin(); for( ; it != myvec.end(); ++it){ if(strcmp(buf, it->id) == 0){ modifyOneStudent(&myvec[it - myvec.begin()]); return; } } printf("没有找到!\n"); } void deleteInformation(){ //5 if(myvec.empty()){ printf("没有数据可供删除,系统将返回到主菜单。\n"); system("pause"); browseToMain(); return; } printf("请选择功能:\n"); printf("1、清空所有数据\n"); printf("2、删除特定学生的信息\n"); printf("0、返回主菜单\n"); int num; scanf("%d", &num); if(1 == num){ myvec.clear(); printf("成功清除所有信息\n"); return; }else if(2 == num){ char buf[20]; printf("请输入学生学号:"); while(gets(buf), !strlen(buf)) ; vector<student>::iterator it = myvec.begin(); for( ; it != myvec.end(); ++it){ if(!strcmp(buf, it->id)){ deleteOneStudent(&myvec[it - myvec.begin()]); return; } } printf("未找到该学生!\n"); } system("pause"); browseToMain(); } void saveToFile(){ //6 if(myvec.empty()){ printf("数据为空,无法存储,请在录入信息后再存储到文件!系统将返回到主菜单!\n"); system("pause"); browseToMain(); return; } FILE *fp = fopen("studentInformation.txt", "w"); vector<student>::iterator it = myvec.begin(); for( ; it < myvec.end(); ++it){ fprintf(fp, "%s\n", it->id); fprintf(fp, "%s\n", it->name); fprintf(fp, "%s\n", it->age); fprintf(fp, "%s\n", it->gender); fprintf(fp, "%s\n", it->birth); fprintf(fp, "%s\n", it->tel); fprintf(fp, "%s\n", it->address); fprintf(fp, "%s\n", it->score); } fclose(fp); printf("OK, 存档完成!系统将返回到主界面。\n"); system("pause"); browseToMain(); } void readFromFile(){ //7 FILE *fp = fopen("studentInformation.txt", "rb"); if(fp == NULL){ printf("未检测到存档文件!系统将返回到主界面。\n"); system("pause"); browseToMain(); return; } student it; myvec.clear(); while(fscanf(fp, "%s", it.id) == 1){ fscanf(fp, "%s", it.name); fscanf(fp, "%s", it.age); fscanf(fp, "%s", it.gender); fscanf(fp, "%s", it.birth); fscanf(fp, "%s", it.tel); fscanf(fp, "%s", it.address); fscanf(fp, "%s", it.score); myvec.push_back(it); } fclose(fp); if(myvec.empty()){ printf("读取存档失败!系统将返回到主界面!\n"); }else{ printf("读取存档成功!系统将返回到主界面!\n"); } system("pause"); browseToMain(); } void exitInformation(){ //0 printf("感谢您的使用!再见\n"); system("pause"); exit(EXIT_SUCCESS); } void displayOneStudent(student *stu){ printf("*****************************\n"); printf("学号:%s\n", stu->id); printf("姓名:%s\n", stu->name); printf("年龄:%s\n", stu->age); printf("性别:%s\n", stu->gender); printf("生日:%s\n", stu->birth); printf("电话:%s\n", stu->tel); printf("地址:%s\n", stu->address); printf("成绩:%s\n", stu->score); printf("*****************************\n"); } void inquireOneStudent(student *stu){ displayOneStudent(stu); printf("请选择操作:\n"); printf("1、更改该学生信息\n"); printf("2、删除该学生信息\n"); printf("0、返回主菜单\n"); int num; label: scanf("%d", &num); if(num == 1) modifyOneStudent(stu); else if(num == 2) deleteOneStudent(stu); else if(num == 0) modifyToMain(stu); else goto label; } void modifyOneStudent(student *stu){ system("cls"); printf("修改当前学生信息:\n"); printf("1、修改学号\n"); printf("2、修改姓名\n"); printf("3、修改年龄\n"); printf("4、修改性别\n"); printf("5、修改生日\n"); printf("6、修改电话\n"); printf("7、修改地址\n"); printf("8、修改score\n"); printf("0、返回主菜单\n"); int num; scanf("%d", &num); (*modifyOne[num])(stu); } void modifyOneId(student *stu){ printf("请输入新的学号:"); while(gets(stu->id) && !strlen(stu->id)) ; //过滤缓存回车 printf("修改成功!更改后的学生信息如下:\n"); inquireOneStudent(stu); } void modifyOneName(student *stu){ printf("请输入新的姓名:"); while(gets(stu->name) && !strlen(stu->name)) ; //过滤缓存回车 printf("修改成功!更改后的学生信息如下:\n"); inquireOneStudent(stu); } void modifyOneAge(student *stu){ printf("请输入新的年龄:"); while(gets(stu->age) && !strlen(stu->age)) ; //过滤缓存回车 printf("修改成功!更改后的学生信息如下:\n"); inquireOneStudent(stu); } void modifyOneGender(student *stu){ printf("请输入新的性别:"); while(gets(stu->gender) && !strlen(stu->gender)) ; //过滤缓存回车 printf("修改成功!更改后的学生信息如下:\n"); inquireOneStudent(stu); } void modifyOneBirth(student *stu){ printf("请输入新的生日:"); while(gets(stu->birth) && !strlen(stu->birth)) ; //过滤缓存回车 printf("修改成功!更改后的学生信息如下:\n"); inquireOneStudent(stu); } void modifyOneTel(student *stu){ printf("请输入新的电话:"); while(gets(stu->tel) && !strlen(stu->tel)) ; //过滤缓存回车 printf("修改成功!更改后的学生信息如下:\n"); inquireOneStudent(stu); } void modifyOneAddress(student *stu){ printf("请输入新的地址:"); while(gets(stu->address) && !strlen(stu->address)) ; //过滤缓存回车 printf("修改成功!更改后的学生信息如下:\n"); inquireOneStudent(stu); } void modifyOnescore(student *stu){ printf("请输入新的score:"); while(gets(stu->score) && !strlen(stu->score)) ; //过滤缓存回车 printf("修改成功!更改后的学生信息如下:\n"); inquireOneStudent(stu); } void modifyToMain(student *stu){ system("cls"); printMainMenu(); } void deleteOneStudent(student *stu){ vector<student>::iterator it; it = myvec.begin() + (stu - &myvec[0]); myvec.erase(it); printf("删除成功!\n"); } /*--cmp函数定义--*/ bool cmpById(student a, student b){ if(strcmp(a.id, b.id) < 0) return true; } bool cmpByName(student a, student b){ if(strcmp(a.name, b.name) < 0) return true; } bool cmpByBirth(student a, student b){ if(strcmp(a.birth, b.birth) < 0) return true; } /*--浏览方式--*/ void browsePlain(){ //直接浏览 if(myvec.empty()){ printf("数据为空!将返回主菜单。\n"); system("pause"); modifyToMain(NULL); } vector<student>::iterator stu = myvec.begin(); for( ; stu != myvec.end(); ++stu) displayOneStudent(&myvec[stu - myvec.begin()]); } void browseById(){ if(myvec.empty()){ printf("数据为空!将返回主菜单。\n"); system("pause"); modifyToMain(NULL); } sort(myvec.begin(), myvec.end(), cmpById); vector<student>::iterator stu = myvec.begin(); for( ; stu != myvec.end(); ++stu) displayOneStudent(&myvec[stu - myvec.begin()]); } void browseByName(){ if(myvec.empty()){ printf("数据为空!将返回主菜单。\n"); system("pause"); modifyToMain(NULL); } sort(myvec.begin(), myvec.end(), cmpByName); vector<student>::iterator stu = myvec.begin(); for( ; stu != myvec.end(); ++stu) displayOneStudent(&myvec[stu - myvec.begin()]); } void browseByBirth(){ if(myvec.empty()){ printf("数据为空!将返回主菜单。\n"); system("pause"); modifyToMain(NULL); } sort(myvec.begin(), myvec.end(), cmpByBirth); vector<student>::iterator stu = myvec.begin(); for( ; stu != myvec.end(); ++stu) displayOneStudent(&myvec[stu - myvec.begin()]); } void browseToMain(){ system("cls"); printMainMenu(); } /*--查询方式--*/ void inquireById(){ printf("请输入要查询的学生学号:"); char buf[20]; int ok = 0; while(gets(buf), !strlen(buf)) ; //依然是过滤空串 vector<student>::iterator it = myvec.begin(); for( ; it != myvec.end(); ++it){ if(strcmp(buf, it->id) == 0){ displayOneStudent(&myvec[it - myvec.begin()]); ok = 1; } } if(0 == ok) printf("没有找到!\n"); } void inquireByName(){ printf("请输入要查询的学生姓名:"); char buf[20]; int ok = 0; while(gets(buf), !strlen(buf)) ; //依然是过滤空串 vector<student>::iterator it = myvec.begin(); for( ; it != myvec.end(); ++it){ if(strcmp(buf, it->name) == 0){ displayOneStudent(&myvec[it - myvec.begin()]); ok = 1; } } if(0 == ok) printf("没有找到!\n"); } /*==========主函数==========*/ int main(){ printMainMenu(); return 0; }
Android连接SQLserver出现问题
我根据论坛的一个帖子的代码来改的注册界面,但是当传值时系统就崩溃了 显示No message resource found for message property prop.servertype 这是DButil的代码 public class DBUtil { private Connection connection; public static Connection getSQLConnection(String ip, String user, String pwd, String db) { Connection con = null; try { Class.forName("net.sourceforge.jtds.jdbc.Driver"); con = DriverManager.getConnection("jdbc:jtds:sqlserver://" + ip + ":1433/" + db, user, pwd); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return con; } public static String QuerySQL(String UserName, String Name, String PassWord, String Email) { String result = ""; try { Connection connection = DBUtil.getSQLConnection("94.191.104.***", "sa", "123456", "txl"); String sql = "insert into tuser values(" + UserName + "," + Name + "," + PassWord + "," + Email + ");"; Statement stmt = connection.createStatement();// PreparedStatement stat = connection.prepareStatement(sql); ResultSet rs = stat.executeQuery();//执行查询语句 while (rs.next())//判断是否查询出数据 { result= "1" ; } stmt.close(); connection.close(); } catch (SQLException e) { e.printStackTrace(); result += "查询数据异常!" + e.getMessage(); } return result; } public void setConnection(Connection connection) { this.connection = connection; } } 这是注册界面的代码 public class SignActivity extends Activity { private TextView aUseName; private TextView aName; private TextView aPassWord; private TextView aRpassWord; private TextView aEmail; private Button bSign; private Handler handler; boolean isTip1=false,isTip2=false,isTip3=false,isTip4=false; @Override protected void onCreate( Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sign); intView(); initListener(); WorkThread wt=new WorkThread(); wt.start(); } private void initListener() { bSign.setOnClickListener(new View.OnClickListener() { private Editable text; @Override public void onClick(View view) { String UserName = aUseName.getText().toString(); String Name = aName.getText().toString(); String PassWord = aPassWord.getText().toString(); String RpassWord = aRpassWord.getText().toString(); String Email = aEmail.getText().toString(); if (TextUtils.isEmpty(UserName)) {//用户名为空 aUseName.setError("用户名不能为空"); return; } //限制用户名长度在3-10位 if(UserName.length()>10||UserName.length()<3){ aUseName.setError("请输入3-10位数用户名"); return; }else { isTip1=true; } //限制输入密码长度在6-10位 if(PassWord.length()>10||PassWord.length()<6){ aPassWord.setError("请输入6-10位数密码"); return; }else { isTip2=true; } //限制昵称长度 if(Name.length()>7){ aPassWord.setError("请输入7位数以内昵称"); return; } //判断确认密码是否和密码相等 if (PassWord.equals(RpassWord)) {//确认密码和密码相等 isTip3=true; }else { //确认密码和密码不相等 aRpassWord.setError("两次输入密码不相等"); return; } //判断电子邮箱是否为空 if (TextUtils.isEmpty(Email)) {//电子邮箱为空 aEmail.setError("电子邮箱不能为空"); return; } //判断电子邮箱格式 if(Email.matches("[a-zA-Z0-9._-]+@[a-z0-9]+.[a-z]+")){ isTip4=true; }else{ aEmail.setError("电子邮箱格式不正确"); return; } if(isTip1==true&&isTip2==true&&isTip3==true&&isTip4==true) { Message m = handler.obtainMessage();//获取事件 Bundle b = new Bundle(); b.putString("Usename", UserName); b.putString("Name", Name);//以键值对形式放进 Bundle中 b.putString("Password", PassWord); b.putString("Email", Email); m.setData(b); m.what = 0; handler.sendMessage(m); } } }); } class WorkThread extends Thread{ @Override public void run(){ Looper.prepare(); handler = new Handler() { @Override public void handleMessage(Message m) { super.handleMessage(m); Bundle b = m.getData();//得到与信息对用的Bundle String Usename = b.getString("Usename");//根据键取值 String Name = b.getString("Name"); String Password = b.getString("Password");//根据键取值 String Email = b.getString("Email"); DBUtil db = new DBUtil();//调用数据库查询类 String ret = db.QuerySQL(Usename,Name,Password,Email);//得到返回值 if (ret.equals("1"))//为1,页面跳转,登陆成功 { Toast.makeText(SignActivity.this, "注册成功", Toast.LENGTH_SHORT).show(); } Toast.makeText(SignActivity.this, "注册失败", Toast.LENGTH_SHORT).show(); } }; Looper.loop();//Looper循环,通道中有数据执行,无数据堵塞 } } private void intView(){ aUseName =(TextView)findViewById(R.id.ausename); aName=(TextView)findViewById(R.id.aname); aPassWord=(TextView)findViewById(R.id.apassword); aRpassWord=(TextView)findViewById(R.id.arpassword); aEmail=(TextView)findViewById(R.id.aemail); bSign= findViewById(R.id.bsign); } }
java GUI获取电子秤数据不完整问题
获取电子秤的数据如下: ``` +53.1 8 g +53.1 8 g +53.1 8 g +53.1 8 g ``` 确实应该获取的数据是53.08g,但是不知道为什么一个数据是分成两部分返回的 代码如下: /** * 从串口读取数据 * @param serialPort 当前已建立连接的SerialPort对象 * @return 读取到的数据 * @throws ReadDataFromSerialPortFailure 从串口读取数据时出错 * @throws SerialPortInputStreamCloseFailure 关闭串口对象输入流出错 */ public static byte[] readFromPort(SerialPort serialPort) throws ReadDataFromSerialPortFailure, SerialPortInputStreamCloseFailure { InputStream in = null; byte[] bytes = null; try { in = serialPort.getInputStream();//取入数据 int bufflenth = in.available(); //获取buffer里的数据长度 while (bufflenth != 0) { bytes = new byte[bufflenth]; //初始化byte数组为buffer中数据的长度 in.read(bytes); bufflenth = in.available(); } } catch (IOException e) { throw new ReadDataFromSerialPortFailure(); } finally { try { if (in != null) { in.close(); in = null; } } catch(IOException e) { throw new SerialPortInputStreamCloseFailure(); } } return bytes; } /** * 以内部类形式创建一个串口监听类 * @author zhong * */ private class SerialListener implements SerialPortEventListener { /** * 处理监控到的串口事件 */ public void serialEvent(SerialPortEvent serialPortEvent) { switch (serialPortEvent.getEventType()) { case SerialPortEvent.BI: // 10 通讯中断 JOptionPane.showMessageDialog(null, "与串口设备通讯中断", "错误", JOptionPane.INFORMATION_MESSAGE); break; case SerialPortEvent.OE: // 7 溢位(溢出)错误 case SerialPortEvent.FE: // 9 帧错误 case SerialPortEvent.PE: // 8 奇偶校验错误 case SerialPortEvent.CD: // 6 载波检测 case SerialPortEvent.CTS: // 3 清除待发送数据 case SerialPortEvent.DSR: // 4 待发送数据准备好了 case SerialPortEvent.RI: // 5 振铃指示 case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2 输出缓冲区已清空 break; case SerialPortEvent.DATA_AVAILABLE: // 1 串口存在可用数据 byte[] data = null; try { if (serialPort == null) {//判断串口对象是否为空 JOptionPane.showMessageDialog(null, "串口对象为空!监听失败!", "错误", JOptionPane.INFORMATION_MESSAGE); }else { data = SerialTool.readFromPort(serialPort); //读取数据,存入字节数组 System.out.println(new String(data)); //自定义解析过程 if (data != null && data.length > 1) { //检查数据是否读取正确 try { weight.setText(new String(data) + " g"); } catch (ArrayIndexOutOfBoundsException e) { JOptionPane.showMessageDialog(null, "数据解析过程出错,更新界面数据失败!请检查设备或程序!", "错误", JOptionPane.INFORMATION_MESSAGE); System.exit(0); } }else { JOptionPane.showMessageDialog(null, "读取数据过程中未获取到有效数据!请检查设备或程序!", "错误", JOptionPane.INFORMATION_MESSAGE); System.exit(0); } } } catch (ReadDataFromSerialPortFailure | SerialPortInputStreamCloseFailure e) { JOptionPane.showMessageDialog(null, e, "错误", JOptionPane.INFORMATION_MESSAGE); System.exit(0); //发生读取错误时显示错误信息后退出系统 } break; } } } 请知道的朋友说一下问题出现在哪里
推荐 130 个令你眼前一亮的网站,总有一个用得着
总结了大学生活两年来,发现的 130 余个黑科技网站,总有一个会让你眼前一亮,赶紧收藏!
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
我在支付宝花了1分钟,查到了女朋友的开房记录!
在大数据时代下,不管你做什么都会留下蛛丝马迹,只要学会把各种软件运用到极致,捉奸简直轻而易举。今天就来给大家分享一下,什么叫大数据抓出轨。据史料证明,马爸爸年轻时曾被...
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
20道你必须要背会的微服务面试题,面试一定会被问到
写在前面: 在学习springcloud之前大家一定要先了解下,常见的面试题有那块,然后我们带着问题去学习这个微服务技术,那么就会更加理解springcloud技术。如果你已经学了springcloud,那么在准备面试的时候,一定要看看看这些面试题。 文章目录1、什么是微服务?2、微服务之间是如何通讯的?3、springcloud 与dubbo有哪些区别?4、请谈谈对SpringBoot 和S...
讲真,这两个IDE插件,可以让你写出质量杠杠的代码
周末躺在床上看《拯救大兵瑞恩》 周末在闲逛的时候,发现了两个优秀的 IDE 插件,据说可以提高代码的质量,我就安装了一下,试了试以后发现,确实很不错,就推荐给大家。 01、Alibaba Java 代码规范插件 《阿里巴巴 Java 开发手册》,相信大家都不会感到陌生,其 IDEA 插件的下载次数据说达到了 80 万次,我今天又贡献了一次。嘿嘿。 该项目的插件地址: https://github....
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
2020 年,大火的 Python 和 JavaScript 是否会被取而代之?
Python 和 JavaScript 是目前最火的两大编程语言,但是2020 年,什么编程语言将会取而代之呢? 作者 |Richard Kenneth Eng 译者 |明明如月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 以下为译文: Python 和 JavaScript 是目前最火的两大编程语言。然而,他们不可能永远屹立不倒。最终,必将像其他编程语言一...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
Flutter 会不会被苹果限制其发展?
这个可能性是存在的,而且不止是 flutter、react-native 、weex 、uni-app 、taro 、Hippy等都存在这个风险,虽然有些框架对比起 flutter 其他框架存在时间稍长,但是这不可否认它们一直都存在这个风向。 只要不是平台自己的亲儿子,那么肯定存在被限制发展的风险,所以这件事上是风险和收益之间的博弈,这是一个“后妈和前任之间的太极。” 先说现状 如今各大平台,如:...
Idea 中最常用的10款插件(提高开发效率),一定要学会使用!
学习使用一些插件,可以提高开发效率。对于我们开发人员很有帮助。这篇博客介绍了开发中使用的插件。
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
最全最强!世界大学计算机专业排名总结!
我正在参与CSDN200进20,希望得到您的支持,扫码续投票5次。感谢您! (为表示感谢,您投票后私信我,我把我总结的人工智能手推笔记和思维导图发送给您,感谢!) 目录 泰晤士高等教育世界大学排名 QS 世界大学排名 US News 世界大学排名 世界大学学术排名(Academic Ranking of World Universities) 泰晤士高等教育世界大学排名 中国共...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
蘑菇街技术部的年会,别开生面,一样全是美女。
Linux必懂知识大总结(补)
关机 1. 数据同步写入磁盘 sync 为了加快对磁盘上文件的读写速度,位于内存中的文件数据不会立即同步到磁盘上,因此关机之前需要先进行 sync 同步操作。 2. shutdown # /sbin/shutdown [-krhc] [时间] [警告讯息] -k : 不会关机,只是发送警告讯息,通知所有在线的用户 -r : 将系统的服务停掉后就重新启动 -h : 将系统的服务停掉后就...
那个在阿里养猪的工程师,5年了……
简介: 在阿里,走过1825天,没有趴下,依旧斗志满满,被称为“五年陈”。他们会被授予一枚戒指,过程就叫做“授戒仪式”。今天,咱们听听阿里的那些“五年陈”们的故事。 下一个五年,猪圈见! 我就是那个在养猪场里敲代码的工程师,一年多前我和20位工程师去了四川的猪场,出发前总架构师慷慨激昂的说:同学们,中国的养猪产业将因为我们而改变。但到了猪场,发现根本不是那么回事:要个WIFI,没有;...
为什么程序猿都不愿意去外包?
分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助
Java校招入职华为,半年后我跑路了
何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...
世界上有哪些代码量很少,但很牛逼很经典的算法或项目案例?
点击上方蓝字设为星标下面开始今天的学习~今天分享四个代码量很少,但很牛逼很经典的算法或项目案例。1、no code 项目地址:https://github.com/kelseyhight...
Python全栈 Linux基础之3.Linux常用命令
Linux对文件(包括目录)有很多常用命令,可以加快开发效率:ls是列出当前目录下的文件列表,选项有-a、-l、-h,还可以使用通配符;c功能是跳转目录,可以使用相对路径和绝对路径;mkdir命令创建一个新的目录,有-p选项,rm删除文件或目录,有-f、-r选项;cp用于复制文件,有-i、-r选项,tree命令可以将目录结构显示出来(树状显示),有-d选项,mv用来移动文件/目录,有-i选项;cat查看文件内容,more分屏显示文件内容,grep搜索内容;>、>>将执行结果重定向到一个文件;|用于管道输出。
​两年前不知如何编写代码的我,现在是一名人工智能工程师
全文共3526字,预计学习时长11分钟 图源:Unsplash 经常有小伙伴私信给小芯,我没有编程基础,不会写代码,如何进入AI行业呢?还能赶上AI浪潮吗? 任何时候努力都不算晚。 下面,小芯就给大家讲一个朋友的真实故事,希望能给那些处于迷茫与徘徊中的小伙伴们一丝启发。(下文以第一人称叙述) 图源:Unsplash 正如Elsa所说,职业转换是...
强烈推荐10本程序员必读的书
很遗憾,这个春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终将会...
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。
立即提问