c++结构体数组内存初始化

memset能够对char数组进行内存初始化,但是怎样对结构体中有int 和double 型数据的数组进行初始化呢?有没有比用for循环效率更高的初始化方法呢?
例如这个结构体
typedef struct QueeNode{
int a;
int b;
int c;
int d;
int e;
int f;
int g;
double T;
}*Quee;

4个回答

 QueeNode Node = {0};

就这样就可以了。。。

QueeNode stQN;
memset(&stQN, 0, sizeof(QueeNode));

hexinlong
hexinlong 回复游 游: 建议double 类型的单独初期化吧
大约 3 年之前 回复
erd8888
IMVector 这样好像对int 型数据可以,但是对double好像不行
大约 3 年之前 回复

typedef struct QueeNode{

QueeNode()
{
memeset(&m, sizeof(M),0x00);
T = 0.0;
}
struct {
int a;
int b;
int c;
int d;
int e;
int f;
int g;
}M m;
double T;
}*Quee;

QueeNode stQN; //直接调用构造函数了

直接调用构造函数就行啊

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c++结构体数组内存初始化

memset能够对char数组进行内存初始化,但是怎样对结构体中有int 和double 型数据的数组进行初始化呢?有没有比用for循环效率更高的初始化方法呢? 例如这个结构体 typedef struct QueeNode{ int a; int b; int c; int d; int e; int f; int g; double T; }*Quee;

C语言关于结构体必须要初始化吗?

``` #include<stdio.h> #include<stdlib.h> struct stu { int a; char b; float c; char arr[10]; }; int main(void) { struct stu st; //memset(st, 0, sizeof(st)); printf("%d\n", st.a); return 0; } ``` 结构体必须要初始化吗?在声明完一个结构体变量后,不是已经在内存中申请了空间了吗,为啥不能够直接输出st.a必须要初始化,虽然不初始化里面的内容 不确定。

关于结构体数组变量作参数的问题

书上说数组都是以传地址的方式进行参数传递的。为什么A,B的输出不同?结构体数组变量s[1] 作为参数和结构体变量成员s作参传递的都是数组,为什么输出不同? A:#include <stdio.h> #include<string.h> typedef struct {char name[10];} STU; void fun(char name[10]) { strcpy(name,"sun"); } int main() { STU s={"qian"}; fun(s.name); printf("%s",s.name); } output:sun B: #include <stdio.h> #include<string.h> typedef struct {char name[10];} STU; void fun(STU t) { strcpy(t.name,"sun"); } int main() { STU s[2]={"qian","zhao"}; fun(s[1]); printf("%s",s[1].name); } output:zhao

C语言怎么给结构体成员动态分配内存?

比如 struct class{ int data[100]; }; 怎么给data数组动态分配内存?用malloc()或calloc()函数。

C语言 struct结构体 发现的一个问题 百思不得其解,求大神为我解惑

# 代码如下 ``` #define _CRT_SECURE_NO_WARNINGS//vs报scanf警告 #include<stdio.h> #include<string.h> struct Student { char name[20]; char age; char sex; }; int main() { struct Student st[] = { {"aaa",25,1},{"bbb",40,0}, {"ccc",30,1},{"ddd",34,1},{"eee",79,0} };//声明且初始化 int num = sizeof(st) / sizeof(st[0]);//计算出成员数量 printf("%d\n", sizeof(st));//这里输出结构体数组st所占的内存大小,这里是110byte,5个成员,每个成员22byte for (int i = 0; i < num; i++)//冒泡排序,以年龄排序 { for (int j = 0; j < num - i; j++) { if (st[j].age > st[j + 1].age) { st[num] = st[j];//这里我突发奇想把大的放置在数组后面,程序运行起来没问题,不知道实际上能不能这样??? st[j] = st[j + 1]; st[j + 1] = st[num]; } } } scanf("%20s", st[5].name);//向数组添加新成员 scanf("%d", &st[5].age); scanf("%d", &st[5].sex); num = sizeof(st) / sizeof(st[0]);//问题来了!这里怎么还是5,不是6呢????那怎么输出新成员的信息呢??? printf("%d\n", sizeof(st)); for (int i = 0; i < num;i++) { printf("%s,%d,%d\n", st[i].name, st[i].age, st[i].sex); } return 0; } ```

为什么要用memset初始化数组的值?为什么不用数组初始化为0?

``` #include<stdio.h> int main(){ int a[5]={0,1,2}; printf("%d\n",a[4]);//初始化元素默认为0,即使没被定义 int b[5];//未初始化元素为随机 printf("%d\n",b[4]); int c[100]={0}; //等价与memset(c, 0, sizeof(int)*100);,而且写起来很快 //那为什么在实际中,大家是用下面的 int c[100]; memset(c, 0, sizeof(int)*100); } ``` 原因一: int c[100]={0},只能初始化为0,memset可以初始化为0或-1

memset清空字符数组失败

string ch[3] = { "abc" }; memset(ch,0,sizeof(ch)); cout << ch[0]<<endl; 字符串数组内存清空,输出为空; 但是! char ch1[3] = { 'a' }; memset(ch1, 0, sizeof(ch1)); cout << ch1[0] << endl; 当运行以上程序时,输出仍是a,为什么memset函数没有清空内存呢?

C++超大整数结构体实现乘法,就像要个乘法,网上的看不懂,希望来回答的能多写点注释或者给我讲讲!菜鸟求大佬

``` #include <stdio.h> #include <iostream> #include <string.h> #include <stdlib.h> #include <algorithm> using namespace std; //我们把输入的两个操作数放在结构体中方便解决 //首先,为了方便后面运算,我们先定义一个结构体把超长整数都定义为此类型 struct doublelong{ int d[1000]; //定义一维数组D int len; //下面定义构造函数,初始化,给予长度 doublelong(){ memset(d,0,sizeof(d)); //memset为初始化函数 数组d sizeof求出的d大小赋予空间 指向要填充的内存块d //d用于存放 输入的两个操作数 //全初始化为0 len=0; } }; //大整数使用字符串输入的, //下面将字符串储存的大整数 //存放在结构体中 doublelong change(char str[]){ doublelong a; a.len=strlen(str);//得出输入的大整数长度写入结构体中 for(int i=0;i<a.len;i++){ a.d[i]=str[a.len-i-1]-'0';//这里把大整数的地位切换为高位 反序 } return a; } //比较两个大整数的大小 int compare(doublelong a,doublelong b){ int g; //greater此处返回更大数字 g的值为1时a的值更大,2时b的值更大,为0时两个数字的值相等 //由于我们此函数只比较两个输入数字的绝对值,由于运算方式是单独判断符号所以不对符号进行比较 if(a.len>b.len){ g=1;return g;//a大于b } else if(a.len<b.len){ g=2; return g;//a<b } else{ for(int i=a.len-1;i>=0;i++) //一位位对比一位位读取向后读 { if(a.d[i]>b.d[i]) { g=1;return g; } if(a.d[i]<b.d[i]) { g=2;return g; } if(a.d[i]=b.d[i]) { g=0;return g; } } } } //下面是大数的四则运算法则 doublelong add(doublelong a,doublelong b) { doublelong c; int carry=0;//这里的carry表示进位 for(int i=0;i<a.len||i<b.len;i++) //循环向后读取相加 { int temp=a.d[i]+b.d[i]+carry; c.d[c.len++]=temp%10; //将我们相加得到的temp值给写入我们的输出大整数c中去 carry=temp/10;//求是否有进位 } if(carry!=0) {//如果最后一位的进位不为0,直接付给结果的最高位 c.d[c.len++] =carry; } return c;//程序结束返回doublelong c } void print(doublelong a) { for(int i=a.len-1;i>=0;i--) { printf("%d",a.d[i]); } } ```

