我编了一个帮老师算分的程序,但是不知为什么当指令为5、6、7的时候莫名其妙停止工作了
#include <bits/stdc++.h>
#include <time.h>
#include <windows.h>
using namespace std;
string nowdate,stu_name[110],wri_name[110],mis_date[110],mis_name[110];
int stu_num,wri_num,wri_sco[110][110],nor_sco[110],mis_num,mis_hash[110][110],mis_app[110];
void read_time()
{
time_t t = time(0);
char tmp[64];
strftime( tmp, sizeof(tmp), "%Y-%m-%d",localtime(&t) );
nowdate=tmp;
return ;
}
void read_data()
{
freopen("data.data","r",stdin);
cin>>stu_num;
for (int i=1;i<=stu_num;i++)
{
cin>>stu_name[i];
}
//cout<<1<<endl;
cin>>wri_num;
for (int i=1;i<=wri_num;i++)
{
cin>>wri_name[i];
}
//cout<<1<<endl;
for (int i=1;i<=stu_num;i++)
{
for (int j=1;j<=wri_num;j++)
{
if(stu_name[i][0]=='-')
{
continue;
}
cin>>wri_sco[i][j];
}
}
//cout<<1<<endl;
for (int i=1;i<=stu_num;i++)
{
if(stu_name[i][0]=='-')continue;
cin>>nor_sco[i];
}
cin>>mis_num;
//cout<<1<<endl;
for (int i=1;i<=mis_num;i++)
{
cin>>mis_date[i]>>mis_name[i]>>mis_app[i];
for (int j=1;j<=stu_num;j++)
{
cin>>mis_hash[i][j];
}
}
//cout<<1<<endl;
fclose(stdin);
}
bool IsLeap(int year)
{
return (year % 4 ==0 || year % 400 ==0) && (year % 100 !=0);
}
bool StringToDate(string date, int& year, int& month, int& day)
{
year = atoi((date.substr(0,4)).c_str());
month = atoi((date.substr(5,2)).c_str());
day = atoi((date.substr(8,2)).c_str());
int DAY[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(IsLeap(year)){
DAY[1] = 29;
}
return year >= 0 && month<=12 && month>0 && day<=DAY[month] && day>0;
}
int DayInYear(int year, int month, int day)
{
int DAY[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(IsLeap(year))
DAY[1] = 29;
for(int i=0; i<month - 1; ++i)
{
day += DAY[i];
}
return day;
}
int DaysBetween2Date(string date1, string date2)
{
int year1, month1, day1;
int year2, month2, day2;
if(!StringToDate(date1, year1, month1, day1) || !StringToDate(date2, year2,month2,day2))
{
cout<<"输入的日期格式不正确";
return -1;
}
if(year1 == year2 && month1 == month2)
{
return day1 > day2 ? day1 - day2 : day2 - day1;
}else if(year1 == year2)
{
int d1, d2;
d1 = DayInYear(year1, month1, day1);
d2 = DayInYear(year2, month2, day2);
return d1 > d2 ? d1 - d2 : d2 - d1;
}else{
if(year1 > year2)
{
swap(year1, year2);
swap(month1, month2);
swap(day1, day2);
}
int d1,d2,d3;
if(IsLeap(year1))
d1 = 366 - DayInYear(year1,month1, day1);
else
d1 = 365 - DayInYear(year1,month1, day1);
d2 = DayInYear(year2,month2,day2);
d3 = 0;
for(int year = year1 + 1; year < year2; year++)
{
if(IsLeap(year))
d3 += 366;
else
d3 += 365;
}
return d1 + d2 + d3;
}
}
void nor_sco_add(int num,int who)
{
nor_sco[who]=nor_sco[who]+num;
}
void print_reader()
{
freopen("reader.csv","w",stdout);
cout<<"学号"<<","<<"姓名"<<","<<"默写成绩"<<",";
for (int i=1;i<=wri_num;i++)
{
cout<<i<<".";
cout<<wri_name[i]<<",";
}
cout<<","<<"加扣分情况"<<","<<","<<"平时成绩"<<","<<"判定等第";
cout<<endl;
for (int i=1;i<=stu_num;i++)
{
cout<<i<<",";
cout<<stu_name[i]<<",";
if(stu_name[i][0]=='-')
{
cout<<endl;
continue;
}
cout<<",";
for (int j=1;j<=wri_num;j++)
{
if(wri_sco[i][j]==-1)cout<<"无 ";
else
{
cout<<wri_sco[i][j]<<" ";
}
cout<<",";
}
cout<<","<<nor_sco[i]<<","<<",";
int sum,timesss;
sum=0;timesss=0;
for (int j=1;j<=wri_num;j++)
{
if(wri_sco[i][j]!=-1)
{
timesss++;
sum=sum+wri_sco[i][j];
}
}
if(sum==0&×ss==0)sum=0;
else sum=sum/timesss;
cout<<nor_sco[i]+sum*0.5<<",";
if(nor_sco[i]+sum*0.5>=85)cout<<"优秀"<<endl;
else if(nor_sco[i]+sum*0.5>=70)cout<<"良好"<<endl;
else if(nor_sco[i]+sum*0.5>=60)cout<<"合格"<<endl;
else cout<<"不合格"<<endl;
}
int jici=0;
cout<<endl;
cout<<"目前仍有"<<mis_num<<","<<"个任务"<<","<<"正在进行!"<<endl;
for (int i=1;i<=mis_num;i++)
{
cout<<i<<"."<<","<<"任务发布时"<<","<<"间:"<<mis_date[i]<<","<<"任务名称:"<<","<<mis_name[i]<<","<<"还有"<<mis_app[i]-DaysBetween2Date(mis_date[i],nowdate)<<"天截止 :"<<",";
for (int j=1;j<=stu_num;j++)
{
if(mis_hash[i][j]==0)
{
cout<<stu_name[j]<<"、"<<",";
jici++;
}
if(jici==10)
{
cout<<endl<<","<<","<<","<<","<<","<<",";
jici=0;
}
}
cout<<endl;
}
fclose(stdout);
}
void print_data()
{
freopen("data.data","w",stdout);
cout<<stu_num<<endl;
for (int i=1;i<=stu_num;i++)
cout<<stu_name[i]<<endl;
cout<<wri_num<<endl;
for (int i=1;i<=wri_num;i++)
cout<<wri_name[i]<<" ";
cout<<endl;
for (int i=1;i<=stu_num;i++)
{
for (int j=1;j<=wri_num;j++)
{
if(stu_name[i][0]=='-')
{
continue;
}
cout<<wri_sco[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
for (int i=1;i<=stu_num;i++)
{
if(stu_name[i][0]=='-')continue;
cout<<nor_sco[i]<<endl;
}
cout<<mis_num<<endl;
for (int i=1;i<=mis_num;i++)
{
cout<<mis_date[i]<<" "<<mis_name[i]<<" "<<mis_app[i]<<" ";
for (int j=1;j<=stu_num;j++)
{
cout<<mis_hash[i][j]<<" ";
}
cout<<endl;
}
fclose(stdout);
print_reader();
}
void check_mis()
{
for (int i=1;i<=mis_num;i++)
{
if(DaysBetween2Date(mis_date[i],nowdate)>mis_app[i])
{
for (int j=1;j<=stu_num;j++)
{
if(mis_hash[i][j]==0)
{
nor_sco_add(-1,j);
mis_hash[i][j]=1;
}
}
}
cout<<endl;
int flag=1;
for (int j=1;j<=stu_num;j++)
{
if(mis_hash[i][j]==0)
{
flag=0;break;
}
}
if(flag==1)
{
for (int j=i;j<=mis_num-1;j++)
{
mis_date[j]=mis_date[j+1];
mis_name[j]=mis_name[j+1];
mis_app[j]=mis_app[j+1];
for (int k=1;k<=stu_num;k++)
{
mis_hash[j][k]=mis_hash[j+1][k];
}
}
mis_num=mis_num-1;
i=i-1;
continue;
}
}
print_data();
}
void print_test()
{
cout<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl;
cout<<"******************************"<<endl;
cout<<" 默写成绩"<<endl;
cout<<"******************************"<<endl;
cout<<" ";
for (int i=1;i<=wri_num;i++)
{
cout<<i;
if(i/10==0)cout<<".";
cout<<wri_name[i]<<" ";
}
cout<<endl;
for (int i=1;i<=stu_num;i++)
{
cout<<i;
if(i/10==0)cout<<" ";
cout<<" ";
cout<<stu_name[i];
if(stu_name[i][0]=='-')
{
cout<<endl;
continue;
}
for (int j=stu_name[i].size();j<=7;j=j+2)cout<<" ";
if(stu_name[i][0]!='*')cout<<" ";
cout<<" ";
for (int j=1;j<=wri_num;j++)
{
if(wri_sco[i][j]==-1)cout<<"无 ";
else
{
cout<<wri_sco[i][j]<<" ";
if(wri_sco[i][j]/100==0)cout<<" ";
if(wri_sco[i][j]/10==0)cout<<" ";
}
for (int k=2;k<=wri_name[j].size();k=k+1)cout<<" ";
}
cout<<endl;
}
cout<<endl;
cout<<"******************************"<<endl;
cout<<" 加扣分情况"<<endl;
cout<<"******************************"<<endl;
for (int i=1;i<=stu_num;i++)
{
cout<<i;
if(i/10==0)cout<<" ";
cout<<" ";
cout<<stu_name[i];
if(stu_name[i]=="-")cout<<endl;
else
{
int l=stu_name[i].size();
for (int j=l;j<=7;j=j+2)cout<<" ";
if(stu_name[i][0]!='*')cout<<" ";
cout<<nor_sco[i]<<endl;
}
}
cout<<"**************************************************************"<<endl;
cout<<"目前仍有"<<mis_num<<"个任务正在进行!"<<endl;
cout<<"**************************************************************"<<endl;
for (int i=1;i<=mis_num;i++)
{
cout<<i<<". 任务发布时间:"<<mis_date[i]<<" 任务名称:"<<mis_name[i]<<" 还有"<<mis_app[i]-DaysBetween2Date(mis_date[i],nowdate)<<"天截止(将要被扣分) :";
for (int j=1;j<=stu_num;j++)
{
if(mis_hash[i][j]==0) cout<<stu_name[j]<<"、";
}
cout<<endl;
}
}
int main()
{
int hash[110];
cout<<"正在加载中,请耐心等待......(温馨提示:您所有的输入数据之间请用空格隔开,每输完一条命令请换行,请确保您的所有命令正确)"<<endl;
read_time();
read_data();
check_mis();
int tot_flag=1,orders,sma_flag;
while(tot_flag==1)
{
freopen("CON","r",stdin);
freopen("CON","w",stdout);
print_test();
cout<<"-1退出,1为学生加平时分 2登分 3更改分数 4新建任务 5删除任务 6更改任务时间 7解除任务中学生名字"<<endl;
cout<<"请输入指令代号:";
cin>>orders;
cout<<endl;
fclose(stdin);fclose(stdout);
if(orders==-1)
{
print_data();
break;
}
if(orders==1)
{
sma_flag=1;
freopen("CON","r",stdin);
freopen("CON","w",stdout);
cout<<"请顺次输入被加分的学生的学号和加分分值(扣分为负数),退出请按0"<<endl;
while(sma_flag==1)
{
int add_sco_who,add_sco_num;
cin>>add_sco_who;
if(add_sco_who==0)break;
cin>>add_sco_num;
nor_sco_add(add_sco_num,add_sco_who);
}
cout<<"加分完毕!"<<endl;
fclose(stdin);fclose(stdout);
sma_flag=0;
print_data();
}
if(orders==2)
{
memset(hash,0,sizeof(hash));
for (int i=1;i<=stu_num;i++)
{
if(stu_name[i]=="-")hash[i]=1;
}
freopen("CON","r",stdin);
freopen("CON","w",stdout);
wri_num++;
cout<<"请输入本次默写/考试名称(请使用中文汉字及中文字符,不能使用英文,取消本次登分按-1):";
cin>>wri_name[wri_num];
if(wri_name[wri_num]=="-1")
{
wri_num--;
continue;
}
cout<<endl<<"请顺次输入学生学号及对应成绩:(停止输入按0,取消本次登分按-1,需要更改只需再次输入该学生的学号和更改后的分数即可)"<<endl;
sma_flag=1;
int wri_who;
while(sma_flag==1)
{
cin>>wri_who;
if(wri_who==0)break;
if(wri_who==-1)
{
sma_flag=0;
wri_num--;
break;
}
cin>>wri_sco[wri_who][wri_num];
if(wri_sco[wri_who][wri_num]==0)break;
if(wri_sco[wri_who][wri_num]==-1)
{
sma_flag=0;
wri_num--;
break;
}
hash[wri_who]=1;
}
if(sma_flag==0)continue;
for (int i=1;i<=stu_num;i++)
{
if(hash[i]==0)
{
cout<<stu_name[i]<<"尚未登分,请输入他的分数,-1为取消输入(以缺考处理)";
cin>>wri_sco[i][wri_num];
cout<<endl;
}
}
cout<<"录入完毕!"<<endl;
fclose(stdin);fclose(stdout);
sma_flag=0;
print_data();
}
if(orders==3)
{
freopen("CON","r",stdin);
freopen("CON","w",stdout);
cout<<"请顺次输入默写(考试)序号,学生学号以及更改分数(0退出)"<<endl;
int wri_x,wri_sn,new_sco;
sma_flag=1;
while(sma_flag==1)
{
cin>>wri_x;
if(wri_x==0)break;
cin>>wri_sn>>new_sco;
wri_sco[wri_sn][wri_x]=new_sco;
}
sma_flag=0;
fclose(stdin);fclose(stdout);
print_data();
}
if(orders==4)
{
freopen("CON","r",stdin);
freopen("CON","w",stdout);
mis_num++;
cout<<"请输入任务名称(-1取消)";
cin>>mis_name[mis_num];
if(mis_name[mis_num]=="-1")continue;
cout<<"请输入截止时间(即多少天后截止,-1取消):";
cin>>mis_app[mis_num];
mis_date[mis_num]=nowdate;
cout<<"请顺次输入学号及完成情况(1:不加分,2:加一分,0:结束输入,-1:取消"<<endl;
sma_flag=1;
while(sma_flag==1)
{
int mis_stu_num,mis_now_sco;
cin>>mis_stu_num;
if(mis_stu_num==0){sma_flag=0;continue;}
if(mis_stu_num==-1){sma_flag=-1;mis_num--;continue;}
cin>>mis_now_sco;
if(mis_now_sco==0){sma_flag=0;continue;}
if(mis_now_sco==-1){sma_flag=-1;mis_num--;continue;}
mis_hash[mis_num][mis_stu_num]=mis_now_sco;
if(mis_now_sco==2)
{
mis_hash[mis_num][mis_stu_num]=1;
nor_sco_add(1,mis_stu_num);
}
}
if(sma_flag==-1)continue;
for (int i=1;i<=stu_num;i++)if(stu_name[i]=="-")mis_hash[mis_num][i]=1;
fclose(stdin);
fclose(stdout);
check_mis;
}
if(orders==5)
{
freopen("CON","r",stdin);
freopen("CON","w",stdout);
int mis_knum;
cout<<"请输入要删除的任务(0取消)";
cin>>mis_knum;
if(mis_knum==0)continue;
for (int i=1;i<=stu_num;i++)mis_hash[mis_knum][i]=1;
fclose(stdin);
fclose(stdout);
check_mis();
}
if(orders==6)
{
int mis_knum,mis_newapps;
freopen("CON","r",stdin);
freopen("CON","w",stdout);
cout<<"请输入要更改的任务(0取消)";
cin>>mis_knum;
if(mis_knum==0)continue;
cout<<"请输入从今天起多少天后截止(0取消)";
cin>>mis_newapps;
if(mis_newapps==0)continue;
mis_date[mis_knum]=nowdate;
mis_app[mis_knum]=mis_newapps;
fclose(stdin);fclose(stdout);
check_mis();
}
if(orders==7)
{
int mis_knum,mis_newstu_num;
freopen("CON","r",stdin);
freopen("CON","w",stdout);
cout<<"请顺次输入任务序号和学生学号(0退出)";
sma_flag=1;
while (sma_flag==1)
{
cin>>mis_knum;
if(mis_knum==0)break;
cin>>mis_newstu_num;
if(mis_newstu_num==0)break;
mis_hash[mis_knum][mis_newstu_num]=1;
}
fclose(stdin);fclose(stdout);
check_mis();
}
}
freopen("CON","w",stdout);
cout<<"goodbye!(程序将于5秒后自行退出)"<<endl;
Sleep(5000);
return 0;
}
这是主程序
#include <bits/stdc++.h>
using namespace std;
int n,p,m=INT_MIN;
string str[110];
int main()
{
cout<<"请先输入要录入的学生个数,后再输入学号(如:1910101)和姓名(如:张三),每一条数据用空格隔开"<<endl;
cin>>n;
freopen("data.data","w",stdout);
for (int i=1;i<=n;i++)
{
cin>>p;
p=p%10+p/10%10*10;
cin>>str[p];
m=max(m,p);
if(str[p][0]=='*')
{
string st1="";
for (int j=1;j<str[p].size();j++)st1+=str[p][j];
str[p]=st1;
}
}
cout<<m<<endl;
for (int i=1;i<=m;i++)
{
if(str[i]=="")str[i]="-";
cout<<str[i]<<endl;
}
cout<<0<<endl;
for (int i=1;i<=m;i++)
{
if(str[i]=="-")cout<<endl;
else
{
cout<<0<<endl;
}
}
cout<<0<<endl;
return 0;
}
这是名单修改器
请各位大佬们帮忙诊断诊断,小菜鸡万分感谢!!!