软件技术基础实验报告

实  验  报  告

实验课程:       软件技术基础         

学生姓名:                     

    号:                  

专业班级:                 

         

20##年    6月    8日


  南昌大学实验报告

学生姓名:                   学    号:                   专业班级:                  

实验类型:□ 验证 □ 综合 □ 设计 □ 创新   实验日期:            实验成绩:           

实验一:建立学生选课系统数据库 

一、实验项目名称

数据库管理系统综合应用-------学生选课系统数据库 

二、实验目的

通过完成从学生选课过程的分析、数据库设计到上机编程、调试和应用等全过程,进一步了解和掌握数据库这一章所讲解的内容。掌握使用T_SQL语句和企业管理器对数据表进行插入、修改和删除数据的操作,并体会数据完整性约束的作用,加深对数据完整性及其约束的理解。数据查询是数据库中最基本的操作,也是使用最频繁的操作,因此必须掌握SQL的查询语句(SELECT语句)的使用方法。进一步掌握SELECT语句的使用方法,通过实验能够熟练地使用SELECT语句。通过本实验,要熟练掌握INSERT、UPDATE、DELETE语句的语法和使用方法。掌握简单表的数据查询、数据排序和多表操作时数据连接查询的操作方法。掌握嵌套查询和统计查询的操作方法。

三、实验设备

1、安装SQL Server的服务器系统

2、安装了SQL Server客户端的计算机系统

3、由服务器与客户端的计算机系统所构成的计算机网络

3.实验前的准备

4.实验步骤

本实验中所用到的学生-课程数据库表如下:

Student

Course

SC

试验的具体程序:

CREATE TABLE student    (sno char(10) NOT NULL,

                         sname varchar(10) NOT NULL,

                         sex char(2),

                         age  int,

                         sdept varchar(20) NOT NULL,

                         primary key (sno))

INSERT INTO student VALUES (5802312010,'李仕浩',   '男',20,'环化学院')

INSERT INTO student VALUES (5801412024,'刘小平',   '男',19,'环化学院')

INSERT INTO student VALUES (5801202145,'涂玉林',   '男',18,'环化学院')

INSERT INTO student VALUES (5602412036,'吴云展',   '男',19,'生食学院')

INSERT INTO student VALUES (5901112123,'徐俊武',   '男',20,'机电学院')

CREATE TABLE course    (cno char(5) NOT NULL,

                         cname varchar(10) NOT NULL,

                         cpno float NOT NULL,

                         ctime int,

                         primary key (cno))

INSERT INTO course VALUES(59011,'机械制造',3,48)

INSERT INTO course VALUES(59012,'机械设计',2.5,40)

INSERT INTO course VALUES(59013,'机电一体化',2,32)

INSERT INTO course VALUES(59014,'材料成型',3.5,56)

INSERT INTO course VALUES(59015,'工程制图',3,48)

CREATE TABLE sc     (sno char(10),

                     sname varchar(10),

                     cno char(5),

                     cname varchar(10),  

                     foreign key (sno)references student(sno) ,

                     foreign key (cno)references course(cno) ,

                     grade tinyint check (grade between 0 and 100) )

INSERT INTO sc VALUES(5802312010,'李仕浩',59011   ,'机械制造',90)

INSERT INTO sc VALUES(5801412024,'刘小平',59012   ,'机械设计',88)_

INSERT INTO sc VALUES(5801202145,'涂玉林',59013,'机电一体化',79)

INSERT INTO sc VALUES(5602412036,'吴云展',59012   '机械设计',93)

INSERT INTO sc VALUES(5901112123,'徐俊武',59015   ,'工程制图',80)

1.查询全体学生的学号,姓名和所在系的有关信息

select sno,sname,sdept from student

2.查询全体学生的所有信息。

select * from student

3.查询年龄为20的学生的学号,姓名

select sno,sname from student where age=20

4.在SC表中查询所有选了课程的学生的学号,并消除重复的学号。

select distinct sno from sc

5.查询机电学院的所有学生的学号和姓名。

select sno,sname

from student

where sdept='机电学院'