C++:new结构体释放问题

假设有如下几个文件main.c,IRSend.c, IRSend.h 在IRSend.h中定义如下: typedef struct { int recvpin; int rcvstate; int timer; } irparams_t; extern volatile irparams_t *irparams; 在IRSend.c中定义如下: #include "IRSend.h" volatile irparams_t *irparams=new volatile irparams_t; void a() { irparams->recvpin=1; } void b() { irparams->rcvstate=2; } void c() { irparams->timer=2; } 在main.c中定义如下: #include "IRSend.h" void main() { a(); b(); c(); } 请问应在哪个地方delete irparams。

C#调用C++DLL结构体指针传参问题,求大神现身指导,在线等!!!

c++方法: ``` extern "C" _declspec(dllexport) bool GetKE(string CaseId, string CaseText, string &CaseReason, SS *KeList,int &nLen_KeList); ``` c++结构体: ``` typedef struct BriefKE { string KeName; string KeValue; }SS; ``` C#结构体: ``` [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)] public struct BriefKE { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string KeName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string KeValue; } ``` C#函数: ``` [DllImport("KnowledgeExtract.dll", EntryPoint = "GetKE")] [return: MarshalAs(UnmanagedType.Bool)] public unsafe static extern bool GetKE(StringBuilder CaseId, StringBuilder CaseText, ref StringBuilder CaseReason, BriefKE[] infos, ref int nLen_KeList); ``` C#调用: ``` //结构体数组指针初始化 SS[] KeList = new SS[20]; for (int i = 0; i < KeList.Length; i++) { KeList[i] = new SS(); } IntPtr[] ptArray = new IntPtr[1]; ptArray[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SS)) * 20); IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SS))); Marshal.Copy(ptArray, 0, pt, 1); //其他几个参数初始化省略 if (!test.GetKE(caseId, caseText, ref caseReason, infos, ref len)) { Console.WriteLine("读取失败"); Console.ReadLine(); } ``` 总是报下面这个错,请大神给写一个C#调用的例子 ``` “System.AccessViolationException”类型的未经处理的异常在 未知模块。 中发生 其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。 ```

c++编写学生信息管理系统,请大神看看我的程序,怎么解决异常。

