//实现简单的学生成绩信息管理软件。
//学生信息包括:学号、姓名、4 门课程的成绩(计算机,数学,英语,物理) 。
//要实现的功能:学生信息的录入、修改、删除和查询。
#include<iostream>
#include<string>
#include<fstream>
#include<cmath>
#include<iomanip>
#include<stack>
#define STU_NUM 100
using namespace std;
struct stu{
string name;
string no;
int score[4];
double aver;
}stu[STU_NUM];
bool stuin[STU_NUM];
stack<int> s;
int n,stunum;
string strfind;
ifstream fin("stu.dat",ios::in);
void showmenu()
{
cout<<"*********************************"<<endl
<<" 请选择你需要的功能 "<<endl
<<"1.录入学生信息"<<endl
<<"2.修改学生信息"<<endl
<<"3.查询学生信息"<<endl
<<"4.删除学生信息"<<endl
<<"5.退出"<<endl
<<"**********************************"<<endl;
}
void display(int i)
{
cout<<"学号:";
cout<<stu[i].no<<endl;;
cout<<"姓名:";
cout<<stu[i].name<<endl;
cout<<"计算机成绩:";
cout<<stu[i].score[0]<<endl;
cout<<"数学成绩:";
cout<<stu[i].score[1]<<endl;
cout<<"英语成绩:";
cout<<stu[i].score[2]<<endl;
cout<<"物理成绩:";
cout<<stu[i].score[3]<<endl;
cout<<"平均成绩:"<<endl;
cout<<setiosflags(ios::fixed)<<setprecision(1)<<stu[i].aver<<endl;
}
void Inserts()
{
int i;
for(i=0;i<n;i++) if(!stuin[i]) break;
cout<<"您选择了插入信息"<<endl;
cout<<"请输入要插入学生的学号:";
cin>>stu[i].no;
cout<<"请输入要插入学生的姓名:";
cin>>stu[i].name;
cout<<"请输入要插入学生的计算机成绩:";
cin>>stu[i].score[0];
cout<<"请输入要插入学生的数学成绩:";
cin>>stu[i].score[1];
cout<<"请输入要插入学生的英语成绩:";
cin>>stu[i].score[2];
cout<<"请输入要插入学生的物理成绩:";
cin>>stu[i].score[3];
stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2]+stu[i].score[3])*1.0/4;
stuin[i]=true;
if(i==n) {n++; stunum++;}
cout<<"插入成功!"<<endl;
}
int Searchs(int mod=0)
{
if(mod!=0){
for(int i=0;i<n;i++)
if(stuin && !stu[i].no.compare(strfind))
break;
if(i<n) return i;
else return -1;
}
else{
cout<<"请输入您要查找的学生的学号:";
cin>>strfind;
for(int i=0;i<n;i++)
if(!stu[i].no.compare(strfind))
break;
if(i>=n) cout<<"要查找的学生不存在!"<<endl;
else display(i);
}
return 0;
}
void Modifys()
{
cout<<"请输入您要修改的学生学号:"<<endl;
cin>>strfind;
int i=Searchs(1);
int j;
if(i<0) {cout<<"您要修改的学生不存在!请确认后在执行修改!"<<endl;
return ;
}
cout<<"要修改学生的当前信息"<<endl;
display(i);
cout<<"请选择要修改的项目:"<<endl
<<"1.学号"<<endl
<<"2.姓名"<<endl
<<"3.计算机成绩"<<endl
<<"4.数学成绩"<<endl
<<"5.物理成绩"<<endl
<<"6.英语成绩"<<endl
<<"可多选,用空格隔开!最后以数字0结尾"<<endl;
while(cin>>j && j>0) s.push(j);
if(!s.empty()) cout<<"请输入修改后的信息:";
while(!s.empty()){
switch(s.top()){
case 1: cout<<"学号:";
cin>>stu[i].no;
break;
case 2: cout<<"姓名:";
cin>>stu[i].name;
break;
case 3: cout<<"计算机成绩:";
cin>>stu[i].score[0];
break;
case 4: cout<<"数学成绩:";
cin>>stu[i].score[1];
break;
case 5: cout<<"英语成绩:";
cin>>stu[i].score[2];
break;
case 6: cout<<"物理成绩:";
cin>>stu[i].score[3];
}
if(s.top() > 2)
stu[i].aver=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2]+stu[i].score[3])*1.0/4;
s.pop();
}
cout<<"修改成功,修改后学生的信息:"<<endl;
display(i);
}
void Deletes()
{
cout<<"请输入您要删除的学生学号:"<<endl;
cin>>strfind;
int i=Searchs(1);
if(i<0) {cout<<"您要删除的学生不存在!请确认后在执行删除!"<<endl;
return ;
}
stuin[i]=false;
stunum--;
}
void savedata()
{
ofstream fout("stu.dat");
for(int i=0;i<n;i++)
if(stuin[i]){
fout<<stu[i].no<<endl;;
fout<<stu[i].name<<endl;
fout<<stu[i].score[0]<<' ';
fout<<stu[i].score[1]<<' ';
fout<<stu[i].score[2]<<' ';
fout<<stu[i].score[3]<<' ';
fout<<stu[i].aver<<endl;
}
}
int main()
{
int i,j,k,ch;
string stna,stno;
memset(stuin,false,sizeof(stuin));
stunum=n=i=0;
cout<<"正在导入学生信息文件......";
if(fin.fail()) cout<<endl<<"学生信息文件不存在!"<<endl;
else{
while(!fin.eof()){
fin>>stu[i].no>>stu[i].name;
for(j=0;j<4;j++)
fin>>stu[i].score[j];
fin>>stu[i].aver;
stuin[i]=true;
i++;
}
cout<<endl<<"OK!"<<endl;
stunum=n=i-1;
cout<<stunum<<"个学生信息现在在学生文件中!"<<endl;
}
fin.close();
while(1)
{
bool flag=false;
showmenu();
cin>>ch;
if(ch==5) break;
switch(ch){
case 1: Inserts(); break;
case 2: Modifys(); break;
case 3: Searchs(); break;
case 4: Deletes(); break;
default: cout<<"输入不正确,请重新选择!"<<endl;
getchar();
flag=true;
}
if(flag) continue;
}
savedata();
return 0;
}
/*
2、 编写小学生数学测试软件。
(1) 可选择题型加,减,乘。
(2) 可选择每次答题的个数。
(3) 随机生成两个数进行运算。
(4) 每次输入答案后判断对错,若答案错误,给出正确答案。
(5) 最后给出做对题目的总个数。
*/
#include<iostream>
#include<fstream>
#include<iomanip>
#include<time.h>
#include<cstdlib>
using namespace std;
const int maxn=1000; //设置加法,减法的最大数,这里设置为1000
const int maxn2=100; //设置乘法的最大数,这里设置为100
int n;
void plusfunc()
{
int a,b,c;
int score=0;
while(n--){
a=rand()%(maxn+1);
b=rand()%(maxn+1);
cout<<a<<" + "<<b<<"= "<<endl;
cin>>c;
if(c==a+b) {
cout<<"回答正确,加十分!"<<endl;
score+=1;
}
else cout<<"答错了!正确答案是: "<<a+b<<endl;
}
cout<<"您答对了 "<<score<<" 个题目,得分为"<<score*10<<" 分!"<<endl;
}
void subfunc()
{
int a,b,c;
int score=0;
while(n--){
a=rand()%(maxn+1);
b=rand()%(maxn+1);
if(a<b) swap(a,b);
cout<<a<<" - "<<b<<"= "<<endl;
cin>>c;
if(c==a-b) {
cout<<"回答正确,加十分!"<<endl;
score+=1;
}
else cout<<"答错了!正确答案是: "<<a-b<<endl;
}
cout<<"您答对了 "<<score<<" 个题目,得分为"<<score*10<<" 分!"<<endl;
}
void multifunc()
{
int a,b,c;
int score=0;
while(n--){
a=rand()%(maxn2+1);
b=rand()%(maxn2+1);
cout<<a<<" * "<<b<<"= "<<endl;
cin>>c;
if(c==a*b) {
cout<<"回答正确,加十分!"<<endl;
score+=1;
}
else cout<<"答错了!正确答案是: "<<a*b<<endl;
}
cout<<"您答对了 "<<score<<" 个题目,得分为 "<<score*10<<" 分!"<<endl;
}
int main()
{
int i,j,k;
cout<<"请选择要做的题型:"<<endl
<<"1.加法"<<endl
<<"2.减法"<<endl
<<"3.乘法"<<endl;
cin>>k;
cout<<"请选择要做的题目个数:";
cin>>n;
srand((unsigned) time(0));
switch(k){
case 1: plusfunc(); break;
case 2: subfunc(); break;
case 3: multifunc();break;
default: cout<<"输入错误,程序结束!";
}
return 0;
}
/*
5、 打印如下方阵(任选一题)。
(1) 螺旋方阵:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
*/
#include<iostream>
#include<fstream>
#include<string>
#include<algorithm>
#include<iomanip>
using namespace std;
int n,dirnow,cnt;
int a[101][101];
bool filla[101][101];
int dir[4][2]={0,1,1,0,0,-1,-1,0};
void dfs(int i,int j)
{
int x;
int y;
if(cnt==n*n) return;
dirnow%=4;
x=i+dir[dirnow][0];
y=j+dir[dirnow][1];
if(x<0 || x>=n || y<0 || y>=n || filla[x][y])
dirnow++;
dirnow%=4;
cnt++;
filla[i+dir[dirnow][0]][j+dir[dirnow][1]]=true;
a[i+dir[dirnow][0]][j+dir[dirnow][1]]=cnt;
dfs(i+dir[dirnow][0],j+dir[dirnow][1]);
}
int main()
{
int i,j;
cout<<"请输入要打印螺旋矩阵的维数:";
cin>>n;
memset(filla,false,sizeof(filla));
a[0][0]=1;
filla[0][0]=true;
dirnow=0;
cnt=1;
dfs(0,0);
for(i=0;i<n;i++){
for(j=0;j<n;j++){
cout<<a[i][j]<<"\t";
}
cout<<endl;
}
return 0;
}
/*
7、 假定用一个整型数组表示一个长整数,数组的每个元素存储长整数的一位数字,实际的
长整数 m表示为:
m=a[k]× 10-1+a[k-1]× 10-2+….+a[2]×10+a[1]
其中 a[0]保存该长整数的位数。完成(任选一题) :
(1) 长整数乘普通整数。
(2) 长整数除普通整数。
*/
#include<iostream>
#include<fstream>
#include<string>
#include<algorithm>
using namespace std;
string operator*(string s, int a); // s,a非负,且a必须小于2*10^8.
string MSDiv(string x, int y, int &res); // 多精度除以int,x非负,y为正
string operator/(string s, int a); // 调用MSDiv
string Head_zero_remover(string num); // 除了开头可能有'0'外,num必须是非负数。
bool Less(string x, string y); // 非负数之间的"小于"
string operator-(string s); // 取负
string SAdd(string x, string y);
string SMinus(string x, string y);
string SMul(string x, string y);
string SMul(string s, int a); // 同样,a的绝对值不能超过2*10^8
string operator*(string s, int a)
{
if(s == "0" || a == 0) // 以免后面特殊处理!
return "0";
string prod(s.size(), -1); // 先申请s.size()位
int carry=0;
for(int i=s.size()-1; i >= 0; --i)
{
carry += (s[i]-'0')*a;
prod[i] = carry%10+'0';
carry /= 10;
}
while(carry>0)
{
prod.insert(prod.begin(), carry%10+'0');
carry /= 10;
}
return prod;
}
string MSDiv(string x, int y, int &res)
{
string quot(x.size(), 0);
res=0;
for(int i=0; i<x.size(); ++i)
{
res = 10*res+x[i]-'0';
quot[i] = res/y+'0'; // 整除结果为商
res %= y; // 取余保留
}
return Head_zero_remover(quot);
}
string operator/(string s, int a)
{
int res;
return MSDiv(s, a, res);
}
string Head_zero_remover(string num) // 化简"003"等数
{
if(num[0] != '0')
return num;
int pos=num.find_first_not_of('0');
if(pos == string::npos) // 全0
return "0";
return num.substr(pos, num.size()-pos);
}
string operator-(string s)
{
if(s[0] == '-')
return s.substr(1, s.size()-1);
if(s == "0")
return "0";
return string("-") += s;
}
string SMul(string s, int a)
{
if(s[0] == '-' && a<0)
return (-s)*(-a);
if(s[0] == '-')
return -((-s)*a);
if(a<0)
return -(s*(-a));
return s * a;
}
int main()
{
string s1;
int a;
cout<<"请输入长整数:";
cin>>s1;
cout<<"请输入普通整数:";
cin>>a;
cout<<s1<<" * "<<a<<" = "<<s1*a<<endl;
cout<<s1<<" / "<<a<<" = "<<s1/a<<endl;
return 0;
}
/*
9、 算法问题(任选一题) 。
(1) 皇后问题:在国际象棋中,能否在空棋盘上摆放八个皇后,并使其中任意两个皇后
不能在同一行或同一列或同一对角线上,并编写完整的摆放八皇后问题的程序。要求:
第一个皇后的起始位置由键盘输入,国际象棋的棋盘为 8*8 的方格。
*/
#include<iostream>
using namespace std;
bool Col[8],LeftCr[16],RightCr[16],Row[8];
short Answer[8],Count=0;
/*Col{行标志定义}
Answer{列标志定义}
LeftCr{左斜对角线标志定义}
RightCr{右斜对角线标志定义}
{Count:解的个数纪录}
*/
//-------------------------判断一个位置是否可以置一个皇后-----------------------
bool IfSafe(short x,short y)
{
return ((Col[y]==true)
|| (LeftCr[x-y+7]==true)
|| (RightCr[x+y]==true))?false:true;
}
//-----------------------------从当前位置删除一个皇后--------------------------
void CutQueen(short x,short y)
{
Col[y]=false;
LeftCr[x-y+7]=false;
RightCr[x+y]=false;
}
//---------------------------------打印一组解----------------------------------
void PrintAnswer()
{
int CurAns;
printf("\nCOUNT[%4d]\n",++Count);
for (CurAns=0;CurAns<8;CurAns++) {
for(int i=0;i<8;i++)
if(i==Answer[CurAns])
printf("Q");
else
printf(".");
printf("\n");
}
}
//---------------------------------置皇后(核心部分)----------------------------
void PutQueen(short x)
{
short y;
if(x==8) PrintAnswer();
if(Row[x]) PutQueen(x+1);
else
for (y=0;y<8;y++)
{
if (IfSafe(x,y))
{
Answer[x]=y;
Col[y]=true;
LeftCr[x-y+7]=true;
RightCr[x+y]=true;
PutQueen(x+1);
CutQueen(x,y);
}
}
}
//--------------------主程序体--------------------------------------------
int main()
{
int x,y;
for (int i=0;i<8;i++)
Answer[i]=0;
cout<<"请输入第一行的皇后位置:";
cin>>x>>y;
x--;
y--;
Answer[x]=y;
Col[y]=true;
Row[x]=true;
LeftCr[x-y+7]=true;
RightCr[x+y]=true;
PutQueen(0);
return 0;
}