6.查询年龄在19-20岁之间的学生的姓名,所在系和年龄。

SELECT sname,sdept,age

FROM student

WHERE age BETWEEN 19 AND 20

7.查询成绩低于85分的学生                        

select sno,sname,cname,grade  from sc where grade<85

8.查询环化学院所有学生的情况。

SELECT *

FROM student

WHERE sdept ='环化学院'

9.查询选修了59011号课程的学生的学号及成绩,查询结果按成绩的降序排序。

SELECT sno,sname,grade

FROM sc

WHERE cno=59011

ORDER BY Grade DESC

10.查询选修了机械制造课程且成绩在90分以上的学生的学号和姓名及年龄。

SELECT student.sno,student.sname,student.age

FROM student,course,sc

WHERE student.sno=sc.sno AND sc.cno=course.cno

        AND sc.cname='机械制造' AND Grade=90;

11.查询其他系中比环化学院的学生李仕浩年龄小的学生的姓名和年龄。

SELECT sname,age

FROM student

WHERE sdept='环化学院'

           AND age < ANY (SELECT age

FROM Student

WHERE Sdept='环化学院');

12.查询每个学生及其选修课的情况

SELECT student.*, SC.*

FROM Student, sc

WHERE Student.Sno=SC.Sno;

13.将course表中机械设计的课时调整为52课时

update course set ctime=52 where cname='机械制造'

14.向course中插入一条新的课程。

INSERT INTO course VALUES(59016,'软件技术',3,48)

15.将刚插入的课程进行删除

delete from course where cno=59016 6.实验结果

在本次实验当中,首先在上次实验中创建的数据库JWGL的三个表Student、Course、SC中添加所需的数据,然后使用INSERT、UPDATE、DELETE语句对其进行了插入、修改和删除的操作,最后依据实验要求使用SELECT语句分别进行了简单查询、连接查询和复杂查询的操作

十、参考资料

 

1、周肆清,曹岳辉,李利明. 软件技术基础教程,清华大学出版社  2002。

  南昌大学实验报告

学生姓名:                   学    号:                   专业班级:                 

实验类型:□ 验证 □ 综合 □ 设计 □ 创新   实验日期:            实验成绩:           

实验二  单向链表插入与删除的程序编制

一、实验项目名称

单向链表插入与删除的程序编制

二、实验目的

1.掌握数据结构中的一些基本概念。数据、数据项、数据元素、数据类型和数据结构,以及它们之间的关系。

2、了解数据的逻辑结构和数据的存储结构之间的区别与联系;数据的运算与数据的逻辑结构的关系。

3、掌握线性表的基本操作:插入、删除、查找以及线性表的合并等运算。

掌握运用C语言上机调试线性表的基本方法。

三、实验基本原理

1、前插原理

 

四、编程平台(包括开发工具)

1、计算机系统

2、安装Turbo C或其他C语言集成开发工具

五、算法

插入算法如下:

void insert(lklist L, int x, int i)

{  p = head;

   q=malloc(sizeof());

   q->data=x;

   if(i<0)

      error(“无此位置”)

j=0;

if(i= 1)

{  q->next=head;

      head=q;

}

while(j<i-1)&&(p->next !=NULL)

j++;

if(i= = i-1)

{ q->next=p->next;

  p->next=q;

}

else error(“i位置超出范围”);

}

删除算法如下:

void delete(lklist L, int i)

{ p=head;

if(i<0) error(“无此位置”)

j=0;

if(i=1)

  {q=head; head=head->next; free(q);

}

while(j<i-1) && (p->next != NULL)

 j++;

if(j= = i-1)

  {  q=p->next;

     p->next=q->next;

   free(q);

}

else error(“i位置超出范围”);

}

六、源程序

#define NULL 0

typedef int datatype;

#define maxsize 1024

typedef struct

{  datatype data[maxsize];

/* 定义线性表是顺序存储结构,第一个结点是data[0] */

 int last;

}sequenlist;

/* 插入函数*/

int insert(L, x, i)     /* 将新结点x插入到顺序表L第i个位置 */