#include<iostream> #include<fstream> #include<string> #include<stdio.h> #include<stdlib.h> #include<conio.h> //#include<iomanip> using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define LEN(a) sizeof(a)/sizeof(a[0]) typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。 typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型 #define MAXSIZE 100//顺序表可能达到的最大长度 //学生信息的定义: typedef struct { char no[8]; //8位学号 char name[80]; //姓名 int age;//年龄 int sex; //性别 ElemType price[4]; //成绩 }Student; //顺序表的定义(第一个程序用) typedef struct { Student *elem; //指向数据元素的基地址 int length; //线性表的当前长度 }SqList; int u=0,a=0,b=0,c=0; int i; //初始化顺序表 Status InitList(SqList &L) //构造一个空的顺序表L { //算法2.1 顺序表的初始化 L.elem = new Student[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间 if (!L.elem) exit(OVERFLOW); //存储分配失败退出 L.length = 0; //空表长度为0 return OK; } //从文件中读取数据创建顺序表 Status CreatList(SqList &L){ fstream file("student.txt"); //打开文件进行读写操作 const int Line_Length=100; char str[Line_Length]; //file.open("student.txt"); if (!file) { cout << "未找到相关文件,无法打开!" << endl; exit(ERROR); } //将文件信息读入顺序表 while(file.getline(str,Line_Length)) { cout<<"Read form student.txt:"<<str<<endl; } file.close(); return OK; } //逐个显示表中学生信息 void show(SqList &L) { cout<<"学生信息如下:"<<endl; for(int i=1;i<=L.length;i++){ cout<<"学号"<<L.elem[i].no<<" "<<"姓名:"<<L.elem[i].name<<" " <<"性别:"<<L.elem[i].sex<<" "<<"年龄:"<<L.elem[i].age<<" " <<"成绩:"<<L.elem[i].price[0]<<L.elem[i].price[1] <<L.elem[i].price[2]<<L.elem[i].price[3]<<endl; } } //将学生信息插入表中指定位置 void ListInsert(SqList &L){ int i; cout<<"请输入要插入的位置:"<<endl; cin>>i; if(L.length==MAXSIZE) cout<<"没有内存空间!"<<endl; else if(i<1||i>L.length+1) cout<<"输入位置不正确,请检查!"<<endl; else{ for(int j=L.length;j>=i;j--) L.elem[j+1]=L.elem[j]; cout<<"请分别输入要插入学生的学号,姓名,性别,年龄,四科成绩:"<<endl; cout<<"学生学号:"; cin>>L.elem[i].no; cout<<"学生姓名:"; cin>>L.elem[i].name; cout<<"学生性别:"; cin>>L.elem[i].sex; cout<<"学生年龄:"; cin>>L.elem[i].age; cout<<"学生成绩:"; cin>>L.elem[i].price[0]; cin>>L.elem[i].price[1]; cin>>L.elem[i].price[2]; cin>>L.elem[i].price[3]; cout<<endl; cout<<"插入成功!"<<endl; cout<<"插入的学生信息为:"<<endl; cout<<"学号:"<<L.elem[i].no<<endl; cout<<"姓名:"<<L.elem[i].name<<endl; cout<<"性别:"<<L.elem[i].sex<<endl; cout<<"年龄:"<<L.elem[i].age<<endl; cout<<"成绩:"<<L.elem[i].price[0]<<L.elem[i].price[1] <<L.elem[i].price[2]<<L.elem[i].price[3]<<endl; } } //删除指定学生的信息 Status ListDelete(SqList &L,int i) { FILE *fp; if(i>=0&&i<=L.length) { for(int j=i;j<L.length;j++) { //将指定位置之后的元素依次往前移 L.elem[j-1] =L.elem[j]; } --L.length; } else{ printf("输入的位置有误!"); } fp=fopen("Database.txt","w"); if(fp==NULL) { printf("文件无法打开!\n"); exit(ERROR); } return OK; } //统计表中学生个数 int GetLength(SqList L){ return L.length; } //直接排序 void InsertSort(SqList &L){ for(int i=2;i<=L.length;i++){ if(strcmp(L.elem[i].name,L.elem[i-1].name)<0) { L.elem[0]=L.elem[i]; L.elem[i]=L.elem[i-1]; for(int j=i-2;strcmp(L.elem[0].name,L.elem[j].name)<0;j--) { L.elem[j+1]=L.elem[j]; L.elem[j]=L.elem[0]; } } } a=1; } //快速排序 int Partition(SqList &L,int low,int high) { char pivotkey[10]; //设置关键字pivotkey L.elem[0]=L.elem[low];// 把表的第一个记录作为枢轴 strcpy(pivotkey,L.elem[low].no);//将学号作为关键字放入pivotkey中保存 while(low< high) { while((low<high)&&(L.elem[high].no>=pivotkey)) --high; L.elem[low]=L.elem[high]; while((low<high)&&(L.elem[low].no<=pivotkey)) ++low; L.elem[high]=L.elem[low]; } L.elem[low]=L.elem[0]; return low; } void QSort(SqList &L,int low,int high) { if(low<high) { int pivotloc=Partition(L,low,high); QSort(L,low,pivotloc-1); //对低子表递归排序,pivotloc是枢轴位置 QSort(L,pivotloc+1,high); //对高子表递归排序 } } void QuickSort(SqList &L) { QSort(L,1,L.length); } //根据姓名进行折半查找,使用递归,返回学生学号和成绩。 int Search_Dname(SqList &L,char a[],int low,int high) { low=1; high=L.length; int mid=(low+high)/2; if(strcmp(a,L.elem[mid].name)==0) return mid; if(strcmp(a,L.elem[mid].name)<0) return Search_Dname(L,a,low,mid-1); if(strcmp(a,L.elem[mid].name)>0) return Search_Dname(L,a,mid+1,high); return 0; } //根据姓名进行折半查找,不使用递归,返回学生的学号和成绩。 int Search_No(SqList &L,char b[]) { int mid; int low=1; int high=L.length; while(low<=high){ mid=(high+low)/2; if(strcmp(b,L.elem[mid].name)==0) return mid; else if(strcmp(b,L.elem[mid].name)<0) high=mid-1; else low=mid+1; } return 0; } void stop(){ char i; cout<<"您真的要退出程序吗 ?"<<endl; cout<<"1"<<"确定"; cout<<"2"<<"取消"; cin>>i; switch(i){ case '1':cout<<"谢谢使用!"<<endl;exit(0); case '2':break; default: cout<<"输入错误!"<<endl; cin>>i;break; } } //主函数 void main(){ //freopen("student.txt","r","stdin"); //freopen("student2.txt","w",stdout); //int no; int n; SqList L; while(1){ cout<<"*************欢迎使用学生信息查询系统******************"<<endl; cout<<"1.初始化顺序表。"<<endl; cout<<"2.从文件中读取创建顺序表。"<<endl; cout<<"3.逐个显示学生相关信息。"<<endl; cout<<"4.插入学生信息到指定位置。"<<endl; cout<<"5.删除指定位置学生。"<<endl; cout<<"6.统计表中学生人数。"<<endl; cout<<"7.直接插入排序按学生姓名排序。"<<endl; cout<<"8.快速排序按学生学号排序。"<<endl; cout<<"9.根据姓名进行折半查找(递归)。"<<endl; cout<<"10.跟学号进行折半查找(非递归)。"<<endl; cout<<"0.退出系统。"<<endl; cout<<endl;//设置菜单栏 cout<<"请选择您需要的服务:"; cin>>n; switch(n) { case 1: if (InitList(L)) cout << "成功建立顺序表\n\n"; else cout << "顺序表建立失败\n\n"; break; case 2: CreatList(L); cout<<"读入文件成功!"<<endl;break; case 3: if(u){ show(L); getch(); } case 4: if(u){ ListInsert(L); getch(); }else cout<<"请先读入文件!"<<endl;break; case 5: if(u){ int i; ListDelete(L,i); getch(); }else cout<<"请先读入文件!"<<endl;break; case 6: { if(u){ int i=GetLength(L); cout<<"学生总人数为:"<<i<<"个"<<endl;break; } case 7: if(u){ InsertSort(L); b=0; cout<<"直接插入排序成功,按姓名从小到大排序为:"<<endl; for(int k=1;k<=L.length;k++){ cout<<"学号"<<L.elem[i].no<<" "<<"姓名:"<<L.elem[i].name<<" " <<"性别:"<<L.elem[i].sex<<" "<<"年龄:"<<L.elem[i].age<<" " <<"成绩:"<<L.elem[i].price[0]<<L.elem[i].price[1] <<L.elem[i].price[2]<<L.elem[i].price[3]<<endl; getch(); } } else cout<<"请先读入文件!"<<endl;break; } case 8: if(u){ QSort(L,1,L.length); a=1; cout<<"快速排序成功,按学号从小到大输出如下:"<<endl; for(int k=1;k<=L.length;k++){ cout<<"学号"<<L.elem[i].no<<" "<<"姓名:"<<L.elem[i].name<<" " <<"性别:"<<L.elem[i].sex<<" "<<"年龄:"<<L.elem[i].age<<" " <<"成绩:"<<L.elem[i].price[0]<<L.elem[i].price[1] <<L.elem[i].price[2]<<L.elem[i].price[3]<<endl; } getch(); }else cout<<"请先读入文件!"<<endl;break; case 9: if(u==0) cout<<"请先读入文件!"<<endl; else if(u==1&&a==0) cout<<"请先使用命令6进行排序。"<<endl; else{ char a[20]; cout<<"请输入你要查找的学生名字:"; cin>>a; int i; i=Search_Dname(L,a,0,L.length); if(i>=0) cout<<"您查找的学生个人信息为:学号"<<L.elem[i].no<<" "<<"姓名:"<<L.elem[i].name<<" " <<"性别:"<<L.elem[i].sex<<" "<<"年龄:"<<L.elem[i].age<<" " <<"成绩:"<<L.elem[i].price[0]<<L.elem[i].price[1] <<L.elem[i].price[2]<<L.elem[i].price[3]<<endl; else cout<<"学生不存在!"<<endl; getch(); }break; case 10: if(u==0) cout<<"请先读入文件!"<<endl; else if(u==1&&a==0) cout<<"请先使用命令7进行排序。"<<endl; else{ char b[10]; cout<<"请输入您要查找的学生学号:"; cin>>b; int j=Search_No(L,b); if(j>=0) cout<<"您查找的学生个人信息为:学号"<<L.elem[i].no<<" "<<"姓名:"<<L.elem[i].name<<" " <<"性别:"<<L.elem[i].sex<<" "<<"年龄:"<<L.elem[i].age<<" " <<"成绩:"<<L.elem[i].price[0]<<L.elem[i].price[1] <<L.elem[i].price[2]<<L.elem[i].price[3]<<endl; else cout<<"学生不存在!"<<endl; getch(); }break; case 0:cout<<endl; stop();break; default: cout<<"输出错误!"<<endl;break; } cout<<endl; } }

c问题---关于数组溢出

今天在做题时,发现定义整型数组a[10],并赋初值,然后我访问a[11],输出0,再a[11]=3后访问a[11],输出3,a的长度还是10,那么a[11]存在哪里了?

C数据结构顺序表操作问题

