跪求C++大神帮我看看我自己写的这个程序有什么问题。这是一个关于成绩学号输入等的问题。用了构造函数

作者&投稿:称孔 (若有异议请与网页底部的电邮联系)
跪求各路大神 C++学生成绩管理系统。我自己写好的代码一直都有问题,调试不了。求帮。 保存文件一直出错~

如果你是计算机系的学生真的希望你不要完全复制,做下参考自己编写出来才能有所收获,这是对你的将来负责;如果你只是应付一下作业,那就随便了。

# include
# include
# include
#include //用getch();
using namespace std;

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌Student类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
class Student
{
public:
char name[20];
char Id[20];
int Cnum; //C课程得分
int Mnum; //数学课程得分
int Enum; //英语课程得分
int sum; //总分
Student * Next;
void Input()
{
cout>name;
cout>Id;
cout>Cnum;
cout>Mnum;
cout>Enum;
sum=Cnum+Mnum+Enum;
}
void ReadFile(istream & in)
{
in>>name>>Id>>Cnum>>Mnum>>Enum>>sum;
}
void Show()
{
cout<<"姓名:"<<name<<endl<<"学号:"<<Id<<endl<<"C++:"<<Cnum<<endl
<<"数学:"<<Mnum<<endl<<"外语:"<<Enum<<endl<<"总成绩:"<<sum<<endl<<endl<<endl;
}
};