sequenlist *L;       /* L是sequenlist类型的指针变量 */

int i;

{  int j;

if((*L).last= = maxsize-1)

{ printf(“overflow”);

 return NULL;  

}

else

if((i<1)||(i>(*L).last+1))

{ printf(“error”);

    return NULL;

}            /* 非法位置 */

else

{ for (j=(*L).last;j>i-1;j--)

(*L).data[j+1]= (*L).data[j];  /* 结点后移 */

(*L).data[i-1]=x;           /* 插入x */

(*L).last=(*L).last+1;       /* 表长加1 */

}

return(1);

}

七、参考资料

1、《C语言程序设计》 谭浩强 清华大学出版社

 

第二篇:软件技术基础上机实验报告(链表)

ex2:链表的插入与删除

1)首先创建一个单链表:从键盘读入五个整数,按输入顺序形成单链表。将创建好的链表元素依次输出到屏幕上。

2)在已创建好的链表中插入一个元素:从键盘读入元素值和插入位置,调用插入函数完成插入操作。然后将链表元素依次输出到屏幕上。

3)在已创建好的链表中删除一个元素:从键盘读入欲删除的元素位置(序号),调用删除函数完成删除操作。然后将链表元素依次输出到屏幕上。

  4)从键盘任意输入一个整数,在单链表中查询该数,如果单链表中已经存在这个数,就调用删除函数,删除该元素所在结点,并将单链表在删除前后的数据元素依次输出到屏幕上;如果单链表中不存在这个数,就调用插入函数,将这个数插入到单链表尾,并将单链表在插入前后的数据元素依次输出到屏幕上

软件技术基础上机实验报告

姓名:肖燕平                                   学号:2011019090028

上机实验 二

Ex2_1(链表的创建和插入删除)

#include<stdio.h>

#include <malloc.h>

typedef struct node_type      //定义链点

{

         int data;

         struct node_type *next;

}node_type;

typedef struct list_type      //定义链表

{

         node_type *head;

         node_type *tail;

         int length;

} list_type;

int read()

{

         int x;

         scanf("%d",&x);

         return x;

}

void error(int x)

{

         switch(x)

         {

                  case 1:

                                    printf("\nthe place of the data is wrong ,please input the place again\n");

                                    break;

         }

}

void creat_list(list_type *lianbiao)                    //创建链表

{

         node_type *p,*s;                                //注意此处的指针要为链点结构体类型

         int x;

        

         lianbiao->head=(node_type*)malloc(sizeof(node_type));

        

         lianbiao->length=0;

         p=lianbiao->head;

        

         while(lianbiao->length<5)                          //输入五个数

         {

                  scanf("%d",&x);

                  s=(node_type*)malloc(sizeof(node_type));

                  s->data=x;       

                  p->next=s;

                  p=s;                            //在链点连接上出现了问题导致后面显示链表时也出问题

                  lianbiao->length++;

        

                 

         }

         p->next=NULL;

         lianbiao->tail=p;

        

        

        

}

void show_list(list_type *lianbiao)                             //把链表元素打印出来

{

         node_type *p;

         p=lianbiao->head->next;

         printf("\nThe linked list is\n\n");

         while(p!=NULL)

         {

                  printf("%d   ",p->data);

                  p=p->next;                                            //p往下走一步

         }       

         printf("\nThe length of this linked list is  %d\n",lianbiao->length);

        

}

void insert_list(list_type *lianbiao,int newdata,int place)

{

         node_type *newnode,*p;

         int i=0;

         newnode=(node_type*)malloc(sizeof(node_type));

        

         newnode->data=newdata;

         p=lianbiao->head;

          

         while(lianbiao->length+1<place||place<1)//判断插入的位置是否正确

         {

                  error(1);

                  place=read();                     //位置错误则重新输入位置

         }

         while(i<place-1)                 //使p指针指向插入位置的前一个

         {

                  p=p->next;

                  i++;

         }

         newnode->next=p->next;                  //插入链点

         p->next=newnode;

         if(newnode->next==NULL)

         {

                  lianbiao->tail=newnode;          //若插入的位置为表尾,则改变尾指针

         }

         lianbiao->length++;

        

}