两种操作方式 一、利用点运算符访问 ``` #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef struct { int data[MAXSIZE]; //存放数组元素 int last; //数组的最后一个元素的下标 }squeuelist; squeuelist l={0}; int main(void) { int choice=0, mount=0, i=0, dat=0, pos=0; while(1) { printf(" 线性顺序表操作练习\n"); printf("1.创建一个顺序表\n"); printf("2.插入数据\n"); printf("3.删除数据\n"); printf("4.打印顺序表\n"); printf("5.退出\n"); printf("请输入你的选择(1-5):"); scanf("%d",&choice); switch(choice) { case 1: printf("请输入你要创建的元素个数:"); scanf("%d", &mount); if(mount>MAXSIZE) { printf("创建的个数大于规定范围!"); break; } printf("请输入数据:"); for(i=0; i<mount; i++) { scanf("%d",&l.data[i]); } l.last = mount-1; break; //插入操作 case 2: printf("请输入要插入的元素值及所在位置(位置1表示元素0,依次类推):"); scanf("%d %d", &dat, &pos); if(l.last>MAXSIZE-1) { printf("空间溢出!\n"); break; } else if(pos<1 || pos>l.last+2) { printf("插入的位置非法!\n"); break; } else { for(i=l.last; i>=pos-1;i--) { l.data[i+1] = l.data[i]; } l.data[pos-1] = dat; l.last += 1; } break; //删除操作 case 3: printf("请输入你要删除元素所在的位置(位置1代表元素0,依次类推):"); scanf("%d",&pos); if(pos<1 || pos>l.last+1) { printf("输入的位置无效!\n"); break; } else { for(i=pos; i<=l.last; i++) { l.data[i-1] = l.data[i]; } l.last -= 1; } break; //打印输出顺序表 case 4: if (mount<=0) { printf("No data!\n"); break; } printf("顺序表为:"); for(i=0; i<=l.last; i++) { printf("%d ", l.data[i]); } printf("\n"); printf("顺序表的个数为:%d\n",l.last+1); break; //退出程序 case 5: exit(0); break; default: break; } } return 1; } ``` 这种访问方式能够成功! 第二种方式利用指针访问 ``` #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef struct { int data[MAXSIZE]; //存放数组元素 int last; //数组的最后一个元素的下标 }squeuelist; squeuelist *l=NULL; int main(void) { int choice=0, mount=0, i=0, dat=0, pos=0; while(1) { printf(" 线性顺序表操作练习\n"); printf("1.创建一个顺序表\n"); printf("2.插入数据\n"); printf("3.删除数据\n"); printf("4.打印顺序表\n"); printf("5.退出\n"); printf("请输入你的选择(1-5):"); scanf("%d",&choice); switch(choice) { case 1: printf("请输入你要创建的元素个数:"); scanf("%d", &mount); if(mount>MAXSIZE) { printf("创建的个数大于规定范围!"); break; } printf("请输入数据:"); for(i=0; i<mount; i++) { scanf("%d",&l->data[i]); } l->last = mount-1; break; //插入操作 case 2: printf("请输入要插入的元素值及所在位置(位置1表示元素0,依次类推):"); scanf("%d %d", &dat, &pos); if(l->last>MAXSIZE-1) { printf("空间溢出!\n"); break; } else if(pos<1 || pos>l->last+2) { printf("插入的位置非法!\n"); break; } else { for(i=l->last; i>=pos-1;i--) { l->data[i+1] = l->data[i]; } l->data[pos-1] = dat; l->last += 1; } break; //删除操作 case 3: printf("请输入你要删除元素所在的位置(位置1代表元素0,依次类推):"); scanf("%d",&pos); if(pos<1 || pos>l->last+1) { printf("输入的位置无效!\n"); break; } else { for(i=pos; i<=l->last; i++) { l->data[i-1] = l->data[i]; } l->last -= 1; } break; //打印输出顺序表 case 4: if (mount<=0) { printf("顺序表无数据!\n"); break; } printf("顺序表为:"); for(i=0; i<=l->last; i++) { printf("%d ", l->data[i]); } printf("\n"); printf("顺序表的个数为:%d\n",l->last+1); break; //退出程序 case 5: exit(0); break; default: break; } } return 1; } ``` 当运行创建一个顺序表时,显示出错,报指令引用的“0x00000000”内存,该内存不能被“written”。 求大神帮忙分析下~

c++对象内存分配的问题,如何确定在堆上还是在栈上?

c++中对象内存放堆上还是在栈上是不是根据对象实例化的方法,如: A a; //在栈中分配内存 A * a = new A(); //动态内存分配,在堆上 要是这样,如果我尽量不用指针的话(这样程序风格似乎更加清晰一些),那是不是对象都分配到栈上了?这有什么弊端吗?栈的空间是不是很有限?是不是为了栈空间的问题我们必须尽量多用new分配内存呢?类成员是不是也要多用指针呢?

关于c语言从文件中读取学生信息,处理并打印

