北航 计算机软件基础 作业讲解.docx
《北航 计算机软件基础 作业讲解.docx》由会员分享,可在线阅读,更多相关《北航 计算机软件基础 作业讲解.docx(26页珍藏版)》请在冰豆网上搜索。
![北航 计算机软件基础 作业讲解.docx](https://file1.bdocx.com/fileroot1/2023-5/28/3f622504-183c-4232-b5b5-226bf79cb4e9/3f622504-183c-4232-b5b5-226bf79cb4e91.gif)
北航计算机软件基础作业讲解
1、编写一程序,输入全班40名同学的姓名(字符串)、学号、语文成绩、数学成绩、外语成绩;保存在结构体数组中。
然后对此结构体数组排序,使得排序后的结构体数组中的元素按学生平均成绩非递增有序。
#include
#include
#defineNUM40//定义NUM代表全班人数
structSTUDENT
{
charname[20];
intnumber;
floatchinese,math,english;
floataverage;
}student[NUM];//定义结构体数组
typedefstructSTUDENTS;//声明一个结构体变量
voidsort(Ss[NUM])//冒泡法进行排序
{
inti,j;
chartemp1[20];
inttemp2;
floattemp3,temp4,temp5,temp6;
for(i=0;ifor(j=0;jif(s[j].average
{
strcpy(temp1,s[j].name);
strcpy(s[j].name,s[j+1].name);
strcpy(s[j+1].name,temp1);
temp2=s[j].number;
s[j].number=s[j+1].number;
s[j+1].number=temp2;
temp3=s[j].chinese;
s[j].chinese=s[j+1].chinese;
s[j+1].chinese=temp3;
temp4=s[j].math;
s[j].math=s[j+1].math;
s[j+1].math=temp4;
temp5=s[j].english;
s[j].english=s[j+1].english;
s[j+1].english=temp5;
temp6=s[j].average;
s[j].average=s[j+1].average;
s[j+1].average=temp6;
}
}
voidmain()
{
inti;
for(i=0;i{
printf("请的输入第%d个学生学生的信息:
\n",i+1);
printf("name:
");
scanf("%s",&student[i].name);
printf("number:
");
scanf("%d",&student[i].number);
printf("chinese:
");
scanf("%f",&student[i].chinese);
printf("math:
");
scanf("%f",&student[i].math);
printf("english:
");
scanf("%f",&student[i].english);
student[i].average=(student[i].chinese+student[i].math+student[i].english)/3;
}
printf("姓名学号语文数学英语平均\n");
for(i=0;i{
printf("%s%d%5.2f%5.2f%5.2f%5.2f\n",student[i].name,student[i].number,student[i].chinese,student[i].math,student[i].english,student[i].average);
}
sort(student);
printf("排序结果为:
\n");
printf("姓名学号语文数学英语平均\n");
for(i=0;i{
printf("%s%d%5.2f%5.2f%5.2f%5.2f\n",student[i].name,student[i].number,student[i].chinese,student[i].math,student[i].english,student[i].average);
}
}
图1
2、编写一程序,输入全班N名同学的姓名、学号、语文成绩、数学成绩、外语成绩。
然后按照学生平均成绩非递增排序。
程序需能方便地进行插入、删除等操作。
#include
#include
#include
typedefstructnode//定义一个结构体并声明结构体类型
{
charname[20];
intnumber;
floatchinese,math,english;
floataverage;
structnode*Link;
}Node;
typedefNode*List;//声明结构类类型的指针
Node*NewNode()//生成新节点
{
Node*p=(Node*)malloc(sizeof(Node));
p->Link=NULL;
returnp;
}
ListBuildList(intn)//建立空链表
{
Node*p,*r=NULL,*first=NULL;
inti;
for(i=0;i{
p=NewNode();
if(first!
=NULL)
r->Link=p;
else
first=p;
r=p;
}
returnfirst;
}
ListSort(ListSL)//冒泡法进行排序
{
Listp,q;
chartemp1[20];
inttemp2;
floattemp3,temp4,temp5,temp6;
for(p=SL;p!
=NULL;p=p->Link)
{
for(q=p->Link;q!
=NULL;q=q->Link)
{
if(p->averageaverage)
{
strcpy(temp1,q->name);
strcpy(q->name,p->name);
strcpy(p->name,temp1);
temp2=q->number;
q->number=p->number;
p->number=temp2;
temp3=q->chinese;
q->chinese=p->chinese;
p->chinese=temp3;
temp4=q->math;
q->math=p->math;
p->math=temp4;
temp5=q->english;
q->english=p->english;
p->english=temp5;
temp6=q->average;
q->average=p->average;
p->average=temp6;
}
}
}
returnSL;
}
voidmain()
{
Node*LS,*p;
intn;
printf("thenumberofstudentis\n");
scanf("%d",&n);
LS=BuildList(n);
p=LS;
for(;p;p=p->Link)
{
printf("thenameis");
scanf("%s",&p->name);
printf("thenumberis");
scanf("%d",&p->number);
printf("thechineseis");
scanf("%f",&p->chinese);
printf("themathis");
scanf("%f",&p->math);
printf("theenglishis");
scanf("%f",&p->english);
p->average=(p->chinese+p->math+p->english)/3;
}
for(p=LS;p;p=p->Link)
{
printf("namenumberchinesemathenglishaverage\n");
printf("%s%5d%5.2f%5.2f%5.2f%5.2f\n",p->name,p->number,p->chinese,p->math,p->english,p->average);
}
LS=Sort(LS);
printf("排序后的结果为:
\n");
for(p=LS;p;p=p->Link)
{
printf("namenumberchinesemathenglishaverage\n");
printf("%s%5d%5.2f%5.2f%5.2f%5.2f\n",p->name,p->number,p->chinese,p->math,p->english,p->average);
}
}
图2
3、实现约瑟夫环
#include"stdio.h"
#include"stdlib.h"
structnode//定义一个结构体
{
intnum;
intcode;
structnode*Link;
};
typedefstructnodeNODE;//声明一个结构体类型
NODE*createlinklist(intn)//建立链表
{
NODE*head,*p,*q;
inti=1;
head=p=(structnode*)malloc(sizeof(structnode));
p->num=i;
p->code=rand()%100;
p->Link=NULL;
for(i=2;i<=n;i++)
{
q=(structnode*)malloc(sizeof(structnode));
q->Link=NULL;
if(q==0)return(0);
p->Link=q;
p=q;
p->num=i;
p->code=rand()%100;
}
p->Link=head;//使链表尾指向链表头形成循环链表
returnhead;
}
voidprintlinklist(NODE*p,intn)//输出链表
{
inti;
NODE*q=p;
if(NULL==q->Link)
{
printf("thelistisNULL!
");
return;
}
printf("所有玩家的信息列表:
\n");
for(i=1;i<=n;i++)
{
if(NULL==q)
{
printf("thelistisNULL!
");
return;
}
printf("%d%d\n",p->num,p->code);
p=p->Link;
}
}
voidjoseph(NODE*p,intn,intm)//实现约瑟夫环
{
inti,j;
NODE*q;
for(i=1;i{
for(j=1;j<=m-1;j++)
{
p=p->Link;
}
q=p->Link;
p->Link=q->Link;
printf("%d%d\n",q->num,q->code);
free(q);
}
printf("\n最后剩余的是第%d号的密码是%d.\n",p->num,p->code);
p->Link=NULL;
}
voidmain()
{
NODE*head;
intn,m;
printf("请输入人数N:
\n");
scanf("%d",&n);
printf("输入K:
\n");
scanf("%d",&m);
head=createlinklist(n);
printlinklist(head,n);
printf("依次被选出的是:
\n");
joseph(head,n,m);
}
图3
4、实现多项式的表示与三则运算(+,-,×)
#include
#include
#include
typedefstructnode
{//定义并声明一个结构体变量
intcoe;
intexp;
structnode*Link;
}Node;
typedefNode*List;//声明一个结构体指针
Node*NewNode()//生成一个新节点
{
Node*p=(Node*)malloc(sizeof(Node));
p->Link=NULL;
returnp;
}
ListBuildList(intn)//生成链表
{
Node*p,*r=NULL,*first=NULL;
inti;
for(i=0;i{
p=NewNode();
if(first!
=NULL)
r->Link=p;
else
first=p;
r=p;
}
returnfirst;
}
voidprintList(Node*p)//多项式显示
{
for(;p;p=p->Link)
{
printf("%dx^%d",p->coe,p->exp);
if(p->Link)
printf("+");
}
printf("\n");
}
ListSort(ListSL)//多项式排序
{
Listp,q;
inttemp1,temp2;
for(p=SL;p!
=NULL;p=p->Link)
{
for(q=p->Link;q!
=NULL;q=q->Link)
{
if(p->exp>q->exp)
{
temp1=q->coe;
q->coe=p->coe;
p->coe=temp1;
temp2=q->exp;
q->exp=p->exp;
p->exp=temp2;
}
}
}
returnSL;
}
ListAddList(Node*la,Node*lb)//多项式相加
{
Node*p,*lc=NULL,*r=NULL;
while(la!
=NULL&&lb!
=NULL)
{
if(la->exp==lb->exp)
{
p=(Node*)malloc(sizeof(Node));
p->coe=la->coe+lb->coe;
p->exp=la->exp;
p->Link=NULL;
la=la->Link;
lb=lb->Link;
}
elseif(la->expexp)
{
p=(Node*)malloc(sizeof(Node));
p->coe=la->coe;
p->exp=la->exp;
p->Link=NULL;
la=la->Link;
}
else
{
p=(Node*)malloc(sizeof(Node));
p->coe=lb->coe;
p->exp=lb->exp;
p->Link=NULL;
lb=lb->Link;
}
if(lc!
=NULL)
r->Link=p;
else
lc=p;
r=p;
}
if(la)
r->Link=la;
else
r->Link=lb;
returnlc;
}
ListMultiList(ListLA,ListLB)//多项式相乘
{
Listla=LA;
Listlb=LB;
Lists=NULL;
Listlc[100];
Listr[100];
Listnode=NULL;
inti=0;
for(;i<100;i++)
{
lc[i]=NULL;
r[i]=NULL;
}
i=0;
for(;la;la=la->Link)
{
for(lb=LB;lb;lb=lb->Link)
{
node=(List)malloc(sizeof(Node));
node->coe=la->coe*lb->coe;
node->exp=la->exp+lb->exp;
node->Link=NULL;
if(lc[i]!
=NULL)
r[i]->Link=node;
else
lc[i]=node;
r[i]=node;
}
i++;
}
s=lc[0];
for(i=1;i<100;i++)
{
if(lc[i])
s=AddList(s,lc[i]);
else
break;
}
returns;
}
voidmain()
{
inta,b;
Node*LA,*LB,*LC,*S,*p,*r;
printf("thefirstmultinomialis\n");
scanf("%d",&a);
LA=BuildList(a);
p=LA;
for(;p;p=p->Link)
{
printf("thecoeis");
scanf("%d",&p->coe);
printf("theexpis");
scanf("%d",&p->exp);
}
printf("thesecondmultinomialis\n");
scanf("%d",&b);
LB=BuildList(b);
r=LB;
for(;r;r=r->Link)
{
printf("thecoeis");
scanf("%d",&r->coe);
printf("theexpis");
scanf("%d",&r->exp);
}
LA=Sort(LA);
LB=Sort(LB);
printList(LA);
printList(LB);
LC=AddList(LA,LB);
printf("theresultofLA+LBis\n");
printList(LC);
S=MultiList(LA,LB);
printf("theresultofLA*LBis\n");
printList(S);
}
图4
5.判断输入的数是否为素数?
#include
#include
usingnamespacestd;
main()
{
longN;
cout<<"inputanumberfrom1to100000:
"<cin>>N;
cout<<"isitaprimenumber?
"<if(N==2)
cout<<"yes"<elseif(N>2)
{
inti=2;
while(i{
if(N%i==0)
{
cout<<"no"<return;
}
i++;
}
cout<<"yes"<}
else
cout<<"error"<}
图5.1图5.2
图5.3
6.解释程序
#include
main()
{
intn;
printf("请输入一个数:
");
scanf("%d",&n);
inta=0x1f;
printf("n的十六进制为:
%x\n",n);
printf("a的十六进制为:
%x\n",a);
if(n&a==a)
printf("theresultis%d\n",n);
else
printf("donothing\n");
}
图6.1图6.2
图6.3图6.4
#include
main()
{
intn;
printf("请输入一个数:
");
scanf("%d",&n);
inta=0x1f;
printf("n的十六进制为:
%x\n",n);
printf("a的十六进制为:
%x\n",a);
if((n&a)==a)
printf("theresultis%d\n",n);
else
printf("donothing\n");
}
图6.5图6.6
图6.7图6.8
主要是运算符号的优先级判断:
==(等于) 高于 &(位与)
7.时间复杂度分析:
分析算法的复杂度,分析频度的次数.
按数量级递增排列,常见的时间复杂度:
O
(1))O(nloglogn))))<
O(
)))