//﹌﹌﹌﹌﹌﹌﹌﹌﹌Studentmassage类﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
class Studentmassage
{
public:
Studentmassage();
~Studentmassage();
void ShowMenu();
void Find();
void Save();
void ModifyItem();
void RemoveItem();
void Swap(Student *,Student *);
void Sort();
//void Unpass();
int ListCount();
//void Average();
void Display()
{
for(Student * p=Head->Next;p!=End;p=p->Next)
p->Show();
cout<<"输入任意字符!继续……";
getch();
}
void AddItem()
{
End->Input();
End->Next=new Student;
End=End->Next;
cout<<"添加成功!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
private:
Student * Head,* End;
ifstream in;
ofstream out;
Student *FindItem(char * name)
{
for(Student * p=Head;p->Next!=End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空
if(!strcmp(p->Next->name,name))return p;
return NULL;
}
Student *FindID(char * Id)
{
for(Student * p=Head;p->Next!=End;p=p->Next)//匹配成功则返回上一个指针,不成功就返回空
if(!strcmp(p->Next->Id,Id))return p;
return NULL;
}
};

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌构造函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
Studentmassage::Studentmassage()
{
Head=new Student;
Head->Next=new Student;
End=Head->Next;
in.open("sort.txt");
if(!in)
cout<<"这是一个新系统,无学生信息。请先输入。"<<endl;
else
{
while(!in.eof())
{
End->ReadFile(in);
if(End->name[0]=='\0')break;
End->Next=new Student;
End=End->Next;
}
in.close();
cout<<"读取学生信息成功!"<<endl;
}
}

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌析构函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
Studentmassage::~Studentmassage()
{
Save();
for(Student * temp;Head->Next!=End;)
{
temp=Head->Next;
Head->Next=Head->Next->Next;
delete temp;
}
delete Head,End;
}

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌菜单﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::ShowMenu()
{
cout<<"〓〓〓〓〓〓〓〓〓〓 ☆ 学 生 成 绩 管 理 系 统 ☆ 〓〓〓〓〓〓〓〓〓〓"<<endl;
cout<<"〓〓〓〓〓〓〓★★★★★ ★★★★★★★ ★★★★★〓〓〓〓〓〓〓"<<endl;
cout<<"〓〓〓〓〓〓〓〓〓★ ☆ 1.增加学生成绩 ☆ ★〓〓〓〓〓〓〓〓〓"<<endl;
cout<<"〓〓〓〓〓〓〓〓〓★ ☆ 2.显示学生成绩 ☆ ★〓〓〓〓〓〓〓〓〓"<<endl;
cout<<"〓〓〓〓〓〓〓〓〓★ ☆ 3.排序统计成绩 ☆ ★〓〓〓〓〓〓〓〓〓"<<endl;
cout<<"〓〓〓〓〓〓〓〓〓★ ☆ 4.查找学生成绩 ☆ ★〓〓〓〓〓〓〓〓〓"<<endl;
cout<<"〓〓〓〓〓〓〓〓〓★ ☆ 5.删除学生成绩 ☆ ★〓〓〓〓〓〓〓〓〓"<<endl;
cout<<"〓〓〓〓〓〓〓〓〓★ ☆ 6.修改学生信息 ☆ ★〓〓〓〓〓〓〓〓〓"<<endl;
cout<<"〓〓〓〓〓〓〓〓〓★ ☆ 0.安全退出系统 ☆ ★〓〓〓〓〓〓〓〓〓"<<endl;

cout<<"

请选择:";
}

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌查找函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::Find()
{
char name[20] ,Id[10];
int x;
Student * p=NULL;
cout<<"
*********************************
";
cout<<"※ 1.按学生的姓名查找
※ 2.按学生学号查找";
cout<<"
*********************************
请选择:";
cin>>x;
switch(x)
{
case 1:{cout>name;
if(p=FindItem(name))
{
p->Next->Show();
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"没有找到该姓名的学生!"<<'
'<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}break;
case 2:
{
cout>Id;
if(p=FindID(Id))
{
p->Next->Show();
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"没有找到该学好的学生!"<<'
'<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}break;
}

}

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌修改信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::ModifyItem() //修改信息
{
char name[20];
Student * p=NULL;
cout>name;
if(p=FindItem(name))
{
cout<<"已找到学生的信息,请输入新的信息!"<<endl;
p->Next->Input();
cout<<"修改成功!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"没有找到!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌删除信息﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::RemoveItem() // 删除信息
{
char name[20];
Student * p=NULL,*temp=NULL;
cout>name;
if(p=FindItem(name))
{
temp=p->Next;
p->Next=p->Next->Next;
delete temp;
cout<<"删除成功!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
else
{
cout<<"没有找到!"<<endl;
cout<<"输入任意字符!继续……";
getch();
}
}

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::Swap(Student *p1, Student *p2)//交换两个combox变量的数据域
{
Student *temp=new Student;
strcpy(temp->name,p1->name);
strcpy(temp->Id,p1->Id);
temp->Cnum=p1->Cnum;
temp->Mnum=p1->Mnum;
temp->Enum=p1->Enum;
temp->sum=p1->sum;

strcpy(p1->name,p2->name);
strcpy(p1->Id,p2->Id);
p1->Cnum=p2->Cnum;
p1->Mnum=p2->Mnum;
p1->Enum=p2->Enum;
p1->sum=p2->sum;

strcpy(p2->name,temp->name);
strcpy(p2->Id,temp->Id);
p2->Cnum=temp->Cnum;
p2->Mnum=temp->Mnum;
p2->Enum=temp->Enum;
p2->sum=temp->sum;
}

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
int Studentmassage::ListCount()//统计当前链表的记录总数,返回一个整数
{
if(! Head)
return 0;
int n=0;
for(Student * p=Head->Next;p!=End;p=p->Next)
{
n++;
}
return n;
}

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::Sort()//对当前链表进行排序
{
cout <<"Sorting..."<<endl;
Student *p=NULL,*p1=NULL,*k=NULL;
int n=Studentmassage::ListCount();
if(n<2)
return;
for(p=Head->Next;p!=End;p=p->Next)
for(k=p->Next;k!=End;k=k->Next)
{
if(p->sum>k->sum)
{
Studentmassage::Swap(p,k);
}
}
cout <<"排序完成!"<<endl;
getch();
return;
}

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌保存函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
void Studentmassage::Save()
{
out.open("sort.txt");
for(Student *p=Head->Next;p!=End;p=p->Next)
outnameIdCnum<<""
MnumEnumsum<<'
';
out.close();
}

//﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌主函数﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
int main()
{
int x,i=0;
bool quit=false;
cout<<"§§§§§§§§§§§§§§§§§§§§§§§§§§"<<endl;
for(i=0;i<3;i++)
cout<<"◎ ◎"<<endl;
cout<<"◎★★★★【 欢迎进入学生成绩管理系统 】★★★★◎"<<endl;
for(i=0;i<3;i++)
cout<<"◎ ◎"<<endl;
cout<<"§§§§§§§§§§§§§§§§§§§§§§§§§§
"<<endl;;
Studentmassage Grade;
cout<<"按任意键开始……";
getch();
while(!quit)
{
system("cls");
Grade.ShowMenu();
cin>>x;
switch(x)
{
case 0:quit=true;break;
case 1:Grade.AddItem();break;
case 2:Grade.Display();break;
case 3:Grade.Sort();break;
case 4:Grade.Find();break;
case 5:Grade.RemoveItem();break;
case 6:Grade.ModifyItem();break;
}
}
return 0;
}

  /*
  有5个学生,每个学生的数据结果包括学号、姓名、年龄、C++成绩、数学成绩和英语成绩、总平均分,
  从键盘输入5个学生的学号、姓名、3门课的成绩,计算3门课的总平均分,最后将5个学生的数据输出。
  要求各个功能用函数来实现。
  */
  #include
  using namespace std;
  #define NUM 5
  struct STUD
  {
   int num;
   char name[20];
   float grade[3];
  };
  STUD Input(STUD all)
  {
   cout<<"输入学号:";
   cin>>all.num;
   cout<<"输入姓名:";
   cin>>all.name;
   cout<<"输入C++成绩:";
   cin>>all.grade[0];
   cout<<"输入数学成绩:";
   cin>>all.grade[1];
   cout<<"输入英语成绩:";
   cin>>all.grade[2];
   return all;
  }
  float count(STUD all)
  {
   int i;
   float sum=0;
   for(i=0;i<3;i++)
   {
   sum+=(all.grade[i]);
   }
   sum=sum/3;
   return sum;
  }
  void Output(STUD all,float average)
  {
   cout<<"学号:";
   cout<<all.num<<'
';
   cout<<"姓名:";
   cout<<all.name<<'
';
   cout<<"C++成绩:";
   cout<<all.grade[0]<<'
';
   cout<<"数学成绩:";
   cout<<all.grade[1]<<'
';
   cout<<"英语成绩:";
   cout<<all.grade[2]<<'
';
   cout<<"平均成绩:";
   cout<<average<<'
';
  }
  int main()
  {
   int j=0;
   STUD all[NUM];
   float sum[NUM];
   for(j=0;j<NUM;j++)
   {
   all[j]=Input(all[j]);
   sum[j]=count(all[j]);
   }
   //输出
   for(j=0;j<NUM;j++)
   {
   Output(all[j],sum[j]);
   }
   return 0;
  }

  Stu(char *s,int a,float b,float c,float d,float e)
  {
   strcpy(name,s);//这里没有给name指针分配空间,字符串复制失败了
   number=a;
   math=b;
   eng=c;
   phy=d;
   cpp=e;
  }

 简单修改办法是将name做数组声明:char name[100];

如果用指针必须先申请内存空间,并在析构函数中释放空间。



strcpy(name,s);
你程序里的这一句,是把s指向地址的内存复制到name指向地址的空间,但此时你name指向的是未知区域,合理一点的话应该是个空值,但你未赋值,有的编译器就直接是它原本内存里的值,指向什么地方都有可能,所以会崩溃。
所以你应该在复制前给name指针动态分配空间。

结果Endless loop


有没有C语言大神帮我看个程序???解释下,实在是看不懂!!!
方法1:利用全局变量 分析:全局变量作为C语言的一个知识点,虽然我们都了解它的特点,但在实际教学过程中应用得并不是很多。由于全局变量的作用域是从定义变量开始直到程序结束,而对于编写有多个返回值的C语言函数,我们可以考虑把要返回的多个值定义成全局变量。当函数被调用时,全局变量被更改,我们再...

C语言的大神帮我看看哪里写错了?
int isPrime(int x, int KnownPrimes[], int numberOfKnownPrimes );int main(void){ const int number=10;int prime [number]= {2};\/\/有修改 int count = 1;int i = 3;while ( count< number){ if(isPrime(i,prime,count)){ prime[count++] = i;\/\/有修改 } i++;} for(i=0...

求C语言大神帮忙看一下,为什么我手算的结果和程序的结果不一样?_百度...
输入数据 Vi, Vo 你都定义成了浮点数类型,但是读入的时候是按 %d 也就是整型读的,这俩类型的二进制编码不统一,所以读到的数据就不对。读入的时候用 %f 就好了。

C语言的代码问题,求大神帮忙看看问题在哪?
include <stdio.h>int check(int n){int i,k=0;for(i=2;i<=n\/2;i++)if(n%i==0) break;if(i>n\/2&&n>1) k=1;return k;}int main(){int i,n;scanf("%d",&n);if(n<=10||n%2) \/\/哥德巴赫猜想。其实对任意不小于4的偶数都成立,而不是10printf("Data error!");else...

C语言,求大神帮看代码~
问题在循环里的赋值:process->PT[k] = 8*i + j; 这里把PT当做数组使用了,但是你实际在定义结构体的时候是一个整形指针int *PT;\/\/页表;建议修改为整形数组,数组大小自己定吧。 int PT[10];\/\/页表 另外int Allocate(struct proc *head);函数的声明需要加上参数哦。如果问题解决,请采纳!f...

...但算的结果不对,题目如下,求大神帮我看看哪里错了,感激不尽_百度知 ...
你的代码算法逻辑没有错误。但在x较大时,由于h不断增大,for(i=1;i<=2*h-1;i++) k*=i;的运行结果使k很快溢出,所以得不到最后的正确结果。if(fabs(j)<pow(10,-5)) break;与无法满足而进入while死循环。在x较小时应该是正确的。

哪位C语言编程大神能帮我看看我这个C语言编程错哪了?跪求在线等_百度知 ...
在非单条执行语句的情况下, if后面的语句要加上{} 改成如下.而且, 像你的这样情况, 把if else换成switch case会比较好 include "stdio.h"define PI 3.1415926 int main(){ int x;printf("请输入x代号,代号:圆形1,长方形2,三角形3\\n");scanf("%d",&x);if (x=1){ float r,s1;pri...

求大神帮忙看我写的一句C程序语句 if(n%400==0 ‖ (n%100!=0&&n%4=...
if(n%400==0 || (n%100!=0&&n%4==0))t=t+1;我直接复制粘贴,编译发现 || 这个符号错了,不是 ‖ 而是 || , 是 “|” 再加一个 “ | ”按 shift 加上面那个键

c语言 大神帮忙看下哪错了
int date,number;printf("请输入月份和数量\\n");scanf("%d%d",&date,&number);printf("优惠率:");switch(date){ case 7 :\/\/不要引号 case 8 :case 9 :if(number>=20){ printf("10%");} else { printf("5%");} break;case 1 :case 2 :case 3 :case 4 :case 5 :case 6 :...

...使其排序不变。我写了一个程序,求大神帮我看看哪错了
{ b[i+1]=a[i]; \/\/如果输入的index小于1,例如,index=0 \/\/当i=0时,b[1]存入a[0]=1,然后,就会跳出for循环, \/\/新输入的index=0就不能存入b[0],所以要在这里增加b[0]=index; if(

大宁县19349399969: 哪位大神帮忙看看这段c++代码? -
姚芬女金: 有如下错误:(1)double getDistance(Point a,Point b){ return sqrt((a.x-b.x)^2+(a.y-b.y)^2); //error}因为^在C/C++中是异或运算符,而且要求操作数必须是整数.x,y是...

大宁县19349399969: 求大神帮我看看我这个c++代码 -
姚芬女金: 溢出是最大的问题其次是格式最极端的一种情况 如果每次移动,都是百分百移动回原位,比如 总数为n 每次输入的都是n 也就是每次无论是顺时针还是逆时针 都是移动回原始位置那么,每次都要执行两次 result[0] += temp[0];循环一定次数后就会溢出int为32位,那么就是32次 而题目中m可以达到1000000次所以统计次数这一方案不可行格式上,题目中没有对0/1时的小数做特别要求,所以同意用%.4f即可

大宁县19349399969: 大神帮忙看看我用C++编写的此题 错在哪些 帮忙修改下 真诚欢迎赐教 谢谢! -
姚芬女金: #include <iostream>#include <list>#include <string>using namespace std;int main(){ list<int> v1; list<int>::iterator it; int n, m, x; string str; cin >> n; for (int i = 0; i < n && cin >> x; ++i) v1.push_back(x); cin >> m; for (int j = 0; j < m && cin >> str; ++j) { it ...

大宁县19349399969: 麻烦大神们帮忙看看我的这个C++深复制代码有没有哪里写错?或者需要注意的地方? -
姚芬女金: CA & operator =(CA& one){ if(a!=NULL) //这里有点问题,如果出现one=one这样的,会有strlen(NULL)而崩溃 { delete []a; a=NULL; } a=new char [strlen(one.a)+1]; strcpy(a,one.a); return *this; } 所以加个不是自己的判断:CA & operator =(CA& ...

大宁县19349399969: 麻烦哪位高手看下我写的这个C++代码出什么问题了,运行每次都会意外终止 -
姚芬女金: char* p_ar = new char[]; char* p_cr = new char[]; cout 首相,new一个数组要在中括号中说明数组的大小,具体原因不用多说,那都是库函数的问题,不要深究,反正说明数组大小绝对不会错.其实当你学到一定程度,你可以轻易写出有类似功能...

大宁县19349399969: 跪求C++大神帮忙编个程序!急需!!!感激不尽!!! -
姚芬女金: 说实话,比较简单. 我这会想休息一下,就简单给你写个框子吧. typedef double (*Func) (double x); //定义一个函数指针,注意我只简单写一个参数的函数指针.double e_pow_x(double x) //e^x {return ......;// 自己找数学库中的函数 }double ...

大宁县19349399969: 求c++大神帮我解答,我写的这个程序不知道是什么错误,运行时出现press any key to continue但是运行不出 -
姚芬女金: ^= 是什么运算? 是想这样?1if(a*a==b*b+c*c)

大宁县19349399969: 高手帮我看看我写的这个是C++的选择排序法吗? -
姚芬女金: sorry,昨天没仔细看,这个的确是选择排序,思路上没什么问题,只是代码有点小bug, temp=a[i]; 和 a[i]=a[k];应该是 temp=a[j];和a[j]=a[k];

大宁县19349399969: C++中要求用数组的方式把一个十进制数按16进制输出.下面是我写的程序: 求大神帮忙看看哪里出错了啊?? -
姚芬女金: #include using namespace std ; void main() {int a[100]; int n; cin>>n; int i=0; //数组下标从0开始 while(n!=0) { a[i++]=n%16; n/=16; } for(int j=i-1;j>=0;j--) { switch(a[j]) { case 10:coutcase 11:coutcase 12:coutcase 13:coutcase 14:coutcase 15:coutdefault:cout } }cout}

大宁县19349399969: 求大神帮我用C++写这个程序!! -
姚芬女金: 按照你说的,程序如下:#include "stdafx.h"#include <stdio.h>#include <iostream> using namespace std; int main(void) { int a=1,b=1,m,i=1; //char temp[]; cout<<"input number"<<endl; cin>>m; do { i++; a*=m; b*=i; } while (a>=b); printf("%d"...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网