![图片说明](https://img-ask.csdn.net/upload/201712/07/1512617928_774992.png) b) 建议函数流程: i. 打开数据文件,失败返回-1; ii. 从头到尾扫描数据文件(即预读一遍)获得学生人数; iii. 根据学生人数,利用malloc和sizeof等函数或运算符为struct student** pStudents分配内存; iv. 利用rewind函数,定位到文件头; v. 读取数据文件,并把每一条记录通过数组下标法或指针法保存到结构体数组pStudents中; vi. 关闭文件; vii. 返回学生人数。 c) 数据文件格式说明: 一行一条学生信息的记录,不同属性用空格隔开,输入数据中无总成绩记录,例如: 张三 通信 89 93 95 李四 网络 88 91 94 王五 物联网 71 94 88 3. 编写统计函数: a) 函数定义void Count(struct student pStudents[], int num)。输入参数分别为保存学生的结构体数组和学生人数。 b) 功能为:统计所有学生的总成绩和每个专业(假定一共三个专业:通信,网络,物联网)的平均成绩;输入参数包括学生信息结构体数组,学生人数,返回的每个学生的总成绩直接填充到对应的输入结构体数组对应字段中。统计信息包括三个专业的总人数、平均成绩数组,用全局变量来表示。访问每个学生信息的时候,用指针来指向当前正在处理的学生。 c) 设计一个或者三个带参数的宏,判断输入的字符串是否是指定的专业名称,并在函数Count中使用。 5. 编写main函数实现: a) 定义变量,其中保存学生信息的数据文件直接在源代码中初始化; b) 读取学生信息,如果失败,打印失败信息并退出程序; c) 统计学生信息; d) 输出统计信息。 e) 释放内存。 ``` #include <stdio.h> #include <stdlib.h> #include <string.h> struct student{ char name[15]; char major[15]; int Eng_sco; int cal_sco; int c_sco; int sum; }; int tx_per=0,tx_ave,tx_sum=0; int wl_per=0,wl_ave,wl_sum=0; int wlw_per=0,wlw_ave,wlw_sum=0; int ReadStudentInfo(const char* filename, struct student** pStudents); void Count(struct student pStudents[], int num); int main() { int count; int m; struct student *list; count=ReadStudentInfo("readme.txt", &list); printf("学生信息: \n"); printf("----------------------------------------------------\n"); printf("序号 姓 名 专业名称 英语成绩 线性代数成绩 c语言成绩 总成绩\n"); for(m=1;m<=count;m++) { printf("%4d %s %s %4d %4d %4d %4d\n",m,(list+m-1)->name,(list+m-1)->major,(list+m-1)->Eng_sco,(list+m-1)->cal_sco,(list+m-1)->c_sco,(list+m-1)->sum); } Count(list, count); printf("\n统计信息 :\n"); printf("----------------------------------------------------\n"); printf("序号 专业名称 学生人数 平均成绩\n"); printf(" 1 通信 %d %d\n",tx_per,tx_ave); printf(" 2 网络 %d %d\n",wl_per,wl_ave); printf(" 3 物联网 %d %d\n",wlw_per,wlw_ave); return 0; } int ReadStudentInfo(const char* filename, struct student** pStudents) { FILE *fp; char ch; int i=1,j; fp=fopen(readme.txt,"r"); if(fp==NULL) { printf("cann't open the file"); exit(-1); } ch=fgetc(fp); while(ch!=EOF) { if(ch=='\n') { i++; } ch=fgetc(fp); } rewind(fp); *pStudents=(struct student*)malloc(sizeof(** pStudents)*i); for(j=0;j<i;j++) { fread(&*pStudents[j],sizeof(struct student)-sizeof(int),1,fp); (*pStudents+j)->sum=((*pStudents+j)->Eng_sco+(*pStudents+j)->cal_sco+(*pStudents+j)->c_sco); } fclose(fp); return i; } void Count(struct student pStudents[], int num) { int n=1; for(n=1;n<=num;n++) { if(!strcmp((pStudents+n-1)->major,"通信")) { tx_per++; tx_sum=tx_sum+(pStudents+n-1)->sum; } if(!strcmp((pStudents+n-1)->major,"网络")) { wl_per++; wl_sum=wl_sum+(pStudents+n-1)->sum; } if(!strcmp((pStudents+n-1)->major,"物联网")) { wlw_per++; wlw_sum=wlw_sum+(pStudents+n-1)->sum; } tx_ave=tx_sum/tx_per; wl_ave=wl_sum/wl_per; wlw_ave=wlw_sum/wlw_per; } free(pStudents); } ``` 运行不起来,是哪里出问题了?

C++多线程内存泄漏问题

在主线程用AfxBeginThread开启子线程时,偶尔会报内存泄漏的错误(单线程没问题) 不是频繁报,10次有1~2次的样子,debug我也不知道怎么跟踪,怀疑是锁的问题加上 CCriticalSection cs; cs.Lock();cs.Unlock();后发现还是不行,求助! ``` /*结构体*/ typedef struct _dlgTag { int nIdx; CString strName; } DLGTAG; /*主线程代码*/ //初始化数组 m_Table.clear(); m_Table.swap(vector<vector<CString>>()); m_Table.resize(nLineCount); for (int i = 0; i < nLineCount; i++) { m_Table[i].resize(3); } //遍历 nThreadNum = 0; nThreadAll = 30; for (int i = 0; i < nLineCount; i++) { //多线程工作 if (nThreadNum < nThreadAll) { DLGTAG *dd = new DLGTAG(); dd->nIdx = i; dd->strName = strLine; AfxBeginThread(LoopWorkThread, (LPVOID)dd); nThreadNum++; continue; } //轮巡线程池 while (1) { int nNull = 0, nBegin = i - nThreadAll, nEnd = i; switch (nBegin) { case 0: nBegin++; nEnd++; break; default: break; } for (int j = nBegin; j < nEnd; j++) { if (m_Table[j][1].IsEmpty()) { nNull++; Sleep(100); } } //已完成数 if (nThreadAll - nNull > 0) { nThreadNum = nNull; i--; break; } } } //遍历结束检查线程是否全部执行完毕 while (1) { int nNull = 0, nDone = 0; for (int i = 0; i < nLineCount; i++) { if (m_Table[i][1].IsEmpty()) { nNull++; Sleep(100); } } nDone = nLineCount - nNull; if (nDone >= nLineCount) { break; } } /*子线程LoopWorkThread代码*/ CCriticalSection cs; UINT LoopWorkThread(LPVOID pParam) { DLGTAG* dlg = (DLGTAG*)pParam; CString strFlag = TestTest(dlg->nIdx, dlg->strName); if (strFlag == "成功") { cs.Lock(); m_Table[dlg->nIdx][2] = 业务代码... } m_Table[dlg->nIdx][1] = strFlag; cs.Unlock(); delete dlg; return 0; } ```

用ctypes向dll传入的数组,返回python后,其中的数据有时正确有时错误,怎么办?

运行环境: win10 + anaconda5.3 + jupyter python文件 ``` import numpy as np import pandas as pd mylib = ctypes.cdll.LoadLibrary('mydll.dll') C_fun = mylib.func_name C_fun.restypes = None C_fun.argtypes = pass_args_Struct, c_double*10 # pass_args_Struct 是继承ctypes.Structure定义的结构体,代码略 def generate_Struct(data, 其他参数略): # 生成 pass_args_Struct,代码略 # data是个DataFrame,用于接收下面myClass的data属性 class myClass(): # myclass有个data属性,data是一个DataFrame # 其他代码略 def func1(self, x): # 删除self.data的一列,再根据x参数重新添加这一列,代码略 struct_x = generate_Struct(self.data, 其他参数略) myArr = (c_double*10)() C_fun(struct_x, myArr) npArr = np.ctypeslib.as_array(myArr,(10,)) return pd.Series(npArr, _column_names) # _column_names 定义略 def func2(self): # 生成df,df是个只有一列值的DataFrame,代码略 return df.apply(lamba x: self.func1(x[0]), axis=1, result_type='expand')) # 其他代码略 ``` mydll.dll中的代码 ``` #define API extern "C" __declspec(dllexport) typedef pass_args_Struct { // 对应于python中pass_args_Struct,代码略 } API void func_name(pass_args_Struct* x, double arr[]) { // 对arr进行一些操作,代码略 } ``` 在jupyter中: 导入前述Python文件并生成 myObject=myClass() 之后, 执行ret1 = myObject.func1()没什么问题, 但是ret2 = myObject.func2()的结果则有时正确有时错误,错误的时候,ret2中会出现一些NaN值和错误的值。 之前把generate_Struct()定义成myclass的一个方法,连ret1也会出错; 之前的func1(self, x)中采用: ``` func1(self, x): # 其他代码略 myArr = np.ctypeslib.as_array(myArr,(10,)) # 左边不用新名而直接用myArr return pd.Series(myArr, _column_names) ``` 则ret1会频繁出错,基本上是对一次就错一次。 程序一直能运行,只是结果有时不正确。 请教各位大牛,正确的写法是什么样子的? ==================================================== =====2018年11月30日更新==================================== 我可能发现问题了: Python文件TestX.py(放在PYTHONPATH下): ``` import numpy as np from ctypes import Structure, c_double, c_int, POINTER class struct_args(Structure): _fields_ = [('data',POINTER(c_double*2)), ('rows',c_int)] class test(): def __init__(self): self.data = None def get_args_2C(self): arr = np.ascontiguousarray(self.data[['foo','bar']].values, dtype=np.float) rows = c_int(arr.shape[0]) return struct_args(arr.ctypes.data_as(POINTER(c_double*2)), rows) ``` 在jupyter中: ``` import TestX import pandas as pd import numpy as np mydata = pd.DataFrame(np.arange(1600).reshape(800,2),columns=['foo','bar']) # 行数不要太小 mytest = TestX.test() mytest.data = mydata args = mytest.get_args_2C() np.ctypeslib.as_array(args.data,(800,)) ``` 输出的值经常是错误的。 ==================================================== =====2018年12月3日更新==================================== 不知道为什么,但总算是不出错了: python文件: ``` from ctypes import Structure,POINTER,c_double def Struct_A(ctypes.Structure): _fields_ = [(), # 其他成员略 ('my_arr',POINTER(c_double)] # 这个地方用c_double*10后面也会出错 class myClass(): def makeStructA(self, 其他参数): arr = (c_double*10)() SA = Struct_A(……,arr) # 其他成员略 return SA def myMethod(self, 其他参数): SA = self.makeStructA(其他参数) # myCfun是dll中的函数,功能是利用SA中数据进行一些计算,然后把结果写入SA.my_arr,具体代码略 myCfun(SA) ret = pd.Series(np.ctypeslib.as_array(SA.my_arr,(10,)), _columns_name) ret['odd'] = 1 # 这里随便新加点什么就不会出错了 return ret ``` 以上代码如果没有ret['odd']=1那一行,则myObject.myMethod()返回的Series中都是错误的值(看着像是内存未初始化,比如-2.24934335e308之类),而随便给ret添加点什么内容,返回值就是正确的了。 但是在以下计算中仍然会出错,只是出错的频率变小了,而且多运行几次就会正确: ``` class myClass(): # 接上文 def myOptimize(self, arg_name, arg_range): ret = pd.DataFrame({arg_name:arg_range}) _optimize = lambda arg: self.myMethod(**{arg_name:arg[arg_name]}) return ret.join(ret.apply(_optimize, axis=1, result_type='expand')) ``` ===================================== =====2018年12月7日更新==================================== 又出错了!!!12月3日写的: ``` ret['odd'] = 1 # 这里随便新加点什么就不会出错了 ``` 那个函数确实不出错了,但是别的函数用同样的写法(先生成c_double*shape再传入dll在C中写入值)得到的ret无论添加行还是添加列,多运行几次总会出错(内存被清理)。 换一种写法: ``` 略 arr=np.zeros(shape) 略 # 然后传入arr.ctypes.data_as(POINTER(c_double*10)) ``` 目前暂时不出错了。 =====2018年12月13日更新==================================== 前面的写法有问题:用函数生成结构体(比如makeStructA)再传递给dll就会出错,直接将makeStuctA的代码放到myMethod中就不会出错。 另外,传递结构体时用byref就不会出错了,在dll中用malloc给结构体的成员赋值都不会出错。

急急c++课程设计,关于考勤统计的,我完成大部分就只差排序了,求帮助完成排序。

二、 课程设计的主要内容 功能描述:某实验室对研究生每天的科研时间进行管理,研究生每天进入实验室时记录其到达时间,离开实验室时记录其离开时间。两个时间之间的时间段作为其当天的科研工作时间。请你为其设计一个考勤管理系统,该系统需要提供下列功能: (1) 研究生信息录入功能,提示用户逐项输入研究生信息(时、分、秒分三次逐项输入),并检查输入信息的合法性(如时、分、秒的取值范围),同时以分为单位计算每位同学的科研时间; (2) 考勤信息浏览功能,显示所有研究生的考勤情况;例如: ---------------------------------------------------------------------------------------------------------------------- 学号 姓名 到达时间 离开时间 科研时间 排名 ---------------------------------------------------------------------------------------------------------------------- 201101 张三 08:00:00 17:12:00 492 3 201102 李四 09:10:20 17:30:20 500 2 201103 王五 08: 10:20 16:10:20 540 1 ---------------------------------------------------------------------------------------------------------------------- (3) 排序功能,按科研时间长短进行排序并显示 提示: (1) 使用数组、结构体 (2) 使用排序算法 ``` // 课程设计.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "iostream" #include "string" #include "iomanip" #include "vector" #include<fstream> #include<algorithm> #include<iomanip> using namespace std; class student{ protected: string name;//姓名 string studentId;//学号 int hour;//签到小时 int minute;//签到分钟 int second;//签到秒数 int chour;//签退小时 int cminute;//签退分钟 int csecond;//签退秒数 int researchTime[100];//科研时间 int ranking;//排名 public: /*构造函数 初始化变量*/ student(){ name = ""; studentId = ""; hour = 0; minute = 0; second = 0; chour = 0; cminute = 0; csecond = 0; ranking = 0; researchTime[100] = 0; } bool set_name(string); bool set_studentId(string); bool set_hour(int); bool set_minute(int); bool set_second(int); bool set_chour(int); bool set_cminute(int); bool set_csecond(int); bool set_researchTime(int); bool set_ranking(int); string get_name(); string get_studentId(); int get_hour(); int get_minute(); int get_second(); int get_chour(); int get_cminute(); int get_csecond(); int get_researchTime(); int get_ranking(); }; bool student::set_studentId(string ID){ studentId = ID; return true; } bool student::set_name(string na){ name = na; return true; } bool student::set_hour(int ho){ hour = ho; return true; } bool student::set_minute(int mi){ minute = mi; return true; } bool student::set_second(int se){ second = se; return true; } bool student::set_chour(int cho){ chour = cho; return true; } bool student::set_cminute(int cmi){ cminute = cmi; return true; } bool student::set_csecond(int cse){ csecond = cse; return true; } bool student::set_researchTime(int res){ researchTime[10] = res; return true; } bool student::set_ranking(int ran){ ranking = ran; return true; } string student::get_studentId(){ return studentId; } string student::get_name(){ return name; } int student::get_hour(){ return hour; } int student::get_minute(){ return minute; } int student::get_second(){ return second; } int student::get_chour(){ return chour; } int student::get_cminute(){ return cminute; } int student::get_csecond(){ return csecond; } int student::get_researchTime(){ return researchTime[10]; } int student::get_ranking(){ return ranking; } void drow(){ cout << endl; cout << "********考勤统计********" << endl; cout << " " << "请输入相应字母进行操作!" << endl; cout << " " << "L:信息录入(Log in)" << endl; cout << " " << "O:输出(Output)" << endl; cout << " " << "E:退出(Exit)" << endl; cout << "************************" << endl; } student *Registration(){ student *temp; string info; int timeIn = NULL; temp = new student; cout << "你的学号" << endl; cin >> info; temp->set_studentId(info); cout << "你的姓名" << endl; cin >> info; temp->set_name(info); cout << "***到达时间(按提示依次录入时,分,秒)***" << endl; cout << "到达整点" << endl; cin >> timeIn; if (timeIn >= 0 && timeIn < 24){ temp->set_hour(timeIn); } else { cout << "输入有误,请重新输入" << endl; cin >> timeIn; temp->set_hour(timeIn); } cout << "到达分钟" << endl; cin >> timeIn; if (timeIn >= 0 && timeIn < 60){ temp->set_minute(timeIn); } else{ cout << "输入有误,请重新输入" << endl; cin >> timeIn; temp->set_minute(timeIn); } cout << "到达秒数" << endl; cin >> timeIn; if (timeIn >= 0 && timeIn < 60){ temp->set_second(timeIn); } else {cout << "输入有误,请重新输入" << endl; cin >> timeIn; temp->set_second(timeIn); } cout << "***离开时间(按提示依次录入时,分,秒)***" << endl; cout << "离开整点" << endl; cin >> timeIn; if (timeIn >= 0 && timeIn < 24){ temp->set_chour(timeIn); } else { cout << "输入有误,请重新输入" << endl; cin >> timeIn; temp->set_chour(timeIn); } cout << "离开分钟" << endl; cin >> timeIn; if (timeIn >= 0 && timeIn < 60){ temp->set_cminute(timeIn); } else{ cout << "输入有误,请重新输入" << endl; cin >> timeIn; temp->set_cminute(timeIn); } cout << "离开秒数" << endl; cin >> timeIn; if (timeIn >= 0 && timeIn < 60){ temp->set_csecond(timeIn); } else { cout << "输入有误,请重新输入" << endl; cin >> timeIn; temp->set_csecond(timeIn); } cout << endl << "信息录入成功=^_^=" << endl; return temp; } void ResearchTime(student *temp){ int reschT = ((temp->get_chour()) * 60 + temp->get_cminute()) - ((temp->get_hour()) * 60 + temp->get_minute()) ; temp->set_researchTime(reschT); int i = 0; i += 1; temp->set_ranking(i); } void save(student *temp){ ofstream os;//文件操作 os.open("outfile.txt",ios::app); os << endl; os << setw(2) << "学生学号:" << temp->get_studentId() << endl; os << setw(2) << "学生姓名:" << temp->get_name() << endl; os << setw(2) << "签到时间:" << setw(2) << setfill('0') << temp->get_hour(); os << ":" << setw(2) << setfill('0') << temp->get_minute() << ":"; os << setw(2) << setfill('0') << temp->get_second() << endl; os << setw(2) << "签退时间:" << setw(2) << setfill('0') << temp->get_chour(); os << ":" << setw(2) << setfill('0') << temp->get_cminute() << ":"; os << setw(2) << setfill('0') << temp->get_csecond() << endl; os << setw(2) << "科研时间:" << temp->get_researchTime() << endl; os << setw(2) << "时间排名:" << temp->get_ranking() << endl; temp++; os.close(); } void read(){ filebuf *pbuf; ifstream is; long size; char *buffer; if (!is){ cout << "读取不到" << endl; } //采用二进制读取整个文件 is.open("outfile.txt", ios::binary); // 获取filestr对应buffer对象的指针 pbuf = is.rdbuf(); // 调用buffer对象方法获取文件大小 size = pbuf->pubseekoff(0, ios::end, ios::in); pbuf->pubseekpos(0, ios::in); // 分配内存空间 buffer = new char[size]; // 获取文件内容 pbuf->sgetn(buffer, size); is.close(); // 输出到标准输出 cout.write(buffer, size); delete[]buffer; } int _tmain(int argc, _TCHAR* argv[]) { student s; student *temp=NULL; int i = 1; char input = 'e'; input = 'i'; while (input != 'e'){ drow(); cin >> input; input = tolower(input);//大写转义为小写 switch (input) { case 'l': cout << "信息录入:" << endl; temp = Registration(); ResearchTime(temp); save(temp); break; case 'o': read(); cout << endl << "信息读取成功=^_^= ,按提示信息进行其他操作" << endl; break; case'e': cout << "谢谢使用,再见!" << endl; std::system("pause"); std::exit(0); break; default: cout << "输入有误" << endl; break; } } std::system("pause"); return 0; } ```

急 c++课程设计排序问题。要求如下:

二、 课程设计的主要内容 功能描述:某实验室对研究生每天的科研时间进行管理,研究生每天进入实验室时记录其到达时间,离开实验室时记录其离开时间。两个时间之间的时间段作为其当天的科研工作时间。请你为其设计一个考勤管理系统,该系统需要提供下列功能: (1) 研究生信息录入功能,提示用户逐项输入研究生信息(时、分、秒分三次逐项输入),并检查输入信息的合法性(如时、分、秒的取值范围),同时以分为单位计算每位同学的科研时间; (2) 考勤信息浏览功能,显示所有研究生的考勤情况;例如: ---------------------------------------------------------------------------------------------------------------------- 学号 姓名 到达时间 离开时间 科研时间 排名 ---------------------------------------------------------------------------------------------------------------------- 201101 张三 08:00:00 17:12:00 492 3 201102 李四 09:10:20 17:30:20 500 2 201103 王五 08: 10:20 16:10:20 540 1 ---------------------------------------------------------------------------------------------------------------------- (3) 排序功能,按科研时间长短进行排序并显示 提示: (1) 使用数组、结构体 (2) 使用排序算法 ``` // 课程设计.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "iostream" #include "string" #include "iomanip" #include "vector" #include<fstream> #include<algorithm> #include<iomanip> using namespace std; class student{ protected: string name;//姓名 string studentId;//学号 int hour;//签到小时 int minute;//签到分钟 int second;//签到秒数 int chour;//签退小时 int cminute;//签退分钟 int csecond;//签退秒数 int researchTime[100];//科研时间 int ranking;//排名 public: /*构造函数 初始化变量*/ student(){ name = ""; studentId = ""; hour = 0; minute = 0; second = 0; chour = 0; cminute = 0; csecond = 0; ranking = 0; researchTime[100] = 0; } bool set_name(string); bool set_studentId(string); bool set_hour(int); bool set_minute(int); bool set_second(int); bool set_chour(int); bool set_cminute(int); bool set_csecond(int); bool set_researchTime(int); bool set_ranking(int); string get_name(); string get_studentId(); int get_hour(); int get_minute(); int get_second(); int get_chour(); int get_cminute(); int get_csecond(); int get_researchTime(); int get_ranking(); }; bool student::set_studentId(string ID){ studentId = ID; return true; } bool student::set_name(string na){ name = na; return true; } bool student::set_hour(int ho){ hour = ho; return true; } bool student::set_minute(int mi){ minute = mi; return true; } bool student::set_second(int se){ second = se; return true; } bool student::set_chour(int cho){ chour = cho; return true; } bool student::set_cminute(int cmi){ cminute = cmi; return true; } bool student::set_csecond(int cse){ csecond = cse; return true; } bool student::set_researchTime(int res){ researchTime[10] = res; return true; } bool student::set_ranking(int ran){ ranking = ran; return true; } string student::get_studentId(){ return studentId; } string student::get_name(){ return name; } int student::get_hour(){ return hour; } int student::get_minute(){ return minute; } int student::get_second(){ return second; } int student::get_chour(){ return chour; } int student::get_cminute(){ return cminute; } int student::get_csecond(){ return csecond; } int student::get_researchTime(){ return researchTime[10]; } int student::get_ranking(){ return ranking; } void drow(){ cout << endl; cout << "********考勤统计********" << endl; cout << " " << "请输入相应字母进行操作!" << endl; cout << " " << "L:信息录入(Log in)" << endl; cout << " " << "O:输出(Output)" << endl; cout << " " << "E:退出(Exit)" << endl; cout << "************************" << endl; } student *Registration(){ student *temp; string info; int timeIn = NULL; temp = new student; cout << "你的学号" << endl; cin >> info; temp->set_studentId(info); cout << "你的姓名" << endl; cin >> info; temp->set_name(info); cout << "***到达时间(按提示依次录入时,分,秒)***" << endl; cout << "到达整点" << endl; cin >> timeIn; if (timeIn >= 0 && timeIn < 24){ temp->set_hour(timeIn); } else { cout << "输入有误,请重新输入" << endl; cin >> timeIn; temp->set_hour(timeIn); } cout << "到达分钟" << endl; cin >> timeIn; if (timeIn >= 0 && timeIn < 60){ temp->set_minute(timeIn); } else{ cout << "输入有误,请重新输入" << endl; cin >> timeIn; temp->set_minute(timeIn); } cout << "到达秒数" << endl; cin >> timeIn; if (timeIn >= 0 && timeIn < 60){ temp->set_second(timeIn); } else {cout << "输入有误,请重新输入" << endl; cin >> timeIn; temp->set_second(timeIn); } cout << "***离开时间(按提示依次录入时,分,秒)***" << endl; cout << "离开整点" << endl; cin >> timeIn; if (timeIn >= 0 && timeIn < 24){ temp->set_chour(timeIn); } else { cout << "输入有误,请重新输入" << endl; cin >> timeIn; temp->set_chour(timeIn); } cout << "离开分钟" << endl; cin >> timeIn; if (timeIn >= 0 && timeIn < 60){ temp->set_cminute(timeIn); } else{ cout << "输入有误,请重新输入" << endl; cin >> timeIn; temp->set_cminute(timeIn); } cout << "离开秒数" << endl; cin >> timeIn; if (timeIn >= 0 && timeIn < 60){ temp->set_csecond(timeIn); } else { cout << "输入有误,请重新输入" << endl; cin >> timeIn; temp->set_csecond(timeIn); } cout << endl << "信息录入成功=^_^=" << endl; return temp; } void ResearchTime(student *temp){ int reschT = ((temp->get_chour()) * 60 + temp->get_cminute()) - ((temp->get_hour()) * 60 + temp->get_minute()) ; temp->set_researchTime(reschT); int i = 0; i += 1; temp->set_ranking(i); } void save(student *temp){ ofstream os;//文件操作 os.open("outfile.txt",ios::app); os << endl; os << setw(2) << "学生学号:" << temp->get_studentId() << endl; os << setw(2) << "学生姓名:" << temp->get_name() << endl; os << setw(2) << "签到时间:" << setw(2) << setfill('0') << temp->get_hour(); os << ":" << setw(2) << setfill('0') << temp->get_minute() << ":"; os << setw(2) << setfill('0') << temp->get_second() << endl; os << setw(2) << "签退时间:" << setw(2) << setfill('0') << temp->get_chour(); os << ":" << setw(2) << setfill('0') << temp->get_cminute() << ":"; os << setw(2) << setfill('0') << temp->get_csecond() << endl; os << setw(2) << "科研时间:" << temp->get_researchTime() << endl; os << setw(2) << "时间排名:" << temp->get_ranking() << endl; temp++; os.close(); } void read(){ filebuf *pbuf; ifstream is; long size; char *buffer; if (!is){ cout << "读取不到" << endl; } //采用二进制读取整个文件 is.open("outfile.txt", ios::binary); // 获取filestr对应buffer对象的指针 pbuf = is.rdbuf(); // 调用buffer对象方法获取文件大小 size = pbuf->pubseekoff(0, ios::end, ios::in); pbuf->pubseekpos(0, ios::in); // 分配内存空间 buffer = new char[size]; // 获取文件内容 pbuf->sgetn(buffer, size); is.close(); // 输出到标准输出 cout.write(buffer, size); delete[]buffer; } int _tmain(int argc, _TCHAR* argv[]) { student s; student *temp=NULL; int i = 1; char input = 'e'; input = 'i'; while (input != 'e'){ drow(); cin >> input; input = tolower(input);//大写转义为小写 switch (input) { case 'l': cout << "信息录入:" << endl; temp = Registration(); ResearchTime(temp); save(temp); break; case 'o': read(); cout << endl << "信息读取成功=^_^= ,按提示信息进行其他操作" << endl; break; case'e': cout << "谢谢使用,再见!" << endl; std::system("pause"); std::exit(0); break; default: cout << "输入有误" << endl; break; } } std::system("pause"); return 0; } ```

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

Linux 会成为主流桌面操作系统吗?

整理 |屠敏出品 | CSDN(ID:CSDNnews)2020 年 1 月 14 日,微软正式停止了 Windows 7 系统的扩展支持,这意味着服役十年的 Windows 7,属于...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

学习总结之HTML5剑指前端(建议收藏,图文并茂)

前言学习《HTML5与CSS3权威指南》这本书很不错,学完之后我颇有感触,觉得web的世界开明了许多。这本书是需要有一定基础的web前端开发工程师。这本书主要学习HTML5和css3,看...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

搜狗输入法也在挑战国人的智商!

故事总是一个接着一个到来...上周写完《鲁大师已经彻底沦为一款垃圾流氓软件!》这篇文章之后,鲁大师的市场工作人员就找到了我,希望把这篇文章删除掉。经过一番沟通我先把这篇文章从公号中删除了...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

新一代神器STM32CubeMonitor介绍、下载、安装和使用教程

关注、星标公众号,不错过精彩内容作者:黄工公众号:strongerHuang最近ST官网悄悄新上线了一款比较强大的工具:STM32CubeMonitor V1.0.0。经过我研究和使用之...

记一次腾讯面试,我挂在了最熟悉不过的队列上……

腾讯后台面试,面试官问:如何自己实现队列?

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

冒泡排序动画(基于python pygame实现)

本项目效果初始截图如下 动画见本人b站投稿:https://www.bilibili.com/video/av95491382 本项目对应github地址:https://github.com/BigShuang python版本:3.6,pygame版本:1.9.3。(python版本一致应该就没什么问题) 样例gif如下 ======================= 大爽歌作,mad

Redis核心原理与应用实践

Redis核心原理与应用实践 在很多场景下都会使用Redis,但是到了深层次的时候就了解的不是那么深刻,以至于在面试的时候经常会遇到卡壳的现象,学习知识要做到系统和深入,不要把Redis想象的过于复杂,和Mysql一样,是个读取数据的软件。 有一个理解是Redis是key value缓存服务器,更多的优点在于对value的操作更加丰富。 安装 yum install redis #yum安装 b...

现代的 “Hello, World”,可不仅仅是几行代码而已

作者 |Charles R. Martin译者 | 弯月,责编 | 夕颜头图 |付费下载自视觉中国出品 | CSDN(ID:CSDNnews)新手...

带了6个月的徒弟当了面试官,而身为高级工程师的我天天修Bug......

即将毕业的应届毕业生一枚,现在只拿到了两家offer,但最近听到一些消息,其中一个offer,我这个组据说客户很少,很有可能整组被裁掉。 想问大家: 如果我刚入职这个组就被裁了怎么办呢? 大家都是什么时候知道自己要被裁了的? 面试软技能指导: BQ/Project/Resume 试听内容: 除了刷题,还有哪些技能是拿到offer不可或缺的要素 如何提升面试软实力:简历, 行为面试,沟通能...

!大部分程序员只会写3年代码

如果世界上都是这种不思进取的软件公司,那别说大部分程序员只会写 3 年代码,恐怕就没有程序员这种职业。

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

HTTP与HTTPS的区别

面试官问HTTP与HTTPS的区别,我这样回答让他竖起大拇指!

程序员毕业去大公司好还是小公司好?

虽然大公司并不是人人都能进,但我仍建议还未毕业的同学,尽力地通过校招向大公司挤,但凡挤进去,你这一生会容易很多。 大公司哪里好?没能进大公司怎么办?答案都在这里了,记得帮我点赞哦。 目录: 技术氛围 内部晋升与跳槽 啥也没学会,公司倒闭了? 不同的人脉圈,注定会有不同的结果 没能去大厂怎么办? 一、技术氛围 纵观整个程序员技术领域,哪个在行业有所名气的大牛,不是在大厂? 而且众所...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

程序员为什么千万不要瞎努力?

本文作者用对比非常鲜明的两个开发团队的故事,讲解了敏捷开发之道 —— 如果你的团队缺乏统一标准的环境,那么即使勤劳努力,不仅会极其耗时而且成果甚微,使用...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

立即提问
相关内容推荐