【《高级语言程序设计》实验报告】 高级语言程序设计过程

来源:考研 发布时间:2020-03-11 点击:

  

 《高级语言程序设计》 课 程 实 验 报 告

  专

  业:

  软件工程

 年

  级:

 17级

  姓

  名:

 **

  学

  号:

  201742060220

 教

  师:

 ***

 日

  期:

 2018.10.1

 ** 民 族 大 学 目录 一、 实验目的 3 二、 任务与要求 3 三、 主要标识符及数据结构 4 四、 问题分析与算法设计 6 五、 程序运行与测试实例 11 六、 问题与总结 15 附录(源代码) 15

  一、 实验目的 1、 掌握新学习的线性表操作。 2、 加深对书写代码的流畅度。 二、 任务与要求 1、 问题描述 l 题目1:设计一种用单链表存储多项式的结构(每个结点存储一项的系数和指数,类型都为int)并编写一个产生多项式链表的函数和一个实现两个多项式相加和相乘的函数。 l 题目2:试将本章介绍的两种josephus问题的求解过程在计算机中实现,实现时要求输出的不是整数,而是实际的人名。、 l 题目3:

 2、 设计达到的要求 l 能正确的输出题目的要求结果。 l 能正确使用线性表。 三、 主要标识符及数据结构 说明:1、描述清楚自己所用的标识符, 格式如

 标识符

  数据类型 含义 第一题 ptrNode struct node

  用于typedef 转换 Coefficient 、Exponent

  int 指数和系数 head、r、p

 LinkList 用于生成结点以及遍历链表在函数(LinkList creatList(int n))内 ha, hb Position 在函数LinkList add_List(LinkList a, LinkList b)内完成多项式相加操作 c,r,p; LinkList 在函数LinkList add_List(LinkList a, LinkList b)内完成多项式相加操作 ha, hb Position 在函数LinkList mul_List(LinkList a, LinkList b)内完成多项式相乘 c,tempC,r,p LinkList 在函数LinkList mul_List(LinkList a, LinkList b)内完成多项式相乘 hc LinkList 在函数void printList(LinkList L)遍历链表进行输出链表操作 n1,n2 int 在主函数中需要输入每个多项式的项数 L1,L2,L3,L4 LinkList 在主函数中接受调用的函数的返回值 第二题 标识符 数据类型 含义

 DataType

 struct Person 结构体数据类型 typedef struct Node* PNode;

 LinkList struct Node 结构体数据类型 typedef struct Node* LinkList

 PLinkList LinkList typedef LinkList* PLinkList

 p、q、 PNode PNode类型指针在函数int init_clist(PLinkList pclist, int n)内

 p, pre PNode PNode类型指针在函数void josephus_clist(PLinkList pclist, int s, int m)内

 x、y、z int 循环表总人数x、第y个人开始数、第z个人 出局

 josephus LinkList LinkList类型指针在主函数中的 第三题 标识符

  数据类型 含义

 Plist Data struct List 结构体数据类型

 number、name Char 一个存放电话号、一个存放姓名

 next struct List struct List内的指针变量

 Plist data del、p、t pList 中间变量

 count int 用作计算个数

 四、 问题分析与算法设计 1、 问题分析 说明:分析程序题目与要求,详细说明程序的设计思想。 2、 算法设计 l 第一题、 S1:定义struct node{

 ElementType Coefficient;

 ElementType Exponent;

 Position next; }; S2:typedef struct node *ptrNode; typedef ptrNode LinkList;

 //头结点 typedef ptrNode Position;//中间节点 typedef int ElementType; S3:写一个函数int IsEmpty(LinkList L)判断参数LinkList L为空 S4: 写一个函数LinkList add_List(LinkList a, LinkList b)进行多项式加法计算。 S5:写一个函数LinkList mul_List(LinkList a, LinkList b)进行多项式乘法计算 S6: 在主函数中调用函数输出加法结果和乘法结果。 此处只给出进行加法LinkList add_List(LinkList a, LinkList b)函数的算法: S1:函数有形参LinkList a, LinkList b,定义Position ha, hb;LinkList c,r,p; int temp; S2:再有ha = a->next; hb = b->next; S3:分配存储空间给C,然后r = c; S4:然后在循坏while((ha != NULL)&&(hb != NULL))下分配存储空间给p S5:if(ha->Exponent < hb->Exponent)条件下p->Exponent = hb->Exponent; p->Coefficient = hb->Coefficient; hb = hb->next; r->next = p;

 r = p; S6:else if(ha->Exponent > hb->Exponent) 条件下p->Exponent = ha->Exponent; p->Coefficient = ha->Coefficient; ha = ha->next;

 r = p; S7:else 条件下{

  temp = ha->Coefficient + hb->Coefficient;

  if(temp != 0){

 p->Exponent = ha->Exponent;

  p->Coefficient = temp;

  r->next = p;

  r = p; }

  hb = hb->next;

  ha = ha->next;

 } } S8:以上操作完成后if(hb == NULL)进行while(ha != NULL){

 p = (struct node*)malloc(sizeof(struct node));

 p->Exponent = ha->Exponent;

 p->Coefficient = ha->Coefficient;

 ha = ha->next;

 r->next = p;

  r = p;

  } S9:if(hb == NULL)进行while(ha != NULL){

 p = (struct node*)malloc(sizeof(struct node));

 p->Exponent = ha->Exponent;

 p->Coefficient = ha->Coefficient;

 ha = ha->next;

 r->next = p;

  r = p;

  } S10:r->next = NULL; S11:返回值return c; l 第二题、 S1: 定义struct Person结构体{ int num; char name[8]; } typedef struct Person DataType;词结构体用来存储 元素 S2:创建struct Node;typedef struct Node* PNode;结点类型 S3:struct Node{ DataType info; PNode link; }; typedef struct Node* LinkList;typedef LinkList* PLinkList; S4: 写一个函数int init_clist(PLinkList pclist, int n) 进行循环表初始化 S5:写一个函数void josephus_clist(PLinkList pclist, int s, int m) 进行循环表操作 S6:在主函数中 LinkList josephus;写三个循坏分别用来循环表总人数x、从第y个人开始数、第z个人 出局、此三个函数为 do{printf("\t循环表总人数x: ");scanf("%d",&x); }while(x<1);

 do{printf("\t从第y个人开始数: ");scanf("%d",&y);

 }while(y<1); do{printf("\t第z个人 出局: ");scanf("%d",&z); }while(z<1); S7:然后写一个判断if (init_clist(&josephus,x)) josephus_clist(&josephus,y,z);

 else printf("溢出\n"); S8:return 0; S9:结束。 l 第三题: S1:定义结构体struct List{char number[20]; char name[20]; struct List* next; }; S2:typedef struct List* PList; typedef struct List Data; S3: 写一个增加空链表函数PList createNullList() S4:写一个增加号码的函数int addNewPre(PList plist,Data x) S5:写一个删除号码的函数int delPosX(PList plist,char *name) S6:写一个查看号码的函数int lookAll(PList plist) S7:写一个查找号码的函数 int findData(PList plist,char *name) S8:在主函数中定义PList p 接收createNullList();中的返回值 再写一个菜单然后在菜单中调用增删、查看、查找这4个函数。 S9:return 0; S10:结束。 五、 程序运行与测试实例

 l 第一题图一、

 图例1-1

 l 第一题图二、

  图例1-2 l 第一题图三、

 图例1-3

 l 第二题图1

 图例2-1

  l 第二题图2

  图例2-2 l 第二题图3、

 图例2-3

  l 第三题图一:

 图例3-1 l 第三题图二:

 图例3-2 六、 问题与总结

 说明:可以提出程序设计中需要进一步深入考虑的问题。总结整个设计所取得的结果,并做简单分析。总结设计过程中的心得体会。要求实事求是,不要出现空话套话。 l 第2题用顺序表模拟输出josephus问题有点问题没调试出来、就没有写实验报告。只写了采用循坏链表模拟。 l 第3题有点bug。

 附录(源代码) 明:粘贴设计程序所有源代码 第一源代码: #include<stdio.h> #include<stdlib.h> typedef struct node *ptrNode; typedef ptrNode LinkList;

 //头结点 typedef ptrNode Position;//中间节点 typedef int ElementType; struct node{

 ElementType Coefficient;

 ElementType Exponent;

 Position next; };

 int IsEmpty(LinkList L) {

 return L->next == NULL; } LinkList creatList(int n) {

 LinkList head,r,p;

 int coe,exp;

 head = (struct node*)malloc(sizeof(struct node));

 //生成新结点

 r = head;

 while(n--){

  scanf("%d%d",&coe,&exp);

  p = (struct node*)malloc(sizeof(struct node));

  p->Coefficient = coe;

  p->Exponent = exp;

  r->next = p;

 r = p;

 }

 r->next = NULL;

 return head; } LinkList add_List(LinkList a, LinkList b) { Position ha, hb;

 LinkList c,r,p;

 int temp;

 ha = a->next;

 hb = b->next;

  c = (struct node*)malloc(sizeof(struct node));

 r = c;

 while((ha != NULL)&&(hb != NULL)){

  p = (struct node*)malloc(sizeof(struct node));

  if(ha->Exponent < hb->Exponent){

 p->Exponent = hb->Exponent;

 p->Coefficient = hb->Coefficient;

 hb = hb->next;

  r->next = p;

 r = p;

  }

  else if(ha->Exponent > hb->Exponent){

 p->Exponent = ha->Exponent;

 p->Coefficient = ha->Coefficient;

 ha = ha->next;

  r->next = p;

  r = p;

  }

  else{

  temp = ha->Coefficient + hb->Coefficient;

  if(temp != 0){

  p->Exponent = ha->Exponent;

  p->Coefficient = temp;

  r->next = p;

  r = p;

  }

  hb = hb->next;

  ha = ha->next;

  }

  }

 if(ha == NULL){

 while(hb != NULL){

 p = (struct node*)malloc(sizeof(struct node));

 p->Exponent = hb->Exponent;

 p->Coefficient = hb->Coefficient;

 hb = hb->next;

 r->next = p;

  r = p;

  }

 }

  if(hb == NULL){

 while(ha != NULL){

 p = (struct node*)malloc(sizeof(struct node));

 p->Exponent = ha->Exponent;

 p->Coefficient = ha->Coefficient;

 ha = ha->next;

 r->next = p;

  r = p;

  }

 }

  r->next = NULL;

  return c;

 }

  LinkList mul_List(LinkList a, LinkList b)

 {

  Position ha, hb;

 LinkList c,tempC,r,p;

 ha = a->next;

  hb = b->next;

 //c = (struct node*)malloc(sizeof(struct node));

  //c->next = NULL;

  c = creatList(0);

 if(ha == NULL || hb == NULL){

  return c;

 }

  while(ha != NULL ){

  tempC = (struct node*)malloc(sizeof(struct node));

  r = tempC;

  hb = b->next;

  while(hb != NULL){

  p = (struct node*)malloc(sizeof(struct node));

  p->Exponent = ha->Exponent + hb->Exponent;

  p->Coefficient = ha->Coefficient*hb->Coefficient;

 hb = hb->next;

  r->next = p;

 r = p;

 }

  r->next = NULL;

  c = add_List(c,tempC);

  //

 tempHead = tempC->next;

 //

 tempC->next = NULL;

 //

 while(tempHead != NULL){

 //

 free(tempHead);

 //

 tempHead = tempHead->next;

 //

 }

  ha = ha->next;

 } return c; }

 void printList(LinkList L)

 {

 LinkList hc;

 int flag = 0;

 hc = L->next;

 if(hc == NULL)

  printf("0 0");

 while(hc != NULL){

  if(flag)

 printf(" ");

  else

 flag = 1;

  printf("%d %d",hc->Coefficient,hc->Exponent);

  hc = hc->next;

 } }

 int main(void) {

  int n1,n2;

 LinkList L1,L2,L3,L4;

 printf("第一个多项式你需要输入几项:\n");

  scanf("%d",&n1);

 printf("请输入一个有%d项的多项式:\n",n1);

 L1 = creatList(n1);

 printf("第二个多项式你需要输入几项\n");

 scanf("%d",&n2);

 printf("请输入一个有%d项的多项式:\n",n2);

 L2 = creatList(n2);

 L3 = add_List(L1,L2);

  L4 = mul_List(L1,L2);

 printf("加法结果为(每两个数字之间分别为系数和指数):\n");

 printList(L3);

 printf("\n");

 printf("乘法结果为(每两个数字之间分别为系数和指数):\n");

 printList(L4);

  system("pause");

 return 0;}

 l 第二题源代码 #include <stdio.h> #include <stdlib.h> #include <string.h>

 #define Fal 0 #define True 1

  struct Person//元素类型

 {

 int num;

 char name[8]; }; typedef struct Person DataType;

 //结点类型

 struct Node; typedef struct Node* PNode;

 struct Node {

 DataType info;

 PNode link; }; typedef struct Node* LinkList; typedef LinkList* PLinkList;

  int init_clist(PLinkList pclist, int n)//循环表初始化 {

 PNode p,q;

 int i,j,cpy_i,count=0;

 char temp[10];

 q = (PNode)malloc(sizeof(struct Node));

 if (q == NULL) return Fal;

 *pclist = q;

 (q->info).num=1;

 strcpy((q->info).name,"人1");

 q->link = q;

 if (n == 1) return True;

 //初始化(n)结点循环表

  for (i=2; i<n+1; i++)

 {

  p = (PNode)malloc(sizeof(struct Node));

  if (p == NULL) return Fal;

  (p->info).num = i;

  memset((p->info).name,'\0',sizeof(char)*8);

  strcpy((p->info).name,"人");

  cpy_i = i;

 memset(temp,'\0',sizeof(char)*10);

  j=0;count=0;

  while (cpy_i != 0)

  {

 temp[j] = cpy_i%10 + '0';

 cpy_i /= 10;

 j++;

 count++;

  }

  j=0;

  while (count-j>0)

  {

 char o=temp[j];

 temp[j] = temp[count-1];

 temp[count-1] = o;

 j++;

 count--;

  }

  char* th = &(p->info).name[2];

  strcpy(th,temp);

  p->link = q->link;

  q->link = p;

  q = p;

 }

 return True; }

 //循环表操作

 void josephus_clist(PLinkList pclist, int s, int m) {

 PNode p, pre;

 int i;

 p = *pclist;

 //找到第s个元素

 if (s==1)

 {

  pre = p;

  p = p->link;

  while (p!=*pclist)

  {

 pre = p;

 p = p->link;

  }

 }

 else

  for (i=1; i<s; i++)

  {

 pre = p;

 p = p->link;

  }

 while (p!=p->link)

 {

  for(i=1;i<m;i++)

  {

 pre = p;

 p = p->link;

 }

  printf("出局的人为: %s\n",(p->info).name);

  if (*pclist==p)

 *pclist = p->link;

  pre->link = p->link;

  free(p);

  p = pre->link;

 }

 printf("最终剩下: %s\n",(p->info).name);

 *pclist = NULL;

 free(p); }

 int main() {

 LinkList josephus;

 int x,y,z;

 do{

  printf("\t循环表总人数x: ");

  scanf("%d",&x);

 }while(x<1);

 do{

  printf("\t从第y个人开始数: ");

  scanf("%d",&y);

 }while(y<1);

 do{

  printf("\t第z个人 出局: ");

  scanf("%d",&z);

 }while(z<1);

  if (init_clist(&josephus,x))

  josephus_clist(&josephus,y,z);

 else

  printf("溢出\n");

 getchar();

 system("pause");

 return 0; } l 第三源代码、 #include<stdio.h> #include<stdlib.h> #include<string.h> struct List {

 char number[20];

 char name[20];

  struct List* next; }; typedef struct List* PList; typedef struct List Data;

  PList createNullList()//增加空链表 {

 PList plist =

 (PList)malloc(sizeof(struct List));

 if (plist==NULL)

 {

  printf("Building false!\n");

  return NULL;

 }

 else //初始化

  {

 memset(&plist->number,'\0',sizeof(plist->number));

  memset(&plist->name,'\0',sizeof(plist->name));

  plist->next = NULL;

 }

  return plist; }

  int addNewPre(PList plist,Data x)//增加 {

 PList data = (PList)malloc(sizeof(PList));

 PList t = plist;

 if (t->next != NULL)

  while (true)

  {

 if (strcmp(t->next->name,x.name)!=0)

  t = t->next;

 else if (t->next == NULL)

  break;

 else

 {

  printf("输入重复!\n");

  return -1;

 }

  }

 strcpy(data->number,x.number);

 strcpy(data->name,x.name);

 data->next = plist->next;

 plist->next = data;

 printf("增加成功!(%s,%s)\n",data->name,data->number);

 return 0; }

  int delPosX(PList plist,char *name)//删除 {

 PList del;

 PList t = plist;

 //查找位置

 while (strcmp(t->next->name,name)!=0)

  t = t->next;

 del = t->next;

 t->next = t->next->next;

 printf("Delete success!(%s)\n",del->number);

 free(del);

 return 0; }

  int lookAll(PList plist)//查看 {

 int i=1;

 PList t = plist->next;

 if (plist->next==NULL)

 {

  printf("为空!\n");

  return 0;

 }

 else

 {

  while(t->next!=NULL)

  {

 //int

 printf("%d.%s

 %s\n",i++,t->name,t->number);

 t = t->next;

  }

  printf("%d.%s

 %s\n",i,t->name,t->number);

 }

 return 0; }

  int findData(PList plist,char *name)//查找和输出 {

 int count=0;

 PList t = plist;

 printf("查找结果如下:\n");

 while (t!=NULL)

 {

  if (strcmp(t->name,name)==0)

  {

 printf("%s %s\n",t->name,t->number);

 t = t->next;

 count++;

  }

 else

 t = t->next;

 }

 if (count != 0)

 {

  printf("共%d位联系人\n",count);

  return 0;

 }

 else

  printf("未找到(%s)信息!\n",name);

 return -1; }

 int main()

 {

 PList p = createNullList();

 Data t;

 char ch=1;

 while (ch != '0')

 {

  printf("\t

  通讯录\t\n");

  printf("\n");

  printf("\t1.查看所有联系人\n");

  printf("\t2.新建\n");

  printf("\t3.删除\n");

  printf("\t4.查找\n");

  printf("\n ");

  ch = getchar();

 switch(ch)

  {

 case '1':

  lookAll(p);

  break;

 case '2':

  printf("name: ");

  scanf("%s",&t.name);

  printf("number: ");

  scanf("%s",&t.number);

  addNewPre(p,t);

  break;

 case '3':

  printf("name: ");

  scanf("%s",&t.name);

  delPosX(p,t.name);

  break;

 case '4':

  printf("name: ");

  scanf("%s",&t.name);

  findData(p,t.name);

  break;

 default:break;

  }

  getchar();

 if (ch=='0')

 break;

  else

 system("pause");

  }

 return 0; } 总体格式要求:标题要求宋体三号,加粗,两倍行距,段前0.5行,段后0.5行。正文要求宋体小四,1.5倍行距,段前0.5行。流程图要求居中。实验结果图要求居中,并有图例,如“图1-1 实验结果图”,图例要求位于实验结果图正下方。程序代码要求宋体,五号,1.5倍行距,段前段后均为0行。代码要有必要的代码解释。

 

推荐访问:高级 实验 语言程序设计
上一篇:【征文:六十载春秋风雨共渡,转型发展共谱新辉煌】共度风雨
下一篇:【镇道路交通煤矿非煤矿山危险化学品安全四项攻坚行动实施方案】 煤矿职工的四项权利

Copyright @ 2013 - 2018 优秀啊教育网 All Rights Reserved

优秀啊教育网 版权所有