void delete_list(list_type *lianbiao,int place)

{

         int i=0;

         node_type *p,*g;

         p=lianbiao->head;

        

         while(place>lianbiao->length||place<1) //检查删除元素的位置是否符合要求

         {

                  error(1);

                  place=read();

         }

         while(i<place-1)                 //使p指针指向删除位置的前一个

         {

                  p=p->next;

                  i++;

         }

         g=p->next;

         p->next=p->next->next;           //删除链点

         free(g);

         if(p->next==NULL)                     //若删除的是最后一个元素,则改变尾指针的指向

         {

                  lianbiao->tail=p;

         }

         lianbiao->length--;                     //链表长度自减一

}

void search_list(list_type *lianbiao,int number )//寻找那个整数

{

         node_type *p;

         int i=0;

         int m;

         m=lianbiao->length;                           //记录原来链表的长度

         p=lianbiao->head;

        

         while(p->next!=NULL)      //p如果指向最后一个元素,则跳出循环

         {

                  while(p->next->data==number)

                  {

                           delete_list(lianbiao,i+1);//p的下一个元素如果是这个数,那么删除

                           if(p->next==NULL)//若p已经指向最后一个那么跳出删除的循环

                           {

                                    break;

                           }

                  }

                  if(p->next!=NULL)    //若p没有指向最后一个那么让p指向下一个

                  {

                           p=p->next;

                           i++;

                  }

         }

        

         if(i==m)             //若链表中元素没有与指定数相同的,则将数插入链表

         {

                  insert_list(lianbiao,number,m+1);

         }

}

void main()

{

         list_type lianbiao;

          int newdata,place;

          int del_place;

          int number;

          

         printf("please input the the list\n");

         creat_list(&lianbiao);                         //创建链表 ,把链表这一包含头和尾的指针传过去

         show_list(&lianbiao);                         //而没有像书上一样传链点

         printf("\nplease input the new data\n");

         newdata=read();

         printf("please input the place of the new data where it should be\n");

         place=read();

         insert_list(&lianbiao,newdata,place);

         show_list(&lianbiao);

         printf("\nplease input the place of the number which will be deleted\n");

         del_place=read();

         delete_list(&lianbiao,del_place);

         show_list(&lianbiao);

         printf("\nplease input the number that you want to search\n");

         number=read();

         search_list(&lianbiao,number);

         show_list(&lianbiao);

        

                          

}

输出数据如图所示

录入五个数

插入一个数

删除一个数

查找一个数,如果链表中有数与之相同,则删除这些数

问题及解决方法

问题1:创建链表时定义的指向结构体的指针没有定义为结构体类型

解决方法:将原先定义的int型改为结构体的类型

注意:指向结构体的指针要定义为结构体类型

问题2:未给链点动态分配空间

注意:定义一个结构体变量只分配一个结构体空间,而不是整个链表的空间都分配了,链表中每个链点的空间要动态申请

解决方法:没用一个链点前动态分配一个空间

问题3:定义了一个链表结构类型的的变量,但未定义或动态分配空间给该变量内部head指针所指向的结构体便直接访问该结构体,导致错误。

解决方法:再另动态分配空间给该指针变量所指向的结构体

注意:结构体定义时并未分配空间,系统给某指针分配了空间不代表给他的指向变量也分配了空间。

问题4:创建链表时各链点未衔接。

解决方法:再增加一个指针握住原链表。

注意:在使用动态分配空间增加链点时要使用两个指针,其中一个作为动态空间的指向,另一个握住原已经形成的链表。

并且,要注意分析链表时从中间开始去考虑

问题4:用scanf时输入不进数

遗漏了“&”!!!!

解决方法:加上。

注意:scanf如果多输了数,它会把值赋给下面的scanf,并且中间程序照跑;

总结:

编程前要先想好思路,列出流程,写出核心的算法。

对于链表类的程序,要先想模型,并且先从链表中间开始想思路,再想边界的问题。

注意删除链点后动态空间要释放。

程序太完美啦!!!

相关推荐