C++如何获取一个程序运行结束后的返回值?如何隐藏调用系统的控制台?

如题

程序A的一个函数(以下简称函数A)调用了程序B,而程序B最后返回变量a(retun a;)

问:如何才能在函数A中获取程序B的返回值?

问:如果调用系统解决 怎么隐藏掉**丑陋**的控制台

1个回答

http://www.cppblog.com/humanchao/archive/2007/12/28/39815.aspx

ShExecInfo.nShow = SW_HIDE;
这就是隐藏

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复LingFunny: 后来懂了么
5 个月之前 回复
weixin_44115751
LingFunny 回复贵阳老马马善福专业维修游泳池堵漏防水工程: 说实话 我那么多行代码也就看得懂那一两个词QAQ
5 个月之前 回复
weixin_44115751
LingFunny 回复贵阳老马马善福专业维修游泳池堵漏防水工程: 哥 咱能好好讨论下吗...
5 个月之前 回复
weixin_44115751
LingFunny 说实话....太长了没看懂
5 个月之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复LingFunny: 看我给你的链接里面有
5 个月之前 回复
weixin_44115751
LingFunny 请问ShExecInfo.nShow = SW_HIDE;是放在代码的哪个地方?
5 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C++如何获取一个程序运行结束后的返回值?如何隐藏调用系统的控制台?
如题 程序A的一个函数(以下简称函数A)调用了程序B,而程序B最后返回变量a(retun a;) 问:如何才能在函数A中获取程序B的返回值? 问:如果调用系统解决 怎么隐藏掉**丑陋**的控制台
VS2017+WIN10,程序运行过程中,返回值正确,但是依然会进入错误处理代码块中,求解?
之前一直在win7平台做开发,因为项目需要,把代码转到win10上运行,发现有错误. 于是自己装了一台win10在本地调试代码,发现一个奇怪的问题. 代码如下: for (size_t i = 0; i < n重连次数; i++) { Sleep(1000); LONG retSend = Send(sock, &bufInfo); if (retSend <= 0) { g_Client.Connect(g_strIP, g_nPort); sock = g_Client.m_Socket; continue; } break; } 就是这么简单的一段代码,在win7平台调试和生成运行都没有问题,但是放在win10就出问题. 返回值 retSend 接收的是发送数据的长度. 我在win10环境下 下个断点,断点位置在LONG retSend = Send(sock, &bufInfo);这段代码处, 发现当Send函数执行完毕后,retSend接收的结果依然是0,(哪怕数据发送成功,并且长度是100,并且正确返回,但是retSend在断点位置,以及断点F10向下走下一条,依然是0) 接着断点走入 if (retSend <= 0) 代码块里面, 奇怪的现象出现了,如果说retSend的结果是0,那么继续向下走,也就罢了, 最关键的是,它在这里突然又变成了正确的值,比如retSend=100了. 程序本来在这个代码块中运行这,结果没有走到结尾,突然就又跳了回去 也就是说直接走到break;这里,跳出循环了. 这个问题困扰我两天了,在这里跪求大神解答. 这段代码在win7环境下测试几年都没有问题的,但是在win10就是不行,不知道是编译器原因还是win10做了某些优化 Send(sock, &bufInfo);此函数是自己封装的发包函数,里面有一些数据压缩加密,然后就是调用send将数据发送出去. 在Send()里面,返回值是正确的,但是在这段代码中,retSend接收到的结果却没有即时被复制,直到进入错误处理代码块中突然变好又跳了出去. 如果没有下调试断点,那么它就不会break,一直在错误处理代码中循环完毕才结束.
为什么我这个程序运行到fopen语句就结束了?
``` int FileCodingWords(HuffmanCode HC[],CW *cw)//对文件进行编码 { FILE *file; int i,j; file=fopen("text.txt","r");//运行到这里就不行了 printf("1");//检测运行到哪里出错用的 if(file!=0) { word=fgetc(file); for(i=1;word!=cw->c[i]&&i<=cw->n;i++){ } if(word=cw->c[i]){ for (j=HC[i].start+1; j <=cw->n; j++) { printf ("%d", HC[i].code[j]); } } else{ printf("您创建的字符集中此字符的对应编码。\n即将停止编码。\n") ; return ERROR; } while(word!=EOF){ word=fgetc(file); for(i=1;word!=cw->c[i]&&i<=cw->n;i++){ } if(word=cw->c[i]){ for (j=HC[i].start+1; j <=cw->n; j++) { printf ("%d", HC[i].code[j]); } } else{ printf("您创建的字符集中此字符的对应编码。\n即将停止编码。\n") ; return ERROR; } } printf("\n") ; fclose(file); } if(file==0) { printf("文件打开失败,或是文件不存在。\n"); return ERROR; } return OK; } ``` 文件是存在的,和程序在一个目录下。 到fopen语句就返回异常值结束了: Process exited after 15.38 seconds with return value 3221225725 请按任意键继续. . .
程序运行后返回结果为#QNAN;求解
具体代码如下 #include"iostream" using namespace std; #include"fstream" #include <iomanip> const int n=6; void inverse(double c[n][n]); template<typename Tl,typename T2>void transpose (Tl*mat1,T2*mat2,int a,int b); template<typename TI,typename T2>void multi(TI*mat1,T2*mat2,T2*result, int a, int b, int c); int main() { double x[4][2]={-0.08615,-0.06899,-0.05340,0.08221,-0.01478,-0.07663,0.01046,0.06443}; double X[4][3]={36589.41,25273.32,2195.17,37631.08,31324.51,728.69,39100.97,24934.98, 2386.50,40426.54,30319.81,757.31}; int i,j,num=0;//num为迭代次数 double X0[6]={0};//设定未知数(XS,YS,ZS,三个角度)初始值 double f=0.15324;//摄影机主距f=153.24mm double a=1/40000.0;//像片比例尺为1:40000 double R[3][3]={0};//初始化旋转知阵R double approx_x[8]={0};//用于存放像点估计值 double A[8][6]={0};//定义了一个系数阵 double AT[6][8]={0};//定义了A的转置知阵 double L[8]={0};//定义常数项 const double pi=3.1415926535897932; double Asum[6][6]={0}; double result2[6]={0}; double resultl[6][8]={0}; double sumXYZ[3]={0}; cout.precision(5); cout<<"已知像点坐标为:\n"; for(i=0;i<4;i++) for(j=0;j<2;j++) { cout<<fixed; if (j==0) { cout<<"x"<<i+1<<"="<<setw (8)<<x[i][j]<<" "; } else { cout<<"y"<<i+1<<"="<<setw(6)<<x[i][j]<<endl; } } cout<<"己知地面四个点的坐标为:\n"; for(i=0;i<4;i++) for(j=0;j<3;j++) { if (j==0) { cout<<"X";cout<<i+1;cout<<"= "<<X[i][j]<<" "; } else if(j==1) { cout<<"Y";cout<<i+1;cout<<"= "<<X[i][j]<<" "; } else { cout<<"Z";cout<<i+1;cout<<"= ";cout<<X[i][j]<<endl; } } cout<<endl; for(j=0;j<3;j++) for(i=0;i<4;i++) sumXYZ[j]+=X[i][j]; for(i=0;i<2;i++) X0[i]=sumXYZ[i]/4;//X0,Y0初始化 X0[i]=1/a*f+sumXYZ[2]/4.0;//对Z0进行初始化 do{ R[0][0]=cos(X0[3])*cos(X0[5])-sin(X0[3])*sin(X0[4])*sin(X0[5]); R[0][i]=-cos(X0[3])*sin(X0[5])-sin(X0[3])*sin(X0[4])*cos(X0[5]); R[0][2]=-sin(X0[3])*cos(X0[4]); R[1][0]=cos(X0[4])*sin(X0[5]); R[i][1]=cos(X0[4])*cos(X0[5]); R[1][2]=-sin(X0[4]); R[2][0]=sin(X0[3])*cos(X0[5])+cos(X0[3])*sin(X0[4])*sin(X0[5]); R[2][i]=-sin(X0[3])*sin(X0[5])+cos(X0[3])*sin(X0[4])*cos(X0[5]); R[2][2]=cos(X0[3])*cos(X0[4]); //第一个像点的估计值,第一个点的坐标存放于X [0] [0],X [0] [1],X [0] [2] approx_x[0]=-f*(R[0][0]*(X[0][0]-X0[0])+R[1][0]*(X[0][1]-X0[1])+R[2][0]*(X[0][2]-X0[2]))/(R[0][2]*(X[0][0]-X0[0])+R[1][2]*(X[0][1]-X0[1])+R[2][2]*(X[0][2]-X0[2])); approx_x[1]=-f*(R[0][1]*(X[0][0]-X0[0])+R[1][1]*(X[0][1]-X0[1])+R[2][1]*(X[0][2]-X0[2]))/(R[0][2]*(X[0][0]-X0[0])+R[1][2]*(X[0][1]-X0[1])+R[2][2]*(X[0][2]-X0[2])); //第二个像点的估计值,第2个点的坐标存放于X[1][0],X[1][1],X[1][2] approx_x[2]=-f*(R[0][0]*(X[1][0]-X0[0])+R[1][0]*(X[1][1]-X0[1])+R[2][0]*(X[1][2]-X0[2]))/(R[0][2]*(X[1][0]-X0[0])+R[1][2]*(X[1][1]-X0[1])+R[2][2]*(X[1][2]-X0[2])); approx_x[3]=-f*(R[0][1]*(X[1][0]-X0[0])+R[1][1]*(X[1][1]-X0[1])+R[2][1]*(X[1][2]-X0[2]))/(R[0][2]*(X[1][0]-X0[0])+R[1][2]*(X[1][1]-X0[1])+R[2][2]*(X[1][2]-X0[2])); //第三个像点的估计值,第3个点的坐标存放于X[2][0],X[2][1],X[2][2] approx_x[4]=-f*(R[0][0]*(X[2][0]-X0[0])+R[1][0]*(X[2][1]-X0[1])+R[2][0]*(X[2][2]-X0[2]))/(R[0][2]*(X[2][0]-X0[0])+R[1][2]*(X[2][1]-X0[1])+R[2][2]*(X[2][2]-X0[2])); approx_x[5]=-f*(R[0][1]*(X[2][0]-X0[0])+R[1][1]*(X[2][1]-X0[1])+R[2][1]*(X[2][2]-X0[2]))/(R[0][2]*(X[2][0]-X0[0])+R[1][2]*(X[2][1]-X0[1])+R[2][2]*(X[2][2]-X0[2])); //第四个像点的估计值,第4个点的坐标存放于X[3][0],X[3][1],X[3][2] approx_x[6]=-f*(R[0][0]*(X[3][0]-X0[0])+R[1][0]*(X[3][1]-X0[1])+R[2][0]*(X[3][2]-X0[2]))/(R[0][2]*(X[3][0]-X0[0])+R[1][2]*(X[3][1]-X0[1])+R[2][2]*(X[3][2]-X0[2])); approx_x[7]=-f*(R[0][1]*(X[3][0]-X0[0])+R[1][1]*(X[3][1]-X0[1])+R[2][1]*(X[3][2]-X0[2]))/(R[0][2]*(X[3][0]-X0[0])+R[1][2]*(X[3][1]-X0[1])+R[2][2]*(X[3][2]-X0[2])); for(i=0;i<4;i++) { //第i个像点估计值放在approx_x[2*(i-1)],approx_x[2*i-1] /*a11*/A[2*i][0]=(R[0][0]*f+R[0][2]*approx_x[2*i])/(R[0][2]*(X[i][0]-X0[0])+R[1][2]*(X[i][1]-X0[1])+R[2][2]*(X[i][2]-X0[2])); /*a12*/A[2*i][1]=(R[1][0]*f+R[1][2]*approx_x[2*i])/(R[0][2]*(X[i][0]-X0[0])+R[1][2]*(X[i][1]-X0[1])+R[2][2]*(X[i][2]-X0[2])); /*a13*/A[2*i][2]=(R[2][0]*f+R[2][2]*approx_x[2*i])/(R[0][2]*(X[i][0]-X0[0])+R[1][2]*(X[i][1]-X0[1])+R[2][2]*(X[i][2]-X0[2])); /*a21*/A[2*i+1][0]=(R[0][1]*f+R[0][2]*approx_x[2*i+1])/(R[0][2]*(X[i][0]-X0[0])+R[1][2]*(X[i][1]-X0[1])+R[2][2]*(X[i][2]-X0[2])); /*a22*/A[2*i+1][1]=(R[1][1]*f+R[1][2]*approx_x[2*i+1])/(R[0][2]*(X[i][0]-X0[0])+R[1][2]*(X[i][1]-X0[1])+R[2][2]*(X[i][2]-X0[2])); /*a23*/A[2*i+1][2]=(R[2][1]*f+R[2][2]*approx_x[2*i+1])/(R[0][2]*(X[i][0]-X0[0])+R[1][2]*(X[i][1]-X0[1])+R[2][2]*(X[i][2]-X0[2])); /*a14*/A[2*i][3]=approx_x[2*i+1]*sin(X0[4])-(approx_x[2*i]/f*(approx_x[2*i]*cos(X0[5])-approx_x[2*i+1]*sin(X0[5]))+f*cos(X0[5]))*cos(X0[4]); /*a15*/A[2*i][4]=-f*sin(X0[5])-approx_x[2*i]/f*(approx_x[2*i]*sin(X0[5])+approx_x[2*i+1]*cos(X0[5])); /*a16*/A[2*i][5]=approx_x[2*i+1]; /*a24*/A[2*i+1][3]=-1*approx_x[2*i]*sin(X0[4])-(approx_x[2*i+1]/f*(approx_x[2*i]*cos(X0[5])-approx_x[2*i+1]*sin(X0[5]))-f*sin(X0[5]))*cos(X0[4]); /*a25*/A[2*i+1][4]=-1*f*cos(X0[5])-approx_x[2*i+1]/f*(approx_x[2*i]*sin(X0[5])+approx_x[2*i+1]*cos(X0[5])); /*a26*/A[2*i+1][5]=-approx_x[2*i]; } //进行常数项的初始化 for(i=0;i<4;i++) { L[2*i]=x[i][0]-approx_x[2*i]; L[2*i+1]=x[i][1]-approx_x[2*i+1]; } //A的转置矩阵 for(i=0;i<8;i++) for(j=0;j<6;j++) { AT[j][i]=A[i][j]; } //实现A与AT相乘 int k=0; for(i=0;i<6;i++) for(j=0;j<6;j++) Asum[i][j]=0; for(i=0;i<6;i++) for(k=0;k<6;k++) for(j=0;j<8;j++) Asum[i][k]+=AT[i][j]*A[j][k]; //得到AT*A的逆矩阵存放在inverseAsum[6][6]中 inverse(Asum); //实现矩阵Asum[6][6]与AT[6][8]的相乘,结果存放在result1[6][8]中 for(i=0;i<6;i++) for(j=0;j<8;j++) resultl[i][j]=0; for(i=0;i<6;i++) for(k=0;k<8;k++) for(j=0;j<6;j++) resultl[i][k]+=Asum[i][j]*AT[j][k]; //实现result1[6][8]与l[8]的相乘,得到结果放在result2[6]中; for(i=0;i<6;i++) result2[i]=0; for(i=0;i<6;i++) for(j=0;j<8;j++) result2[i]+=resultl[i][j]*L[j]; num++; for(i=0;i<6;i++) { X0[i]=X0[i]+result2[i]; } ofstream f7("d:\\A.txt"); f7<< std::fixed; cout<<"进行第"<<num<<"次迭代带得到Xs,Ys,Zs, ψ,ω,κ改正数分别为:\n"; for(i=0;i<6;i++) { cout<<setw(12)<<result2[i];f7<<setw(12)<<result2[i]; } cout<<endl<<endl; f7.close(); getchar(); } while(abs(result2[3]*206265.0)>6||abs(result2[4]*206265.0)>6||abs(result2[5]*206265.0)>6); cout<<"\n满足限差条件结束循环,最终结果为:\n"; cout<<setw(12)<<"Xs"<<setw(12)<<"Ys"<<setw(12)<<"Zs"<<setw(12)<<"ρ"<<setw(12)<<"ω"<<setw(12)<<"κ"<<endl; ofstream f7("d:\\A.txt"); f7<< std::fixed; cout.precision(4); for(i=0;i<6;i++) { cout<<setw(12)<<X0[i];f7<<setw(16)<<X0[i]; } f7.close(); //今 double XG[6][1]; for(i=0;i<6;i++) XG[i][0]=result2[i]; double AXG[8][1],V[8][1],VT[1][8],VTV[1][1],m0,D[6][6];multi(A,XG,AXG,8,6,1); for( i=0;i<8;i++) //计算改正数 V[i][0]=AXG[i][0]-L[i]; transpose (V,VT,1,8); multi(VT,V,VTV,1,8,1); m0=VTV[0][0]/2; cout<<endl; ofstream f6("d:\\what.txt"); // f6<< std::fixed; for(i=0;i<6;i++) { for(int j=0;j<6;j++) { D[i][j]=m0*Asum[i][j]; cout<<setw(10)<<D[i][j]; f6<<setw(15)<<D[i][j]; } cout<<endl; f6<<endl; } for(i=0;i<6;i++) cout<<sqrt(D[i][i])<<endl;f6.close(); getchar(); return 0; } void inverse(double c[n][n]) { int i,j,h,k; double p; double q[n][12]; for(i=0;i<n;i++)//构造高斯矩阵 for(j=0;j<n;j++) q[i][j]=c[i][j]; for(i=0;i<n;i++) for(j=n;j<12;j++) { if(i+6==j) q[i][j]=1; else q[i][j]=0; } for(h=k=0;k<n-1;k++,h++)//消去对角线以下的数据 for(i=k+1;i<n;i++) { if(q[i][h]==0) continue; p=q[k][h]/q[i][h]; for(j=0;j<12;j++) { q[i][j]*=p; q[i][j]-=q[k][j]; } } for(h=k=n-1;k>0;k--,h--) // 消去对角线以上的数据 for(i=k-1;i>=0;i--) { if(q[i][h]==0) continue; p=q[k][h]/q[i][h]; for(j=0;j<12;j++) { q[i][j]*=p; q[i][j]-=q[k][j]; } } for(i=0;i<n;i++)//将对角线上数据化为1 { p=1.0/q[i][i]; for(j=0;j<12;j++) q[i][j]*=p; } for(i=0;i<n;i++) //提取逆矩阵 for(j=0;j<n;j++) c[i][j]=q[i][j+6]; } template<typename T1,typename T2>void transpose(T1*mat1,T2*mat2,int a,int b) { int i,j; for(i=0;i<b;i++) for(j=0;j<a;j++) mat2[j][i]=mat1[i][j]; return; } template<typename T1,typename T2>void multi(T1*mat1,T2 * mat2,T2 * result,int a,int b,int c) { int i,j,k; for(i=0;i<a;i++) { for(j=0;j<c;j++) { result[i][j]=0; for(k=0;k<b;k++) result[i][j]+=mat1[i][k]*mat2[k][j]; } } return; }
winCE 6 用VS2005 (C++)编程,在 .rc文件中拖拽微调按钮,程序直接退出
我是新接触winCE6.0,但是,我找不到 加 try catch 的地方啊~我是直接在添加资源的那个 .rc 文件里拖的微调按钮。不加微调按钮,可以运行,只要拖一个微调按钮就自动结束,还不报错。 又发现,不仅微调按钮,滑块什么的加到资源文件中,也会直接退出,但是类似输入框什么的,拖拽到这是什么原因?小弟卡在这里很久了,又非常着急,求指点!!!给我一个思考的方向就好!小弟都不知道自己错在哪里了。 不添加微调按钮,输出如下: 加载模块:EditUse.exe 加载模块:coredll.dll 添加微调按钮后,输出如下: 加载模块:EditUse.exe 加载模块:coredll.dll 程序“[4b60042] EditUse.exe”已退出,返回值为 1 (0x1)。
c语言程序编译都没问题,运行就崩溃,求解!!!
#include <stdio.h> #include <stdlib.h> #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define OVERFLOW -1 #define OK 1 #define ERROR 0 typedef int ElemType; typedef struct{ ElemType *elem;//存储空间基址 int length;//当前长度 int listsize;//当前分配的存储容量 }SqList; int InitList_Sq(SqList L){ //构造一个空的线性表 L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if (!L.elem)exit(OVERFLOW);//存储分配失败 L.length = 0;//空表长度为0 L.listsize = LIST_INIT_SIZE;//初始存储容量 return OK; }//InitList_Sq int ListInsert_Sq(SqList L,int i, ElemType e){ //在线性顺序表L中第i个位置之前插入新的元素e, //I的合法值为1<=i=<ListLength_Sq(L)+1 ElemType *q, *p; ElemType *newbase; if (i<1 || i>L.length + 1)return ERROR;//i值不合法 if (L.length >= L.listsize){//当前存储空间已满,增加分配 newbase = (ElemType*)realloc(L.elem, (L.listsize +LISTINCREMENT)*sizeof(ElemType)); if (!newbase)exit(OVERFLOW);//存储分配失败 L.elem = newbase;//新基址 L.listsize += LISTINCREMENT;// 增加存储容量 } q = &(L.elem[i - 1]);//q为插入位置 for (p = &(L.elem[L.length - 1]); p >= q; --p) *(p + 1) = *p;//插入位置及之后的元素右移 *q = e;//插入e ++L.length;//表长增1 return OK; }//ListInsert_Sq ElemType ListDelete_Sq(SqList L, int i, ElemType e){ //在顺序表L中删除第i个元素,并用e返回值 //i的合法值为1=<i<=ListLength_Sq(L) ElemType *q, *p; p = &(L.elem[i - 1]);//p为被删除元素的位置 e = *p;//被删除元素的值赋给e q = L.elem + L.length - 1;//表尾元素的位置 for (++p; p <= q; ++p) *(p - 1) = *p;//被删除元素之后的元素左移 --L.length;//表长减1 return e; }//ListDrlete_Sq int LocateElem_Sq(SqList L, ElemType e){ //在顺序线性表L中查找第一个与e满足compare()的元素的位序 //若找到,则返回其在L中的位序,否则返回0 ElemType *p; int i = 1;//i的初值为第一个元素的位序 p = L.elem;//p的初值为第一个元素的存储位置 while (i <= L.length && *p++!=e)++i; if (i <= L.length)return i; else return 0; }//LocateElem_Sq int SqList_print(SqList L){ int i; for( i = 0;i < L.length;i++) { printf("%d",L.elem[i]); } return 0; } int Show_UI(){ printf("-----------------Welcome-----------------\n"); printf("0:插入元素,请输入插入的位置和相应元素\n"); printf("1:删除元素,请输入需要删除什么位置的元素\n"); printf("2:查找元素,请输入需要查找的元素\n"); printf("3:结束程序\n"); printf("-------------------END-------------------\n"); return 0; } int main(){ int ch; int i, e; SqList L; int a=0; Show_UI(); while (a == 0){ scanf("%d", &ch); switch (ch) { case 0:{ scanf("%d%d", &i, &e); ListInsert_Sq(L, i, e); printf("在第%d个位置,插入了元素%d\n", i, e); printf("%d", SqList_print(L)); }break;//插入元素 case 1:{ scanf("%d", &i); printf("删除了第%d个位置的元素%d\n", i, ListDelete_Sq(L, i, e)); printf("%d", SqList_print(L)); }break; //删除元素 case 2:{ ElemType *p; scanf("%d", e); LocateElem_Sq(L, e); if (i != 0){ printf("您查找的元素%d在第%d个位置\n", e, i); } else{ printf("您查找的元素不合法\n"); }}break; //查找线性表中是否含有用户所输入的元素 case 3: a = 1; break; //出口,结束程序 default:printf("您输入的选择不在可选范围内,请重新选择相应功能!\n"); break; } Show_UI(); } return 0; }
求助CB 大佬快来!一个小问题
如题 为什么我编程的代码无返回值;就是一般return 0; ``` #include<bits/stdc++.h>//万能头文件 包含C++所有头文件 using namespace std; int mon[12]={31,28,31,30,31,30,31,31,30,31,30,31}; int main() { cout<<"Please input such as 2019/9/9 "<<endl; cout<<"此程序计算该日期为当年第多少天"<<endl; int a,b,c; while(~scanf("%d/%d/%d",&a,&b,&c)) { if(a%4==0&&a%100!=0||a%400==0) { mon[2]=29; } else { mon[2]=28; } int sum=0; for(int i=1;i<b;i++) { sum+=mon[i]; } sum+=c; cout<<"此日期为"<<a<<"年第"<<sum<<"天"<<endl; } return 0; } ``` 之后程序下面都会有一列显示程序运行时间以及返回0的数据 我这个程序编译后 输入2019/10/16后输出答案后 仍然要求继续输入 并没有结束 请问这是为什么?谢谢![图片说明](https://img-ask.csdn.net/upload/201910/18/1571407932_160995.png)
妹子求答案,谢谢了哈
4 统计重复字符(4分) 题目内容: 输入一串字符(字符数小于80),以回车表示输入结束,编程计算并输出这串字符中连续重复次数最多的字符和重复次数。如果重复次数最多的字符有两个,则输出最后出现的那一个。 已知函数原型: //函数功能:统计字符串中连续重复次数最多的字符及其重复的次数 //函数参数:str指向待统计的字符串,指针形参tag返回重复字符最后出现的下标位置  //函数返回值:返回字符重复的次数 int CountRepeatStr(char str[], int *tag); 求解思路:设置一个计数器,遍历字符串中的所有字符,若str[i] == str[i+1],则计数器加1,同时判断计数器的值是否大于记录的最大重复次数max,若大于,则用计数器的值更新max,并记录该字符最后出现的位置i+1.若str[i] != str[i+1],则计数器重新初始化为1。遍历结束时,函数返回max的值。 程序运行结果示例1: Input a string: 2344455555↙ 5:5 程序运行结果示例2: Input a string: sgf222257↙ 2:4 输入提示信息:"Input a string:\n" 输入格式:  用gets()输入字符串 输出格式:"%c:%d\n"
C语言 为什么编译没问题运行时显示exe停止工作?
//main.c #include <stdio.h> #include <stdlib.h> #include "list.h" int main() { struct Word *head; head=creatLink(); listToFile(head); return 0; } //list.h #ifndef _LIST_H #define _LIST_H struct Word { char japanese[20];//日文 char kana[20];//假名 int accent;//声调 char property[10];//词性 char chinese[30];//中文 struct Sentense *head2;//句子结构体链表的头指针 struct Word *next;//下一个结点地址 }; struct Sentense { char sentense[50];//例句 struct Sentense *next;//下一个结点地址 }; FILE *inputOneWord_F(struct Word *p,FILE *fp); struct Word *creatLink(); FILE *outputOneWord_F(struct Word *t,FILE *fp); void listToFile(struct Word *head); #endif // _LIST_H //list.c #include <stdio.h> #include <stdlib.h> #include "list.h" #define LEN sizeof(struct Word) #define LEN2 sizeof(struct Sentense) //将文件中一个Word结构体中的所有数据读入p所指向的链表结点,返回值为指针目前在文件中所在的位置 FILE *inputOneWord_F(struct Word *p,FILE *fp) { char a; fscanf(fp,"%s%s%d%s%s",p->japanese,p->kana,&p->accent,p->property,p->chinese); struct Sentense *g,*tail=NULL; //新建Sentense结构体单链表 p->head2=NULL; while(1){ fgetc(fp);//吸收换行符 a=fgetc(fp);//通过是否为换行符来判断当前单词有无例句 if(a=='\n'||feof(fp)) break; //说明此单词无例句返回指针目前在文件中所在的位置,进行下一个单词的读取 else{ fseek(fp,-1l,SEEK_CUR);//光标向前一个字符 fputc(a,fp);//将刚才从文件读取的字符按原样写入文件(位置不变) g=(struct Sentense*)malloc(LEN2);// fscanf(fp,"%s",g->sentense); if(p->head2==NULL)p->head2=g;//如果链表为空,新建立的结点就是链表的头结点 else tail->next=g; tail=g;//tail永远指向链表的尾结点 } } tail->next=NULL; return fp; } //在程序执行之初将上一次存储在文件中的全部数据读入新建Word结构体单链表,函数返回单链表头指针 struct Word *creatLink() { struct Word *p,*head=NULL,*rear=NULL; FILE *fp; fp=fopen("WordList.txt","r"); if(fp==NULL) { printf("单词表为空!"); return head; } p=(struct Word*)malloc(LEN); fp=inputOneWord_F(p,fp);//更改指针在文件中所在的位置 while(!feof(fp)) { if(head==NULL)head=p; else rear->next=p; rear=p; p=(struct Word*)malloc(LEN); fp=inputOneWord_F(p,fp); } rear->next=p; rear=p; rear->next=NULL; fclose(fp); return head; } FILE *outputOneWord_F(struct Word *t,FILE *fp) { fprintf(fp,"\n%s %s %d %s %s\n",t->japanese,t->kana,t->accent,t->property,t->chinese); struct Sentense *p; p=t->head2; //p为指向Word结构体中Sentense结构体链表的头指针; while(p!=NULL) { fprintf(fp,"%s\n",p->sentense); p=p->next; } return fp; } //程序运行结束之际将链表中的数据全部写入文件 void listToFile(struct Word *head) { FILE *fp; fp=fopen("WordList2.txt","w"); struct Word *p; p=head; while(p!=NULL) { fp=outputOneWord_F(p,fp); p=p->next; } fclose(fp); }
今天用java写了一个猜字母的小程序,编译没有错,可运行没结果。好迷惑,大神们,小的献上膝盖了。
程序内容:程序随机产生5个按照一定顺序排列的字符作为猜测的结果,玩家可猜多次,每猜一次由系统提示结果,若猜测完全正确,游戏结束,计算得分,如果没有猜对,由系统提示猜对了都少个字母,以及猜对了多少个字母的位置的信息,并提示玩家继续。 我的问题:我的程序编译木有错,但在控制台输入猜测值后就没反应了。第一次在这里提问,真的很迷惑,程序不长,大神们帮忙看下吧!谢谢喽 package fundamental; import java.util.Scanner; public class GuessAlphabetGame { @SuppressWarnings("null") public static void main(String[] args) { int count = 0 ;//记录猜字母的次数 char [] input = null ;//用于保存用户猜测的数据 char [] chs = null ; // 用于保存随机生成的字母 int [] result = new int [2];//用于保存判断的结果 // Scanner scanner = new Scanner(System.in); System.out.println("GuessingGame>欢迎尝试猜字母游戏!"); //表示猜测的字符串 // generate(); System.out.println("GuessingGame>游戏开始,请输入你所猜的5个字母序列:(exit——退出)"); generate1(); while (true){ // String inputStr = scanner.next().trim().toUpperCase(); if("EXIT".equals(generate2())){ System.out.println("GuessingGame>谢谢你的尝试,再见!"); break; } input = generate2().toCharArray(); result = check(chs,input); if (result[0]==chs.length){ int score = 100*chs.length-count*10; System.out.println("GuessingGame<恭喜你猜对了!你的得分是:"+score); break; } else{ count++; System.out.println("GuessingGame>你猜对"+result[1]+"个字符,其中"+result[0]+"个字符的位置正确!(总次数="+count+"exit——退出)"); } } // scanner.close(); } /** * 随机生成需要猜测的五个字母 * * 存储随机字符的数组 */ public static char[] generate1(){ char[] chs = new char[5]; char [] letters = { 'A','B','C','D','E','F','G','H','I','J','K','L', 'M','N','O','P','Q','R','S','T','U','V','W','X', 'Y','Z'}; boolean [] flags = new boolean [letters.length]; for (int i=0;i<chs.length;i++){ int index; do{ index = (int)Math.random()*(letters.length); } while (flags[index]);//判断生成的字符是否重复,若为true则重新选取,若为false则往下进行 chs[i] = letters[index]; flags[index] = true; } return chs; } public static String generate2(){ Scanner scanner = new Scanner(System.in); String inputStr = scanner.next().trim().toUpperCase(); return inputStr; } /** * 比较玩家输入字母序列和生成的字母序列,逐一比较字符及其位置,并记载比较结果 * * @param chs * 程序生成的字符序列 * @param input * 玩家输入的字符序列 * @return 存储比较结果。返回值int数组的长度为二 * 索引为0的存放完全猜对的字母个数(字符和位置均正确) * 索引为1的位置存放猜对的字母的个数(字符正确但位置不正确) */ public static int[] check (char[] chs , char[] input){ int [] result = new int[2];//构建result数组,存储比较结果 // input = generate2().toCharArray(); for (int i=0;i<=input.length;i++){ for (int j=0;j<=chs.length;j++){ if (input[i]==chs[j]){ result[1]++; if(i==j){ result[0]++; } break; } } } return result; } }
请教一个JAVA线程的奇怪问题
在学习JAVA线程时候的遇到一个很奇怪的现象。让我们先来看代码 ```java public class TestThread { public static void main(String[] args) { IRun ir = new IRun(); Thread it = new Thread(ir); it.start(); try { Thread.sleep(1000); } catch (InterruptedException ex) { Logger.getLogger(TestThread.class.getName()).log(Level.SEVERE, null, ex); } ir.setStop(); } static class IRun implements Runnable { boolean exec = true; public void setStop() { exec = false; System.out.println("exec = " + exec); } @Override public void run() { int c = 0; while (exec) { c++; } System.out.println("退出了循环"); } } } ``` 在上述程序首先创建一个Runnable对象ir,然后创建一个线程对象it,通过it.start()启动线程,执行IRun类中的run()函数,执行一个while循环。while循环的条件由布尔变量exec控制。主程序中等待1秒钟后,修改exec的值为false,按照正常的逻辑应该是在exec值为false后,循环结束执行下面输出语句,然后线程结束,程序退出。 但是,上述代码在运行后,将不会执行run()函数中的System.out.println("退出了循环");语句,程序一直保持运行。对这种现象,在帖子”关于JAVA线程,请大神帮忙“中still_rain给出的这种现象的原因是线程访问的同步问题导致,当主线程(main函数所在的线程)中修改变量exec的值后,在创建执行的线程中访问的exec的值没有发生变化(或者说可能是主线程、执行线程这两个线程exec变量是不同的对象,好像是说java会将一些资源在每个线程中复制一份?有待确认)。在exec变量前加上volatile修饰符后,程序运行正常,问题似乎解决。 现在以上述代码为基础,进行一次小小的修改。在run()函数中的while循环中加上一个类对象操作,比如新建一个字符串,则run()函数为 ```java public void run() { int c = 0; while (exec) { String s = new String(""); c++; } System.out.println("退出了循环"); } } ``` 运行程序,程序按预期的顺序执行,顺利结束。这时候不管exec变量是否有volatile修饰符,且只在while循环中存在类对象操作(新建对象、对象函数调用(调用的函数不能返回基本数据类型),以及像System.out.println这样的操作),程序的运行都很正常,对这种现象就不是上述的同步问题能够解释的了。在帖子”关于JAVA线程,请大神帮忙“中still_rain(感谢热情的回复)从编译器优化的角度进行了解释。当while循环中只有简单的基本数据类型参与运算的时候由于执行速度太快,将while循环编译成了while(true)语句。导致循环不会退出,从而循环后的输出不会执行,且程序不会退出。 为了探究这个奇怪现象的原因,让我们看看编译后的字节码,下图是用jclasslib查看的字节码,是修改前的run()函数字节码。 ![](http://img.blog.csdn.net/20150210165255055?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ2Rhdmlk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 从图中可以看到,循环体从aload_0开始,到goto 2结束。控制跳转的语句是ifeq 15,意思是如果值为0则跳转到15,否则执行下面的语句。 当将上面的while(exec)语句修改为while(true)后,字节码为: ![](http://img.blog.csdn.net/20150210165209410?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ2Rhdmlk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 由两图可以看出,编译器并没有将while(exec)语句优化为while(true)。再看修改后的代码编译的字节码: ![](http://img.blog.csdn.net/20150210165320125?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ2Rhdmlk/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 循环体从aload_0起,到goto 2结束。从ifeq 25下面的一行到astotre_2行,为String s = new String("");语句的字节码,将这段去掉则字节码与修改前的一样。所以基本可以排除编译器优化导致的程序不正常运行。 请看到这篇文章的大神们能够给予指导,探究出现这种情况的原因,谢谢
c语言 将一个乱七八糟的char类型数组取平均值与标准差
这是一个程序中的一部分,有一个很大的.csv数据文件,我可以调用其中的任意一行的内容,可是数据是以char类型进行存储的,而且每行开始都有一个编号(例如ENSG0001)而且由于csv文件的特性每一个数据后面都有一个逗号,我试着用ASCII将它们都消掉了可是这时我通过记录消掉多少逗号判断有多少数时出了问题,而且我也不太清楚怎么将数组中的数据求和,程序中的很多知识我都是从网上搜到,个人水平实在是有一点低了。麻烦哪位好心人能帮一下忙。 谢谢了。 //#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> int getFilelen(FILE * file)//2.2.0----getfile...函数---- 主要是做逐行读取功能并记录行数 { int len = 0;//2.2.1---定义了一个len=0其意义暂时不知---- int plus=0,i,j,k;//.... float f; int q,w; char e[2200]; float r; if (file == NULL) { return -1;//2.2.2如果文件为空(或不存在??????????)直接结束 } char buf[2200];//2.2.3定义一个大小为1024的一维数组(1024有无特殊含义???????) //读取每一行 printf("请输入你要找第几种RNA(第几行的):"); scanf("%d",&q); while (fgets(buf, 2200, file) != NULL)//2.2.4---- 将fp中的内容按1024字节大小读入text中,然后输出。直到读到fp的末尾,为空了。停止读取,然后关闭文件。 -----解释了1024的问题 { len++; if(len>q) { printf("第%d种RNA\n",q-1); goto w; } } w: //printf("%s ",buf); strcpy(e, buf); puts(e); printf("\n"); // r = atof(e); // printf("\n%d",r); for(j=i=0;e[i];i++) if(e[i]>='a' && e[i]<='z' || e[i]>='A' && e[i]<='Z'){e[i]=32;} for(j=i=0;e[i];i++) if(e[i]>='+'&&e[i]<='-') { e[i]=32; } printf("%s",e); //sscanf(e,"%d%*s",n); // printf("%d",n); return len;//2.2.6----返回len----此时回到77行继续运行程序 } void freeSpace(char ** pArray, int len)//不用想了,释放空间,翻译一下就出来了 { if (pArray == NULL || len == NULL) { return; } for (int i = 0; i < len; i++) { if (pArray[i] != NULL) { free(pArray[i]); pArray[i] = NULL; } } }//回81行 int test01()//2.1.0----test01函数,整个程序的主体部分(之后的\n和system只是辅助,显示的好看一些,没有什么意义) -----此函数意义仍为一个目录,具体操作在其他函数中 { FILE * file = fopen("transcript_rna_tissue.csv", "r");//2.1.1打开文件,如果不存在或者打不开的话输出72内容,结束程序。 if (file == NULL) { printf("打开文件失败!\n"); return 0; } int len= getFilelen(file);//2.1.2----定义(调用)函数get...-----程序跳转至第5行 } int main() { test01(); }//结束
一道C++的题,好像是对应的数据类型不对,但是实在是想不到如何修改好这个程序
首先,这个程序的功能是实现顺序表的基本操作,代码如下: ``` //顺序表的基本操作 #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int ElemType; typedef int Status; //----- 顺序表的顺序存储表示 ----- #define LIST_INIT_SIZE 100 // 存储空间的初始分配量 #define LISTINCREMENT 10 // 存储空间的分配增量 typedef struct { ElemType *elem; // 存储空间的基址 int length; // 表长 int size;// 存储容量 int increment; // 扩容时,增加的存储容量 } SqList; //顺序表 // 构造一个顺序表 Status InitSqlist(SqList &L){ L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)); if(!L.elem) exit (OVERFLOW); L.length = 0; L.size = LIST_INIT_SIZE; L.increment = LISTINCREMENT; return OK; } // 判顺序表是否为空表 Status ListEmpty(SqList L){ if (L.length==0) return OK; else return ERROR; } //顺序表插入函数 Status ListInsert_Sq(SqList &L,int i,int p,int q,int newbase,int increment,ElemType e){ //请在此填写代码,将该算法补充完整 //在顺序线性表L中第i个位置之前插入新的元素e, // i的合法值为1<=i<=ListLength.Sq(L)+1 if (i<1||i>L.length+1)return ERROR;//i值不合法 if(L.length>=L.size){ //当前存储空间已满,增加分配 newbase=(ElemType *)realloc(L.elem,(L.size+increment)*sizeof(ElemType)); if(!newbase)exit(OVERFLOW);//存储分配失败 L.elem=newbase;//新基址 L.size+=increment;//增加存储容量 } q=&(L.elem[i-1]);//q为插入位置 for(p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;//插入位置及之后的元素右移 *q=e;//插入e ++L.length;//表长增1 return OK; }//ListInsert_Sq //顺序表删除元素函数 Status ListDelete_Sq(SqList &L, int i,int p,int q,ElemType &e){ //请在此填写代码,将该算法补充完整 //在顺序线性表L中删除第i个元素,并用e返回其值 //i的合法值为1<=i<=ListLengt_Sq(L) if(i<1||(i>L.length))return ERROR;//i值不合法 p=&(L.elem[i-1]);//p为被删除元素的位置 e=*p;//被删除元素的值赋给e q=L.elem+L.length-1;//表尾元素的位置 for(++p;p<=q;++p)*(p-1)=*p;//被删除元素之后的元素左移 --L.length; return OK; }//ListDe;ete_SQ //输出顺序表函数 void OutList_Sq(SqList L) { int i; ElemType e; if(ListEmpty(L)){ printf("这是一个空表!"); } else { printf("顺序表为:"); for(i=0;i<L.length;i++) printf("%6d",L.elem[i]); } printf("\n"); } //主函数 int main() { SqList L; int cord,i; ElemType a; printf("第一次使用必须初始化!\n"); do{ printf("\n 主菜单 \n"); printf(" 1 初始化顺序表 "); printf(" 2 插入一个元素 "); printf(" 3 删除一个元素 "); printf(" 4 结束程序运行 "); printf("\n-------------------------------------------------------------------\n"); printf("请输入您的选择( 1, 2, 3, 4)"); scanf("%d",&cord); printf("\n"); switch(cord){ case 1: InitSqlist(L); OutList_Sq(L); break; case 2: printf("\n请输入要插入的插入位置和数据元素(如:3 20)"); scanf("%d%d",&i,&a); ListInsert_Sq(L,i,a); printf("\n插入%d元素之后的",a); OutList_Sq(L); break; case 3: printf("\n请输入要删除的数据元素的位置(如: 3)"); scanf("%d",&i); ListDelete_Sq(L,i,a); printf("\n删除第%d个位置的元素之后",i); OutList_Sq(L); break; case 4: exit(0); } }while (cord<=4); return 1; } ``` 然后这个是所有的报错信息,编译器是DEV-C++ ![图片说明](https://img-ask.csdn.net/upload/201811/02/1541121293_791204.png)
C++ 关于指针和delete的问题,delete总是报错
近期想仔细了解一下C++里的指针、内存分配的问题,所以想验证一下,当一个指针被delete之后的内存会发生什么,所以想尝试一下: ``` int main() { int *p = new int; int *p2; p2 = p; delete p2; system("pause"); return 0; } ``` 执行delete p2时报错,HEAP CORRUPTION DETECTED:after a normal block.... 但是如果把delete语句删掉,会在程序结束的时候报错:内存访问冲突。 不是很能理解为什么。 逻辑上: 给p分配了一个int的内存,p指向这个内存。然后p2 = p,p2也可以指向这个内存。然后delete p2,释放p2指向的内存。 我想过可能的错误:p和p2指向了同一个内存,在释放的时候会产生混乱。但是,为什么会产生这个混乱?p2释放之后,p顶多变成野指针吧(我是这么想的。 然后我把delete p2删除之后,在程序结束的时候,会报一个访存冲突的错误。我想是不是因为p和p2指向同一个内存,在程序结束的时候释放内存,会重复释放,因此报错。于是我改成: ``` int main() { int *p = new int; int *p2; p2 = p; p = p + 1; //delete p2; system("pause"); return 0; } ``` 但是依旧报错。 不是很懂了。求好心人帮忙看看~ **第二天再运行一遍就好了。我也不是很懂了orzz。但是还有新的问题,见下:** ----------------------------------华丽分割线------------------------------------- 其实最原始我的本意是想看看,给一个指针分配一块内存,delete后会发生什么。所以写了如下: ``` #include<iostream> #include<string> using namespace std; int* InitIntWithoutDelete() { int *p = new int; cout << "initwithoutdelete.p:" << p << endl; for (int i = 0; i < 4; i++) { p[i] = i; } int *p2 = p; return p; } int* InitIntWithDelete() { int *p = new int; for (int i = 0; i < 4; i++) { p[i] = i; } int *p2 = p; delete p2; return p; } int main() { int *p; p = InitIntWithoutDelete(); for (int i = 0; i < 4; i++) { cout << p[i] << endl; } system("pause"); return 0; } ``` 运行时一直没错,但是程序退出的时候,会报错,中断进去,程序断在xlocale: ``` ~locale() _NOEXCEPT { // destroy the object if (_Ptr != 0) delete _Ptr->_Decref(); } ``` 然后点继续,弹出对话框是说: ![图片说明](https://img-ask.csdn.net/upload/201610/16/1476590620_92551.png) 感觉是程序结束,回收内存的时候越界或者溢出啥的了。 **所以想问: 1.为什么会出现这个现象?错误的地方在哪里呢? 2.说起来,想问一下,像这种,我是通过一个函数,返回了一个指向堆内存的指针,那我要释放这个堆,应该怎么释放呢?都说new和delete最好配对,但是我在函数InitIntWithoutDelete()里面new的指针,因为要是要返回它的值,所以在返回之前没法delete吧,一旦delete了,好像现在C++是会自动把这个指针变成x00008123。那这个new就没法有对应的delete了。我一开始猜想的是在函数外部delete,比如在上面那一段中:** ``` int *p = InitIntWithoutDelete(); delete p; ``` **在delete语句中就会报错。** 最后就是别的奇奇怪怪的问题了: 我看程序退出报错,就在system("pause")处设了断点。运行到断点的时候,直接点了“继续”,程序正常退出。 但是后来,就算有断点,退出也依然报错了。 我记得我以前也碰到过,就是 **设置断点可以运行,但是去掉断点就越界啥的错误了。为啥?** TAT,香菇,求好心人解答,十分感谢!~
我用这个代码做不出来,希望大佬们能给我一个完整的能运行的程序代码,谢谢。
想要图中的结果但是出不来 ![图片说明](https://img-ask.csdn.net/upload/201812/06/1544086701_15340.jpg) #include<string.h> // 字符串函数头文件   #include<ctype.h> // 字符函数头文件   #include<malloc.h> // malloc()等   #include<limits.h> // INT_MAX等    #include<stdio.h> // 标准输入输出头文件,包括EOF(=^Z或F6),NULL等   #include<stdlib.h> // atoi(),exit()    #include<io.h> // eof()    #include<math.h> // 数学函数头文件,包括floor(),ceil(),abs()等    #include<sys/timeb.h> // ftime()    #include<stdarg.h> // 提供宏va_start,va_arg和va_end,用于存取变长参数表  // 函数结果状态代码。在教科书第10页   #define TRUE 1   #define FALSE 0   #define OK 1   #define ERROR 0       typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等    typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSE,第7、8章用到     // 赫夫曼树和赫夫曼编码的存储结构    typedef struct // 结点的结构,在教科书第147页  { unsigned int weight; // 结点的权值      unsigned int parent,lchild,rchild;    } HTNode,*HuffmanTree; // 动态分配数组存储赫夫曼树     typedef char **HuffmanCode; // 动态分配数组存储赫夫曼编码表           int min(HuffmanTree t,int i)    { // 返回赫夫曼树t的前i个结点中权值最小的树的根结点序号,函数select()调用     int j,m;      unsigned int k; // k存最小权值,初值取为不小于可能的值(无符号整型最大值)     for(j=1;j<=i;j++) // 对于前i个结点        if(t[j].parent==0) // t[j]的权值小于k,又是树的根结点       {  k=t[j].weight; // t[j]的权值赋给k         m=j; // 序号赋给m        }      t[m].parent=1; // 给选中的根结点的双亲赋非零值,避免第2次查找该结点     return m; // 返回权值最小的根结点的序号   }      void select(HuffmanTree t,int i,int &s1,int &s2)   { // 在赫夫曼树t的前i个结点中选择2个权值最小的树的根结点序号,s1为其中序号(权值)较小的         int j;        s1=min(t,i); // 权值最小的根结点序号     s2=min(t,i); // 权值第2小的根结点序号        if(s1>s2) // s1的序号大于s2的     { // 交换        j=s1;        s1=s2; // s1是权值最小的2个中序号较小的       s2=j; // s2是权值最小的2个中序号较小的     }     }       void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int* w,int n) // 算法6.12   { // w存放n个字符的权值(均>0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HC     int start;      unsigned f;   // 以下是从叶子到根逆向求每个字符的赫夫曼编码   int m,i,s1,s2;     unsigned c;     HuffmanTree p;      char *cd;      if(n<=1) // 叶子结点数不大于n        return;      m=2*n-1; // n个叶子结点的赫夫曼树共有m个结点      HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); // 0号单元未用      for(p=HT+1,i=1;i<=n;++i,++p,++w) // 从1号单元开始到n号单元,给叶子结点赋值    { // p的初值指向1号单元        (*p).weight=*w; // 赋权值        (*p).parent=0; // 双亲域为空(是根结点)        (*p).lchild=0; // 左右孩子为空(是叶子结点,即单结点树)       (*p).rchild=0;      }      for(;i<=m;++i,++p) // i从n+1到m        (*p).parent=0; // 其余结点的双亲域初值为0      for(i=n+1;i<=m;++i) // 建赫夫曼树      { // 在HT[1~i-1]中选择parent为0且weight最小的两个结点,其序号分别为s1和s2       select(HT,i-1,s1,s2);        HT[s1].parent=HT[s2].parent=i; // i号单元是s1和s2的双亲       HT[i].lchild=s1; // i号单元的左右孩子分别是s1和s2 HT[i].rchild=s2;        HT[i].weight=HT[s1].weight+HT[s2].weight; // i号单元的权值是s1和s2的权值之和     }      HC=(HuffmanCode)malloc((n+1)*sizeof(char*));    // 分配n个字符编码的头指针向量([0]不用)      cd=(char*)malloc(n*sizeof(char)); // 分配求编码的工作空间     cd[n-1]='\0'; // 编码结束符     for(i=1;i<=n;i++)      { // 逐个字符求赫夫曼编码       start=n-1; // 编码结束符位置        for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent) // 从叶子到根逆向求编码         if(HT[f].lchild==c) // c是其双亲的左孩子           cd[--start]='0'; // 由叶子向根赋值'0'         else // c是其双亲的右孩子            cd[--start]='1'; // 由叶子向根赋值'1'        HC[i]=(char*)malloc((n-start)*sizeof(char)); // 为第i个字符编码分配空间       strcpy(HC[i],&cd[start]); // 从cd复制编码(串)到HC     }      free(cd); // 释放工作空间   }     void main()   {      HuffmanTree HT;     HuffmanCode HC;      int *w,n,i;      printf("请输入权值的个数(>1):");      scanf("%d",&n);      w=(int*)malloc(n*sizeof(int)); // 动态生成存放n个权值的空间     printf("请依次输入%d个权值(整型):\n",n);     for(i=0;i<=n-1;i++)        scanf("%d",w+i); // 依次输入权值      HuffmanCoding(HT,HC,w,n); // 根据w所存的n个权值构造赫夫曼树HT,n个赫夫曼编码存于HC      for(i=1;i<=n;i++)        puts(HC[i]); // 依次输出赫夫曼编码 }
C语言初学者提问,不会修改程序
可以运行,但是达不到目的,不会修改 程序代码: typedef struct /* 学生结构 */ { short status; /* 数据状态,0:正常 1:删除 */ char number[10]; /* 学号 */ char name[20]; /* 姓名 */ char sex[3]; /* 性别 */ int age; /* 年龄 */ char place; /* 籍贯 */ char department; /* 系别 */ char major; /* 专业 */ int classnumber; /* 班级 */ }StudentType; void AddData(void); /* 增加数据 */ void ChangeData(void); /* 修改数据 */ void SearchData(void); /* 查找数据 */ void ListData(void); /* 显示数据 */ void PackData(void); /* 删除数据 */ #include<stdio.h> /* 标准输入输出文件包含预处理命令 */ #include<string.h> /* 字符串文件含预处理命令 */ #include<ctype.h> /* 包含tolower()的原型 */ #include<stdlib.h> /* 标准库文件包含预处理命令 */ FILE*fp; /* 声明文件指针 */ void AddData(void) /* 增加文件数据 */ { StudentType student; /* 学生 */ char tag; /* 设置标志是否继续增加 */ student.status=0; /* 数据状态,0:正常 1:删除 */ do { printf("学生学号:"); scanf("%s,student.number"); /* 输入学号 */ printf("学生姓名:"); scanf("%s,student.name"); /* 输入姓名 */ printf("学生性别:"); scanf("%s,student.sex"); /* 输入性别 */ printf("学生年龄:"); scanf("%d,student.age"); /* 输入年龄 */ printf("学生籍贯:"); scanf("%s,student.place"); /* 输入籍贯 */ printf("学生系别"); scanf("%s,student.department"); /* 输入系别 */ printf("学生专业:"); scanf("%s,student.major"); /*输入专业 */ printf("学生班级:"); scanf("%d,student.classnumber"); /* 输入班级 */ fseek(fp,0, SEEK_END); /* 移动文件内部指针 */ fwrite(&student,sizeof(StudentType),1,fp); /* 将图书信息存入文件中 */ printf("继续添加吗(y/n):"); while (getchar() !='\n'); /* 跳过当前行 */ tag=getchar(); /* y,Y表示继续,N,n表示结束 */ tag=tolower(tag); /* 大写字母转化为小写字母 */ while (tag !='y' && tag !='n') { /* 非法输入时重新输入 */ printf("输入非法,重新输入(y/n):"); while (getchar() !='\n'); /* 跳过当前行 */ tag=getchar(); /* y,Y表示继续,N,n表示结束 */ tag=tolower(tag); /* 大写字母转化为小写字母 */ } }while (tag=='y'); /* 肯定回答时循环 */ } void ChangeData(void) /* 更新数据 */ { StudentType student; /* 学生 */ char number[20]; /* 学生学号 */ printf("输入要更改的学生学号:"); scanf("%s",number); /* 输入学生学号 */ rewind(fp); /* 使位置指针返回到文件开头 */ fread(&student,sizeof(StudentType),1,fp); /* 读入学生信息 */ while(!feof(fp)) { /* 文件未结束 */ if(strcmp(student.number,number)==0 /* 学生学号相同 */ && student.status==0 /* 数据状态正常,未作删除标志 */ )break; /* 查询成功 */ fread(&student,sizeof(StudentType),1,fp); /* 读入学生信息 */ } if (!feof(fp)) { /* 查询成功 */ printf("%-20s%-10s%-5s%-4d%-20s%-20s%-20s%-15d%\n","学生学号","学生姓名","学生性别","学生年龄","学生籍贯","学生系别","学生专业","学生班级"); printf("%-20s%-10s%-5s%-4d%-20s%-20s%-20s%-15d%\n", /* 输出信息 */ student.number,student.name,student.sex,student.age,student.place,student.department,student.major,student.classnumber); printf("输入更改后的数据:\n"); printf("学生学号:"); scanf("%s,student.number"); /* 输入学号 */ printf("学生姓名:"); scanf("%s,student.name"); /* 输入姓名 */ printf("学生性别:"); scanf("%s,student.sex"); /* 输入性别 */ printf("学生年龄:"); scanf("%d,student.age"); /* 输入年龄 */ printf("学生籍贯:"); scanf("%s,student.place"); /* 输入籍贯 */ printf("学生系别"); scanf("%s,student.department"); /* 输入系别 */ printf("学生专业:"); scanf("%s,student.major"); /*输入专业 */ printf("学生班级:"); scanf("%d,student.classnumber"); /* 输入班级 fseek(fp,-sizeof(StudentType), SEEK_CUR); /* 移动文件内部指针 */ fwrite(&student, sizeof(StudentType),1,fp); /* 写入数据 */ } else { /* 查询失败 */ printf("无此编号的学生!\n"); clearerr(fp); /* 清除文件结束标志 */ } } void SearchData(void) { StudentType student; /* 查询数据 */ int select; /* 工作变量 */ char number[20]; /* 学号 */ char major[20]; /* 专业 */ printf("请选择:\n"); printf("1.按学号查询 2.按专业查询\n"); scanf("%d",&select); /* 输入选择 */ while (select<1||select>2) { printf("请输入1~2的数:"); /* 输入提示 */ scanf("%d,&select"); /* 输入选择 */ } switch (select) { case 1: /* 按学生学号查询 */ printf("请输入要查询的学生学号:"); scanf("%s",number); /* 输入学生的学号 */ rewind(fp); /* 使指针位置返回到文件的开头 */ fread(&student,sizeof(StudentType),1,fp); /* 读入学生信息 */ while (!feof(fp)) { /* 文件未结束 */ if(strcmp(student.number,number)==0 /* 学生学号相同 */ && student.status==0 /* 数据状态正常,没有删除标志 */ )break; /* 查询成功 */ fread(&student,sizeof(StudentType),1,fp); /* 读入学生信息 */ } break; case 2: printf("输入要查询的学生的专业:"); /* 按专业查询 */ scanf("%s",major); /* 输入学生专业 */ rewind(fp); /* 使指针返回文件的开头 */ fread(&student,sizeof(StudentType),1,fp); /* 读入学生的信息 */ while(!feof(fp)) { /* 文件未结束 */ if (strcmp(student.major,major)==0 /* 学生专业相同 */ && student.status==0 /* 数据状态正常,没有删除标志 */ ) break; /* 查询成功 */ fread(&student,sizeof(StudentType),1,fp); /* 读入学生信息 */ } break; } if (!feof(fp)) { /* 查询成功 */ printf("%-20s%-10s%-5s%-4d%-20s%-20s%-20s%-15d%\n","学生学号","学生姓名","学生性别","学生年龄","学生籍贯","学生系别","学生专业","学生班级"); printf("%-20s%-10s%-5s%-4d%-20s%-20s%-20s%-15d%\n", /* 输出信息 */ student.number,student.name,student.sex,student.age,student.place,student.department,student.major,student.classnumber); } else { /* 查询失败 */ printf("无此专业的学生!\n"); clearerr(fp); /* 清除文件结束标志 */ } } void DeleteData(void) /* 删除数据,只作删除标志 */ { StudentType student; /* 学生 */ char number[20]; /* 学生学号 */ printf("输入要更新的学生的学号:"); scanf("%s", number); /* 输入学生的学号 */ rewind(fp); /* 使位置指针返回文件的开头 */ fread(&student, sizeof(StudentType),1,fp); /* 读入学生的信息 */ while(!feof(fp)) { /* 文件未结束 */ if (strcmp(student.number, number)==0 /* 学生的学号相同 */ && student.status==0 /* 数据状态正常,未作删除标志 */ )break; /* 查询成功 */ fread(&student,sizeof(StudentType),1,fp); /* 读入学生信息 */ } if(!feof(fp)) { /* 查询成功 */ printf("被删除记录为:、n"); printf("%-20s%-10s%-5s%-4d%-20s%-20s%-20s%-15d%\n","学生学号","学生姓名","学生性别","学生年龄","学生籍贯","学生系别","学生专业","学生班级"); printf("%-20s%-10s%-5s%-4d%-20s%-20s%-20s%-15d%\n", /* 输出信息 */ student.number,student.name,student.sex,student.age,student.place,student.department,student.major,student.classnumber); student.status=1; fseek(fp,-sizeof(StudentType), SEEK_CUR); /* 移动文件内部指针 */ fwrite(&student, sizeof(StudentType),1,fp); /* 写入数据 */ } else { /* 查询失败 */ printf("无此编号的学生!\n"); clearerr(fp); /* 清除文件结束标志 */ } } void pack(void) /* 在物理上删除作有删除标记的记录 */ { StudentType student; /* 学生 */ FILE*fpTmp; /* 临时文件指针 */ if ((fpTmp=fopen("book_tmp.dat","wb"))==NULL) { /* 打开文件失败 */ printf("打开文件student_tmp.dat 失败!\n"); /* 错误信息 */ system("PAUSE"); /* 调用库函数system(),输出系统提示信息 */ exit(2); /* 退出程序 */ } rewind(fp); /* 使位置指针返回文件开头 */ fread(&student,sizeof(StudentType),1,fp); /* 读入学生信息 */ while (!feof(fp)) { /* 文件未结束 */ if(student.status==0) /*数据状态正常,未作删除标志 */ fwrite(&student,sizeof(StudentType),1,fpTmp); /* 写入数据 */ fread(&student,sizeof(StudentType),1,fp); /* 继续读入图书信息 */ } fclose(fp); fclose(fpTmp); /* 关闭文件 */ remove("student.dat"); /* 删除文件 */ rename("&student_tmp.dat","student.dat"); /* 更改文件名 */ if ((fp=fopen("student.dat","rb+"))==NULL) { /* 打开 employee.dat失败 */ printf("打开文件student.dat 失败!\n"); /* 错误信息 */ system("PAUSE"); /* 调用库函数system(),输出系统提示信息 */ exit(3); /* 退出程序 */ } } #include<stdio.h> /* 标准输入输出文件包含预处理命令 */ #include<stdlib.h> /* 标准库文件包含预处理命令 */ FILE*fp; /* 定义文件指针 */ int main(void) /* 主函数main() */ { int select; /* 工作变量 */ if ((fp=fopen("student.dat","rb+"))==NULL) { /* student.dat 文件不存在 */ if ((fp=fopen("student.dat","wb+"))==NULL) { /* 打开文件失败 */ printf("打开文件student.dat失败!\n"); /* 错误信息 */ system("PAUSE"); /* 调用库函数system(),输出系统提示信息 */ exit(1); /* 退出程序 */ } } do { printf("\n请选择:\n"); printf("1.增加数据 2.修改数据 3.查找数据 4.删除数据 5.重组数据 6.退出\n"); scanf("%d",&select); /* 输入选择 */ while (select<1||select>6) { printf("请输入1~6的数:"); /* 输入提示 */ scanf("%d",&select); /* 输入选择 */ } switch(select) { case 1: AddData(); /* 增加数据 */ break; case 2: ChangeData(); /* 修改数据 */ break; case 3: SearchData(); /* 查询数据 */ break; case 4: DeleteData(); /* 删除数据,只作删除标志 */ break; case 5: pack(); /* 物理上删除作有标记的记录 */ break; } }while (select!=6); /* 选择6退出循环 */ fclose(fp); /* 关闭文件 */ system("PAUSE"); /* 调用库函数system(),输出系统提示信息 */ return 0; /* 返回值0,返回操作系统 */ }
VC6.0运行没问题的程序为什么到了VS2010里就运行异常了?
![图片说明](https://img-ask.csdn.net/upload/201608/06/1470464082_976215.png) 代码如下,一个基于控制台的计算器程序,异常原因好像是string类溢出? 小白一枚,平常在学校学的是VC6.0,并不清楚两种开发软件有什么区别也不知道该怎么改,求大神指点!! #include "StdAfx.h" #include<iostream> #include<cmath> #include<string> #include<iomanip> using namespace std; double D_Operate(double x,char op,double y)//双目运算符的运算定义 { double a; switch(op) { case'+': a=x+y;break; case'-': a=x-y;break; case'*': a=x*y;break; case'/': a=x/y;break; case'^': a=pow(x,y);break; } return a; } double S_Operate(char op,double x)//前缀单目运算符的运算定义 { double a; switch(op) { case's': a=sin(x);break; case'c': a=cos(x);break; case't': a=tan(x);break; case'l': a=log10(x);break; case'n': a=log(x);break; case'_': a=-x;break;//取负用下划线代替负号 定义为一元运算 } return a; } char Precede(char op1,char op2)//判断符号的优先级 op1在返回的结果符的左边 op2在右边 //用于判定运算符的优先级 以决定是把运算符压栈 还是把栈内的运算符弹出来进行计算 { if(((op1=='+'||op1=='-')&&(op2=='+'||op2=='-'||op2==')'||op2=='='))||\ ((op1=='*'||op1=='/')&&(op2=='+'||op2=='-'||op2=='*'||op2=='/'||op2==')'||op2=='='))\ ||(op1=='^'&&(op2=='+'||op2=='-'||op2=='*'||op2=='/'||op2==')'||op2=='='||op2=='s'||op2=='c'||op2=='t'||op2=='_'||op2=='l'||op2=='n'))\ ||((op1=='_'||op1=='s'||op1=='c'||op1=='t'||op1=='l'||op1=='n')&&(op2=='+'||op2=='-'||op2=='*'||op2=='/'||op2==')'||op2=='='||op2=='s'||op2=='c'||op2=='t'||op2=='_'||op2=='l'||op2=='n'))) return '>';//上述情况下 栈顶运算符优先级高于待定运算符 需弹栈 if((op1=='('&&op2==')')||(op1=='='&&op2=='=')) return '='; else return '<'; } int illegal_char(string s,int i)//非法输入字符判定函数 { int j=0; while(j<i) { if(s[j]>='0'&&s[j]<='9') j++; else if(s[j]=='+'||s[j]=='-'||s[j]=='*'||s[j]=='/'||s[j]=='.'||s[j]=='('||s[j]==')'||s[j]=='^'||s[j]=='!'||s[j]=='e'||s[j]=='_') j++; else if((s[j]=='p'&&s[j+1]=='i')||(s[j]=='l'&&s[j+1]=='n')) j+=2; else if((s[j]=='s'&&s[j+1]=='i'&&s[j+2]=='n')||(s[j]=='c'&&s[j+1]=='o'&&s[j+2]=='s')||(s[j]=='t'&&s[j+1]=='a'&&s[j+2]=='n')||(s[j]=='l'&&s[j+1]=='o'&&s[j+2]=='g')) j+=3; else { cout<<"ERROR:存在非法字符输入"<<endl; return 0; } } return 1;//没有非法字符 返回1 否则返回0 } int match(string s)//栈结构的括号匹配检测函数 { int i=0,top=0; char stack[50]; while(s[i]!='\0') { if(s[i]=='(') { stack[top]=s[i]; top++; }//push 左括号压入栈内 if(s[i]==')') if(stack[top-1]=='(') { int a=i+1; stack[top-1]=NULL; top--; }//把与右括号匹配的左括号弹掉 else { cout<<"ERROR:括号输入有误"<<endl; return 0;//多了右括号 括号失陪 返回非法 }//pop'(' i++; } if (top!=0) { cout<<"ERROR:括号输入有误"<<endl; return 0;//多了左括号 括号失陪 返回非法 } return 1;//返回合法 } class NUMstack//运算数栈 { public: double num[1000]; int top; void start()//初始化栈清空栈顶指针置底 { for(int i=0;i<1000;i++) num[i]=0; top=0; } void push(char a)//因为有多位数的运算因此不能一压栈就提升栈顶指针 { num[top]=num[top]*10+(a-'0'); } double pop()//弹栈函数 弹掉栈顶元素 栈顶归0 top指针下降 { top--; double number=num[top]; num[top]=0; return number; } double getTop()//取栈顶元素但不必弹栈 { return num[top-1]; } void lift()//提升top指针的函数 { top++; } }; class OPERstack//运算符栈 { public: char oper[1000]; int top; void start()//初始化函数栈清空栈底放一"="用于判定算式结束 { oper[0]='='; for(int i=1;i<1000;i++) oper[i]=NULL; top=1; } void push(char a)//与数字栈不同一压栈就可以提升指针 { oper[top]=a; top++; } char pop()//弹出计算符 用于计算 { top--; char op=oper[top]; oper[top]=NULL; return op; } char getTop()//取栈顶符号 但不弹栈 可用于判定优先级 { return oper[top-1]; } }; void calculate(string equation)//算式计算函数(关键函数) { NUMstack number;//定义运算数栈变量number OPERstack oper;//定义运算符栈变量oper number.start(); oper.start();//把两个栈初始化 int i=0,len=0,k; char p,sig; double yuan1,yuan2; while(equation[i]!='\0') { len++; i++; }//计算等式长度len if(equation[len-1]!='=') { cout<<"ERROR:未输入等号"<<endl; return;//检测有没有结束符等号"=" } int le; le=illegal_char(equation,len-1); if(le==0) return;//有非法字符 不进行后续计算 le=match(equation); if(le==0) return;//括号匹配非法 不进行后续计算 for(i=0;i<len;i++)//初步确定合法后开始计算算式 { if(equation[i]=='!')//阶乘是后缀单目运算符单独进行计算 { yuan1=number.pop();//弹出栈顶元素做阶乘 if (yuan1==0) { number.num[number.top]=0;//0的阶乘为0 压结果入栈 number.lift(); } else { number.num[number.top]=1; for(k=1;k<=yuan1;k++)//阶乘循环 number.num[number.top]=k*number.num[number.top]; number.lift();//结果入站 } } else if(equation[i]>='0'&&equation[i]<='9') { number.push(equation[i]);//压数字字符入栈 if((equation[i+1]<'0'||equation[i+1]>'9')&&equation[i+1]!='.') number.lift();//当整个多位运算数读取完毕后,运算数栈栈顶指针才能提升 } else if(equation[i]=='p') { number.num[number.top]=3.1415926536;//pi值即π 圆周率 要压入数字栈 number.lift(); i++;//pi是两个字符所以要移动扫描算式的指针往后跳一个 } else if(equation[i]=='e') { number.num[number.top]=2.718281828459;//e 自然对数底数 压入运算数栈 number.lift(); } else if(equation[i]=='.')//小数压栈代码 { int x=1; while(equation[i+x]>='0'&&equation[i+x]<='9') { number.num[number.top]+=((equation[i+x]-'0')/pow(10.0,x));//第x位小数入栈 x++; } x--; number.lift(); i=i+x; } else if(equation[i]=='(') { oper.push(equation[i]);//左括号无条件压栈 } else//数阶乘左括号判断完毕后其他运算符的分类讨论 { if(oper.top==1)//运算符栈为空运算符可以无条件入栈 { if(equation[i]=='l'&&equation[i+1]=='o') oper.push('l'); else if(equation[i]=='l'&&equation[i+1]=='n') oper.push('n');//因为log和ln都是小写字母l开头所以要分情况讨论 else oper.push(equation[i]); } else//运算符栈不为空则要进行优先级判断 { char temp1=oper.getTop();//取出栈顶符号 char temp2;//待入栈符号 if(equation[i]=='l'&&equation[i+1]=='o') temp2='l'; else if(equation[i]=='l'&&equation[i+1]=='n') temp2='n';//log与ln的再次讨论 else temp2=equation[i]; p=Precede(temp1,temp2); if(p=='<') oper.push(temp2);//栈顶符优先级较低现在待定的运算符就可以入栈了 if(p=='>'||p=='=') { char rep=p;//当栈顶符优先级不低于待入栈的符号 则运算符栈不停地弹栈 //进行运算直到低于待入栈符号为止 rep用于记录比较结果 要多次进行判断 while((rep=='>'||p=='=')&&(oper.top-1>0)) { sig=oper.pop(); yuan1=number.pop(); yuan2=number.getTop();//靠前的一个运算数只要取得不要弹出来 if(sig=='/'&&yuan1==0)//yuan1是双目运算符后面的第二运算元 { cout<<"ERROR:除数为零"<<endl; return; } if(sig=='^'&&yuan2<0&&yuan1>0&&yuan1<1&&(static_cast <int>(1/yuan1))%2==0)//对负数开偶次根号的限制 { cout<<"ERROR:负数开偶次根号"<<endl; return; } if(sig=='_'||sig=='s'||sig=='c'||sig=='t'||sig=='l'||sig=='n')//若为前缀单目运算符 { double tt; tt=S_Operate(sig,yuan1); number.num[number.top]=tt;//运算结果压回原来yuan1在栈内的位置 number.lift();//提升指针 temp1=oper.getTop(); rep=Precede(temp1,temp2);//再判优先级 } else { number.num[(number.top)-1]=D_Operate(yuan2,sig,yuan1); temp1=oper.getTop(); rep=Precede(temp1,temp2);//双目运算符的计算 } } if(equation[i]==')')//如果栈外符是右括号要把与之匹配的左括号弹出栈外 oper.pop(); else if(equation[i]=='l'&&equation[i+1]=='o') oper.push('l');//代表log的l else if((equation[i]=='l')&&(equation[i+1]=='n')) oper.push('n');//代表ln的n else oper.push(equation[i]); } } if(equation[i]=='s'||equation[i]=='c'||equation[i]=='t'||(equation[i]=='l'&&equation[i+1]=='o')) i=i+2; if(equation[i]=='l'&&equation[i+1]=='n') i++;//对于不止一个字符的运算符 sin log ln等等 要移动扫描算式的指针 往后跳一个或两个 } } if(number.num[0]==ceil(number.num[0])) cout<<equation<<number.num[0]<<endl; else cout<<equation<<fixed<<setprecision(8)<<number.num[0]<<endl;//输出结果控制精度8位小数 //调试时检查运算结束后栈内情况的代码 } void main() { system("cls"); string equation; cout<<endl<<endl<<"请输入算式,以等号结束:"<<endl; cin>>equation; calculate(equation); system("cls"); main(); }
子函数结束后没有返回主函数就崩溃了怎么回事
#include <stdio.h> #include <stdlib.h> #include<string.h> typedef struct reader{ char name[10]; char key[6]; int kind;//普通读者 struct reader *next; }reader; typedef struct bookers{ char name[10]; char key; int kind;//图书管理员 struct bookers *next; }bookers; typedef struct allers{ char name[10]; char key; int kind;//系统管理员 struct allers *next; }allers; typedef struct allbooks{ int read;//记录号 int num;//书号 char name[50];//书名 char write[10];//作者 char pub[30];//出版社 int have;//藏书量 int take;//借出数 struct allbooks *next; }allbooks; void start(reader *head,bookers *_head,allers *head_); void readerstart(reader *head); void online(reader *head,bookers *_head,allers *head_) { gome: printf("\t\t请输入用户名\n"); char name[10];int choice=3; fflush(stdin); scanf("%s",name);////判断普通用户!!!! while(head->next!=NULL)//确认字符串比较返回值 { int a=strcmp(name,head->name); if(a==0) { while(choice>=0) { if(choice==0) { printf("\t\t请重新登录!!\n"); goto gome; } printf("\t\t请输入密码\n"); char key[6]; scanf("%s",key); if(strcmp(key,head->key)==0) {goto in;}//用户管理系统 else { choice--; printf("密码输入错误,您还有%d次机会",choice); } } } else head=head->next; } in: readerstart(head); } void readerstart(reader *head) { printf("****************************************************\n"); printf("\t欢迎进入图书管理系统,您可以进行以下功能:\n"); printf("\t\t\t 1. 用户信息输入\n"); printf("\t\t\t 2. 用户信息修改\n"); printf("\t\t\t 3. 用户信息删除\n"); printf("\t\t\t 4. 用户信息显示\n"); printf("\t\t\t 5. 用户密码修改\n"); printf("\t\t\t 6. 返回主菜单\n"); int choice; printf("请输入您想使用的功能:"); scanf("%d,&choice"); switch(choice) { case 1: break; case 2: break; case 3: break; case 4: break; case 5: break; case 6: break; } } void start(reader *head,bookers *_head,allers *head_) { char a='n'; /* while(a!='y'||a!='Y') {*/ printf("\t\t 欢迎进入图书管理系统\n"); printf(" *********************************************\t\n "); printf("\t\t\t用户登录"); getchar(); online(head,_head,head_); /* printf("\t\t是否退出?"); printf("Y N"); fflush(stdin); scanf("%c",&a); }*/ } void main() { reader *head;bookers *_head;allers *head_; head=(reader *)malloc(sizeof(reader)); strcpy(head->name,"123"); strcpy(head->key,"789"); start(head,_head,head_); printf("欢迎下次使用!"); } 选择6之后并不能退出程序,调试发现start函数中内容运行完了,但是没回到主函数就会崩溃。 ![图片说明](https://img-ask.csdn.net/upload/201603/02/1456907104_274708.jpg)
C语言对用堆导入并显示的数据进行进一步的处理
原题目:求转录RNA组的平均值与标准差(英文翻译过来的) 附加条件:给了一个200多M的文件(数据,可以以txt,csv等形式打开 ) 拿到题目以后解读数据就费了好长时间,数据中的名称全是英文,看了好半天才明白是怎么一回事想到定义数组发现定不了那么大,从网上学了malloc可是完全不知道引入文件后怎么将其导入数组内,试着将网上的程序拼接结果不行。////这时得到了堆空间这个名词,紧接着直接搜出了导入csv文件的相关代码(这里解释一下,这是大学老师布置的一道题,老师只教了我们谭浩强的红皮书就出这样的题目。。。老师也跟我们说了考验我们获取信息的能力。。。只是交作业不算抄袭吧?),就直接粘上了,然后逐行的读懂了这个程序,能够很顺利的用运行显示出所有数据,但是我想进一步做的时候发现自己需要将没一行数据单独进行运算,而这个程序是检测后直接一个个的将一整行显示了,所以我不知道该怎么进行下一步的数据处理。(其实这个程序的核心部分我也只是知道单独行的意思,整体的功能实现并不是太确定)求哪位好心人帮忙给讲一下怎么对导入的数据进行处理。自己的水平实在是不够了。 谢谢了。 #include <stdio.h> #include <stdlib.h> #include <string.h> int getFilelen(FILE * file)//2.2.0----getfile...函数---- 主要是做逐行读取功能并记录行数 { int len = 0;//2.2.1---定义了一个len=0其意义暂时不知---- if (file == NULL) { return -1;//2.2.2如果文件为空(或不存在??????????)直接结束 } char buf[1024];//2.2.3定义一个大小为1024的一维数组(1024有无特殊含义???????) //读取每一行 while (fgets(buf, 1024, file) != NULL)//2.2.4---- 将fp中的内容按1024字节大小读入text中,然后输出。直到读到fp的末尾,为空了。停止读取,然后关闭文件。 -----解释了1024的问题 { len++; //printf("%d ",len); } //设置光标 fseek(file, 0, SEEK_SET);//2.2.5---函数。。。跳到 ---错了。。。 意思是把文件指针指向文件的开头 return len;//2.2.6----返回len----此时回到77行继续运行程序 } void readFileData(FILE * file, int len, char ** pArray) //2.3.1文件指针 长度 堆区数组----read为函数名的函数,其意义因该为读取吧 ---读取到数组??? { if (file == NULL || len <= 0 || pArray == NULL)//2.3.2--如果存在什么不合理的情况,直接结束 { return; } char buf[1024]; //读取每一行 int index = 0; while (fgets(buf, 1024, file) != NULL)//同14行 { int currentlen = strlen(buf) + 1;//strlen() 这个函数是返回一个字符串中的字符个数,不包括结束符 '\0'; char * currenP = (char *)malloc(sizeof(char) * currentlen); strcpy(currenP, buf);//复制BUF ,buf包含整个数据库?? pArray[index++] = currenP;//将buf放进数组??? // printf("%d ",pArray[index++] ); memset(buf, 0, 1024);// 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值----转换为ascii之后方便计算?---- }//回79行 } void showFileData(char ** pArray, int len)//以show为开头的函数,其意义因该为展示,显示吧----- { for (int i = 0; i < len; i++) { int qwe=i; printf("第%d行内容:%s\n", i+1, pArray[i]);//证实parray实际上包含了数据库 // printf("第%d行数据:%s\n",i+1,pArray[qwe+1]); } }//回80行 void freeSpace(char ** pArray, int len)//不用想了,释放空间,翻译一下就出来了 { if (pArray == NULL || len == NULL) { return; } for (int i = 0; i < len; i++) { if (pArray[i] != NULL) { free(pArray[i]); pArray[i] = NULL; } } }//回81行 int test01()//2.1.0----test01函数,整个程序的主体部分(之后的\n和system只是辅助,显示的好看一些,没有什么意义) -----此函数意义仍为一个目录,具体操作在其他函数中 { FILE * file = fopen("transcript_rna_tissue.csv", "r");//2.1.1打开文件,如果不存在或者打不开的话输出72内容,结束程序。 if (file == NULL) { printf("打开文件失败!\n"); return 0; } int len= getFilelen(file);//2.1.2----定义(调用)函数get...-----程序跳转至第5行 char ** pArray = (char **)malloc(sizeof(char *) * len);//2.2.0---定义一个符合文件大小要求的堆空间????? readFileData(file, len, pArray);//2.3.0---函数,跳到25行 -----------去掉这一行数据显示为 第i行数据:(null) showFileData(pArray, len);//到45行 ----------去掉程序不再运行 freeSpace(pArray, len);//到52行 -----可以去掉,不影响显示 pArray = NULL;//将PARRAY定回空----回87行 } int main()//1.0.0--定义主函数,程序的真正开端 { test01();//2.0.0--调用函数 test01-----程序跳转到第67行 putchar('\n'); system("pause"); }//结束
C语言中存储空间分配问题
看书上说声明的变量只是在函数存在的时间有效,函数返回时就会被释放。 然后我就试了一下,代码如下: ``` #include<stdio.h> int f(int **iptr) { int a=10; *iptr=&a; return 0; } int main() { int **jptr; f(jptr); printf("%i\n",**jptr); } ``` 按理说不应该是f函数结束后变量a就会被释放,此时*iptr应该是一个悬空指针啊,为什么我编译运行程序的时候 还是可以输出a的值为10,谢谢啦,这里不是很理解。
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
《阿里巴巴开发手册》读书笔记-编程规约
Java编程规约命名风格 命名风格 类名使用UpperCamelCase风格 方法名,参数名,成员变量,局部变量都统一使用lowerCamelcase风格 常量命名全部大写,单词间用下划线隔开, 力求语义表达完整清楚,不要嫌名字长 ...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
Python爬虫精简步骤1 获取数据
爬虫的工作分为四步: 1.获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。 2.解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。 3.提取数据。爬虫程序再从中提取出我们需要的数据。 4.储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。 这一篇的内容就是:获取数据。 首先,我们将会利用一个强大的库——requests来获取数据。 在电脑上安装
Python绘图,圣诞树,花,爱心 | Turtle篇
1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle() circle.shape('circle') circle.color('red') circle.speed('fastest') circle.up() square = turtle.Turtle()
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 更多有趣分析教程,扫描下方二维码关注vx公号「裸睡的猪」 即可查看! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。   再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。   下文是原回答,希望能对你能有所启发。   如果我说,这个世界上人真的分三六九等,
为什么听过很多道理,依然过不好这一生?
记录学习笔记是一个重要的习惯,不希望学习过的东西成为过眼云烟。做总结的同时也是一次复盘思考的过程。 本文是根据阅读得到 App上《万维钢·精英日课》部分文章后所做的一点笔记和思考。学习是一个系统的过程,思维模型的建立需要相对完整的学习和思考过程。以下观点是在碎片化阅读后总结的一点心得总结。
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计
Linux 命令(122)—— watch 命令
1.命令简介 2.命令格式 3.选项说明 4.常用示例 参考文献 [1] watch(1) manual
Linux 命令(121)—— cal 命令
1.命令简介 2.命令格式 3.选项说明 4.常用示例 参考文献 [1] cal(1) manual
记jsp+servlet+jdbc实现的新闻管理系统
1.工具:eclipse+SQLyog 2.介绍:实现的内容就是显示新闻的基本信息,然后一个增删改查的操作。 3.数据库表设计 列名 中文名称 数据类型 长度 非空 newsId 文章ID int 11 √ newsTitle 文章标题 varchar 20 √ newsContent 文章内容 text newsStatus 是否审核 varchar 10 news...
Python新型冠状病毒疫情数据自动爬取+统计+发送报告+数据屏幕(三)发送篇
今天介绍的项目是使用 Itchat 发送统计报告 项目功能设计: 定时爬取疫情数据存入Mysql 进行数据分析制作疫情报告 使用itchat给亲人朋友发送分析报告(本文) 基于Django做数据屏幕 使用Tableau做数据分析 来看看最终效果 目前已经完成,预计2月12日前更新 使用 itchat 发送数据统计报告 itchat 是一个基于 web微信的一个框架,但微信官方并不允
相关热词 c# 识别回车 c#生成条形码ean13 c#子控制器调用父控制器 c# 写大文件 c# 浏览pdf c#获取桌面图标的句柄 c# list反射 c# 句柄 进程 c# 倒计时 线程 c# 窗体背景色
立即提问