【www.guakaob.com--报告】
计算机软件基础实践心得体会篇一
《计算机软件基础实验报告》
北京联合大学
实验报告
课程(项目)名称: 顺序表的实现和应用
学 院: 专 业:
班 级: 学 号:
姓 名: 成 绩:
2011年 月 日
一、任务与目的
1.实验目的
(1)掌握顺序表的概念。
(2)熟练掌握线性表的顺序存储结构。
(3)熟练掌握线性表在顺序存储结构上的运算。
(4)了解测试的思想。
2.实验内容
(1)编写程序实现顺序表的基本操作。这些操作包括:
a)初始化顺序表操作,SList InitSList();
b)创建原始表操作,void CreateSList(SeqList &L);该操作要求输入一批原始数据,建立初始的线性表。如,输入 1 3 5 7 9 -1(回车),-1表示输入结束。则生成如下的顺序表。
c)和顺序表的长度。
d)求顺序表长度操作,int GetLength(SeqList &L);
e)获得顺序表第i个元素的操作,DataType GetData(SeqList &L, int i);
f)在位置i处添加元素操作,int InsertSList(SeqList &L, int i, DataType x); g)删除操作位置i处元素操作,int DeleteSList (SeqList &L, int i)
说明:关键字 typedef :是C语言中用来声明自定义数据类型,配合各种原有数据类型来达到简化编程的目的的类型定义关键字。
如: typedef 自定义基本数据类型的语句,
typedef int datatype ; /*该语句表示将int 类型自定义为datatype类型*/
int a ; datatype a; /*两个语句等价*/
如: typedef 自定义结构体类型的语句,
typedef struct SList
{
DataType data[MAXSIZE];
int last;
}SeqList;
struct SList L; 和 SeqList L; 两语句完全等价。方便了结构体类型的使用。 书上的例子将大多数使用了typedef,请大家理解其用法。
文件后面给出框架代码,供参考。
(2)利用顺序表的基本操作完成下面功能
a)己知顺序表中的元素非递减有序排列,编写算法删除顺序表中值相同的多余的元素。例如:删除前顺序表为:1 3 3 5 6 7 7 8 9 9
删除后顺序表为:1 3 5 6 7 8 9
b)编写算法,在非递减有序的顺序表中,插入一个给定的元素,插入后该顺序表仍然递增有序。
有序表中的数据为:12,16,24,33,45,66,68,89
需要进行测试的插入数据分别是:9,13,25,33,88,91
二、条件
Visual C++6.0
三、内容与步骤
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 100
#define DataType int
typedef struct
{
DataType data[max];
int last;
}SeqList;
SeqList InitSList()
{
}
SeqList Input(SeqList L)
{
}
SeqList L; L.last=-1; return L; L.last=-1; int a=0; printf("\n请输入第%d个数据(输入-1结束输入):",L.last+2); scanf("%d",&a); while(a!=-1) { L.data[L.last+1]=a; printf("第%d个数据为:%d\n",L.last+2,L.data[L.last+1]); L.last++; printf("\n请输入第%d个数据(输入-1结束输入):",L.last+2); scanf("%d",&a); } return L;
void Display(SeqList L)
{
int i; char c; for(i=0;i<L.last+1;i++) { printf("第%d个数据:\t",i+1); printf("%d\n",L.data[i]); } printf("\n按任意键返回上层"); scanf("%c",&c); scanf("%c",&c);
}
int GetLenght(SeqList L)
{
}
int GetData(SeqList L)
{
char c; printf("当前顺序表长度为:"); printf("%d\n\n",L.last+1); printf("\n按任意键返回上层"); scanf("%c",&c); scanf("%c",&c); return L.last+1; int a; char b; printf("要获取第几个元素?(输入-1返回上层)"); scanf("%d",&a); while(a!=-1) { if(a<1||a>L.last+1) { } else printf("输入错误!请从新输入(输入-1返回上层):"); scanf("%d",&a);
} } } printf("元素获取成功!\n\n"); printf("输入任意键返回上层"); scanf("%c",&b); scanf("%c",&b); return L.data[a-1];
SeqList Delete(SeqList L)
{
int a,i; char b,p; for(i=0;i<L.last+1;i++) { } printf("第%d个数据:\t",i+1); printf("%d\n",L.data[i]); printf("要删除第几个元素?(输入-1返回上层)"); scanf("%d",&a); while(a!=-1) { if(a<1||a>L.last+1) { } else { printf("是否删除第%d个元素%d? Y/N\n\n",a,L.data[a-1]); scanf("%c",&p); scanf("%c",&p); while(p!='Y'&&p!='y'&&p!='N'&&p!='n') {
个元素%d? printf("输入错误!请从新输入:"); scanf("%d",&a); printf("输入错误!是否删除第%d
Y/N\n\n",a,L.data[a-1]);
scanf("%c",&p); scanf("%c",&p);
}
计算机软件基础实践心得体会篇二
《计算机软件技术基础实验报告》
计算机软件技术基础
实验报告
姓名: 班级:0801105 学号:
日期:2012-12-5
班 级 0801105 学 号 姓 名
第 5 周 星 期 三 、 9-10 节 成 绩
一、实验目的:
参照给定的线性表顺序表类和链表类的程序样例,验证给出的线性表的常见算法。 二、实验要求:
1、掌握线性表顺序表类和链表类的特点。掌握线性表的常见算法。
2、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。 三、实验内容:
设计一个静态数组存储结构的顺序表类,要求编程实现如下任务:
1)建立一个线性表,首先依次输人整数数据元素(个数根据自己的需要键盘给定) 2)删除指定位置的数据元素(指定元素位置通过键盘输入)再依次显示删除后的线性表中的数据元素。
3)查找指定数据的数据元素(指定数据的大小通过键盘输入),若找到则显示位置,若没有找到就显示0。
四、要求
1)采用顺序表实现,假设该顺序表的数据元素个数在最坏情况下不会超过50个。 2)写出完整的程序并能调试通过即可 五、实验源程序#include <iostream> using namespace std; #define ListSize 50 typedef int DataType; typedef struct {
DataType data[ListSize]; int length; }SeqList; void main() {
SeqList L; int position; int x; L.length=0;
void CreateList(SeqList *L);
void DeleteList(SeqList *L,int position); void PrintList(SeqList L); int Getdata(SeqList L, int x);
CreateList(&L);
cout<<" 请输入要删除的元素位置:"; cin>>position;
DeleteList(&L,position); PrintList(L);
cout<<" 输入要查找的值:"; cin>>x;
cout<< " 删除后所查询值的位置在新数列的第" }
void CreateList(SeqList *L) {
int i,n;
cout<<" 请输入元素个数:"; cin>>n;
cout<<" 请依次输入"<<n<<"个数:"; for (i=1; i<=n; i++) cin>>L->data[i];
<<Getdata(L,x)<<"个"<<endl;
L->length=n; }
void DeleteList(SeqList *L,int position) { int i;
if ((position<1) || (position>L->length))
{ } {
cout<<" 删除位置不对!"; else
for (i=position; i<L->length; i++) L->data[i]=L->data[i+1]; L->length--; }
void PrintList(SeqList L) {
六、实验结果
}
int i; cout<<" ";
for (i=1; i<=L.length; i++) cout<<L.data[i]<<" "; cout<<endl; }
int Getdata(SeqList L, int x) { int i; i=L.length; L.data[0]=x; while (L.data[i]!=x) i--; if(i<=L.length)
return i; return 0; else
班 级 0801105 学 号 20 姓 名
第 6 周 星 期 四 、 7-8 节 成 绩
一、实验目的:
参照给定的栈类的程序样例,验证给出的栈的常见算法。 二、实验要求:
1、掌握栈的特点。掌握特殊线性表的常见算法。
2、提交实验报告,报告内容包括:目的、要求、算法描述、程序结构、主要变量说明、程序清单、调试情况、设计技巧、心得体会。 三、实验内容:
堆栈类测试和应用问题。要求:
(1)设计一个主函数实现对顺序堆栈类和链式堆栈类代码进行测试。测试方法为:依
次把数据元素1,2,3,4,5入栈,然后出栈堆栈中的数据元素并在屏幕上显示。
(2)定义数据元素的数据类型为如下形式的结构体:
typedef struct
{ char taskname[10];//任务名 int taskno; //任务号
}DataType;
设计一个包含5个数据元素的测试数据,并设计一个主函数实现依次把5
个数据元素入栈,然后出栈堆栈中的数据元素并在屏幕上显示。
四、要求
1)栈的长度都由自己定;
2)写出完整的程序并能调试通过即可。
3)重点理解栈的算法思想,能够根据实际情况选择合适的存储结构。 五、实验源程序 #include<string.h> #include<stdio.h> #include<malloc.h> #define maxsize 100 typedef struct {
int s[maxsize]; int top; }stack;
stack * Initstack(); void dispstack(stack *st); void push(stack * st,int x); int ptop(stack *st);
void top(stack *st,int *x); void pop(stack *st); void main() { stack *st;
int x,i,n;
printf("请输入要入栈的数据个数n="); printf("请输入要入栈的数据:\n"); for(i=0;i<n;i++) {
push(st,x);
st=Initstack(); scanf("%d",&n);
scanf("%d",&x);
}
}
printf("入栈成功后栈中内容如下:\n"); dispstack(st);
printf("出栈的数据顺序排列为:"); { }
printf("\n");
printf("%4d",ptop(st));
}
}
st->s[st->top]=x;
int ptop(stack *st) { }
stack * Initstack() {
stack *p;
p=(stack *)malloc(sizeof(stack)); p->top=-1; return(p); }
void pop(stack *st) { }
void top(stack *st,int *x) {
if(st->top==-1) else
*x=st->s[st->top]; if(st->top==-1) else
st->top--;
printf("栈上溢出!\n"); int x; top(st,&x); pop(st); return x;
for(i=0;i<n;i++)
void dispstack(stack *st) { }
void push(stack * st,int x) {
if(st->top==maxsize-1) else {
st->top++;
printf("栈上溢出!\n"); stack *r; r=st;
while(r->top>=0) { }
printf("%d\n",r->s[r->top]); r->top--;
int len; len=r->top;
r->top=len;
printf("
无栈顶元素!\n");
}
六、实验结果
计算机软件基础实践心得体会篇三
《计算机软件基础实验报告大综合(上)》
计算机软件实验报告一 顺序表的基本操作
班级:学号:姓名:_________ 2012153_________ __
一、实验目的:
1、熟悉编程环境
2、实现线性表的顺序存储; 3、实现线性表的插入、打印操作
二、实验要求:
1、编写函数,实现顺序表的插入操作 2、编写函数,实现顺序表的打印操作 3、编写测试以上函数的测试程序:
(1)建立一个至少包含10个随机整数元素的顺序表; (2)在该表中第7个位置上插入整数5;
(3)输出插入前后的顺序表的元素:每输出5个元素换行
三、实验程序及分析
#include <stdio.h>
#define maxlen 100 100
typedef int datatype; struct sqlisttp {datatype elem[maxlen]; int last; };
typedef struct sqlisttp SEQLIST;
void insert(SEQLIST v,int i,datatype x); void print(SEQLIST v);
void insert(SEQLIST v,int i,datatype x) {int k; if(i<1||i>v.last+1) printf("位置不合法!\n"); else if(v.last>=maxlen-1) printf("数据空间已满!\n"); else {for(k=v.last;k>=i;k--) v.elem[k+1]=v.elem[k]; v.elem[i]=x; v.last++; }
//头文件声明
//定义线性表可能最大长度,这里假设//定义类型
//函数声明 //函数声明
//定义插入函数(insert函数)
//插入位置的合法性判断
print(v); }
void print(SEQLIST v) //定义输出顺序表函数(print函数) {int i; for(i=1;i<=v.last;i++) {printf("%6d",v.elem[i]); if(i%5==0) printf("\n"); //控制换行,这里控制每五个换一次行 } printf("\n"); }
main() {int i;
SEQLIST v; v.last=0;
printf("***请输入10个数据(以空格间隔,回车结束输入)***:\n"); for(i=1;i<=10;i++) {scanf("%d",&v.elem[i]); //键盘输入十个任意整数 v.last++; }
{int n;
printf("原始数据:\n"); //输出从键盘输入的原始数据 for(n=1;n<=v.last;n++) {printf("%6d",v.elem[n]); if(n%5==0) printf("\n"); //控制换行 }
printf("\n"); }
printf("插入后的新数据:\n"); insert(v,7,5); //调用上面定义好的插入函数在第7个位
置上插入整数5
getch(); }
计算机软件基础实践心得体会篇四
《计算机软件基础实践报告》
计算机软件实践报告
题 目 处理机调度
专 业 电子工程
班 级 电子1班
学生姓名 钟涛 指导教师 冯建群
二0一四 年 十 月
实验名称:处理机调度
一 实验内容
选择一个调度算法,实现处理机调度。
二 实验目的
多道系统中,当就绪进程数大于处理机数时,须按照某种策略决定哪些进程优先占用处理机。本实验模拟实现处理机调度,以加深了解处理机调度的工作。
三 实验题目
设计一个按优先权调度和时间片轮转算法实现处理机调度的程序。
四 基本思想
先选择时间片的个数和每个时间片需要的时间,正在运行的进程每运行一秒其优先权数目加一,即其优先权减小。每个时间片运行结束后,选择进入时间片进程优先权数目最小的进程,开始下一个时间片的运行。如果有进程运行结束,则离开,再在就绪队列中选择优先权数目最小的进程进入。在运行期间,如果有新的进程来到,按优先权大小放入就绪队列中。
五 算法分析
定义一个结构体,此包含了PCB的信息:
struct PCB
{
char PID[5]; /*进程名*/
int needtime; /*要求运行的时间*/
int cputime; /*已运行时间*/
int priority; /*优先权(越小越高)*/
int starttime; /*进入就绪队列的时间*/
int overtime; /*运行完成的时间*/
int state; /*状态:1就绪2运行3完成*/
struct PCB *next;
};
子函数struct PCB *create(int num,int n)用来建立一个按优先级大小排列的就绪进程链表和一个按时间先后循序排列的将进入就绪进程的链表。
main()函数中用一while循环输出进入时间片的进程状态。
六 流程图
七 算法描述
#define NULL 0
#define LEN sizeof(struct PCB)
#include"stdio.h"
#include"stdlib.h"
struct PCB
{
char PID[5]; /*进程名*/
int needtime; /*要求运行的时间*/
int cputime; /*已运行时间*/
int priority; /*优先权(越小越高)*/
int starttime; /*进入就绪队列的时间*/
int overtime; /*运行完成的时间*/
int state; /*状态:1就绪2运行3完成*/
struct PCB *next;
};
struct PCB *create(int num,int n)
/*创建进程,并将进程按优先级顺序插入队列中*/
{
struct PCB *head,*p,*p1,*p2;
int i;
head=NULL; /*头指针指零*/
for(i=1;i<=num;i++) /*循环建立所有进程*/
{
printf("请输入第%d个进程的信息\n",i);
p=(struct PCB *)malloc(LEN); /*开辟一个空间*/
printf("进程名:"); /*输入进程名*/
scanf("%s",p->PID);
printf("要求运行的时间:"); /*输入要运行的时间*/
scanf("%d",&p->needtime);
p->cputime=0; /*占用处理机的时间赋为零*/
printf("优先权:"); /*输入优先权*/
scanf("%d",&p->priority);
if(n==1)
p->starttime=0; /*进入就绪队列的时间赋为零*/ else
{
printf("进入就绪队列时间:"); /*输入进入就绪队列的时间*/ scanf("%d",&p->starttime);
}
p->overtime=-1; /*运行没有结束所以运行完成的时间赋为-1*/
p->state=1; /*状态赋为就绪状态*/
p1=head; /*p1指针指向头指针*/
if(head==NULL) /*如果头指针为零将头指针指向新建立的进程*/ {head=p;head->next=NULL;}
else /*头指针不为零的情况*/
{
if(n==1)
while(p1!=NULL&&p->priority>p1->priority) /*查找插入点*/
{p2=p1;
p1=p1->next;
}
else
while(p1!=NULL&&p->starttime>p1->starttime) /*查找插入点*/
{p2=p1;
p1=p1->next;
}
if(head==p1) /*优先权的值最小作为表头*/
{p->next=head;p2=head=p;}
else /*否则的话插入*/
{p2->next=p;p->next=p1;}
}
}
return(head);
}
void main()
{
char now[5];
int cho,num,num1,timepiece,time,i,j,k,flag,choo,clock=0;
struct PCB *head,*head1,*over,*later,*l,*l1,*l2,*p,*p0,*p1,*p2,*q,*q1,*q2,*q3; over=NULL;
printf("初始化进程...\n");
printf("输入总的就绪进程数:");
scanf("%d",&num);
head=create(num,1); /*建立就绪进程的链表*/
printf("输入将会就绪的进程数:");
scanf("%d",&num1); /*建立将会进入就绪进程的链表*/
later=create(num1,2);
printf("cpu是否开始运行:1是 2不是--");
scanf("%d",&cho);
if(cho==1) /*处理机开始进行调度*/
{
printf("现在的时间是:");
scanf("%s",now);
计算机软件基础实践心得体会篇五
《计算机软件基础二实践报告》
计算机软件基础二实践报告
共计五个实践报告,请同学们认真抄好,在12月25号之前由班长收集起交到我办公室(J021004),并附班级自考实践电子名单。
实践报告一:
实践报告二
实践报告三
计算机软件基础实践心得体会篇六
《计算机软件基础实验报告》
计算机软件基础实验报告
学院:
班级:
学号:
姓名:
已知一个一维数组
Date{3,8,1,5,7,10}
(1) 求X=5这个数位于数组的第几个位置? 解:#include<stdio.h>
int main()
{
int i,m=0;
int a[6]={3,8,1,5,7,10};
printf("原数列为:");
for(i=0;i<6;i++)
printf("%d ",a[i]);
for(i=0;i<6;i++)
if(a[i]==5)
m=i;
printf("\n");
printf("x=5的位置为%d",m+1);
printf("\n");
return 0;
}
(2) 用冒泡法将原数组从小到大排列。 解:int main()
{
int i,j,b,p=1,n;
int a[6]={3,8,1,5,7,10};
for(i=1;i<6;i++)
for(j=0;j<6-i;j++)
{
if(a[j]>a[j+1])
{
n=a[j];
a[j]=a[j+1];
a[j+1]=n;
}
printf("第%d次排序为:",p++);
for(b=0;b<6;b++){ printf("%d",a[b]); }
printf("\n");
}
printf("排序过的数列为:"); for(i=0;i<6;i++)
printf("%d ",a[i]); printf("\n");
return 0;
}
计算机软件基础实践心得体会篇七
《计算机软件基础实验报告》
石 家 庄 铁 道 大 学
实 验 报 告
课程名称 计算机软件基础 建筑与艺术 学院(系) 1102-1 班
试验者姓名 学号 实验日期 年月日
评分 教师签名
1
2
3
4
5
计算机软件基础实践心得体会篇八
《计算机软件基础实验报告》
《计算机软件基础》
实验报告
姓名:
学号: 班级: 专业: 学院:
2013年12月
实验一 线性表的插入和删除
一、实验目的
1. 熟悉C++上机环境;
2. 掌握线性表的基本操作:查找、插入、删除等运算在链接存储结构上的运算。
二、实验内容
【任务一】 阅读理解
阅读后面的程序,并将其输入到计算机中,调试成功,运算出结果。这个程序中我们创建了一个整数类型的升序单,演示了单链表的创建、输出和删除操作。
【任务二】 完善功能
构造函数node *insert (node *head,int num),实现把一个节点插入链表,仍保持链表上各节点的升序关系,并在主函数中完成对你所添加函数的测试。
三、算法描述
建立含有若干个元素的升序单链表,对其进行插入、删除等操作,并将结果在屏幕上输出。 // 实验一线性表
#include "stdafx.h"
const int SIZE0=2;
const int STEP=1;
struct List{
int *A,len,size; List(){ A=(int *)malloc(SIZE0*sizeof(int)); if(!A)exit(1); len=0; size=SIZE0; } ~List(){ delete[size]A; } int GetLen(); void Output(); int Insert(int loc,int x); int Delete(int loc,int &y); int Geti(int loc,int &y); List(int *p,int n); void StraightInsertSort(); void BinaryInsertSort(); void BubbleSort(); int Patation(int low,int up); void QuickSort(int low,int high); void SelectSort(); void Shift_down(int heapsize,int index); void DeleteNodeofHeap(int heapsize,int index); void createHeap(); - 1 -
void HeapSort(); void ShellInsert(int dk); void ShellSort(int *delta,int t);
};
List::List(int *p,int n)
{
A=new int[n];
for(int i=0;i<n;i++)A[i]=p[i];
len=size=n;
};
//简单选择排序
void List::SelectSort()
{
}
//将当前A[0]~A[heapsize-1]构成的完全二叉树中下标为index的结点A[index] //在其子树T中进行下移,使T成为大头堆 O(log2(heapsize))
void List::Shift_down(int heapsize,int index)//大头堆
{
int max,temp,i=index,j=2*i+1;
while(j<heapsize)
{
} } max=j; if(j+1<heapsize && A[j+1]>A[j]) max=j+1; //左右子树均存在 if(A[i]<A[max]) { temp=A[i];A[i]=A[max];A[max]=temp; i=max;j=2*i+1; int i,j,temp,max; for(i=len-1;i>0;i--) { max=0; for(j=1;j<=i;j++) } if(A[j]>A[max])max=j; temp=A[i];A[i]=A[max];A[max]=temp; cout<<"第"<<len-i<<"趟的结果为...\n"; this->Output();cout<<endl; } else break;
//删除当前A[0]~A[heapsize-1]构成的大头堆中下标为index的结点A[index], //将其与A[heapsize-1]交换,并将A[0]~A[heapsize-2]调整为大头堆
- 2 -
void List::DeleteNodeofHeap(int heapsize,int index)
{
};
void List::createHeap() //生成大头堆 O(len)
{
int i,j,max,temp; for(i=len/2-1;i>=0;i--) { } max=j=2*i+1; if(j+1<len && A[j]<A[j+1])max=j+1; if(A[i]<A[max]) { temp=A[i];A[i]=A[max];A[max]=temp;} int temp=A[index]; A[index]=A[heapsize-1]; A[heapsize-1]=temp; Shift_down(heapsize-1,index); //cout<<"delete...\n"; //this->Output();cout<<endl;
//cout<<"createHeap()...\n";
//this->Output();cout<<endl;
};
//堆排序 O(len*log2(len))
void List::HeapSort()
{
int i;
createHeap();
for(i=len;i>1;i--)DeleteNodeofHeap(i,0);
};
void List::ShellInsert(int dk)//升序
{
//
int i,j,temp; for(i=dk;i<len;i++) { temp=A[i]; for(j=i-dk;j>=0;j=j-dk) { if(A[j]>temp)A[j+dk]=A[j]; else break; }; A[j+dk]=temp; }; this->Output(); - 3 -
// cout<<endl;
};
void List::ShellSort(int *delta,int t)
{
int k;
for(k=0;k<t;k++)ShellInsert(delta[k]);
};
int List::Patation(int low,int up)//划分,升序
{
int pivot,mid,temp;
//先选择枢轴 if(up-low>1) { mid=(low+up)/2; if(A[mid]<A[up] && A[mid]>A[low] || A[mid]<A[low] && A[mid]>A[up]) {pivot=A[low];A[low]=A[mid];A[mid]=pivot;} else if(A[up]<A[mid] && A[up]>A[low] || A[up]<A[low] && A[up]>A[mid]) {pivot=A[low];A[low]=A[up];A[up]=pivot;} }; //========== temp=A[low]; //cout<<"temp="<<temp<<endl; while(up>low) { while(up>low) { if(A[up]>=temp) up--; else {A[low]=A[up];break;} }; while(up>low) { if(A[low]<=temp)low++; else {A[up]=A[low];break;} }; }; //cout<<"up="<<up<<"low="<<low<<endl; A[up]=temp; //this->Output();
return(up);
}
void List::QuickSort(int low,int high)
{
- 4 -
计算机软件基础实践心得体会篇九
《软件项目综合实践心得体会(bistu勿用)》
软件项目综合实践心得体会
这个学期的软件项目综合实践马上就要结束了,作为我们小组开发组的一员,通过一个学期系统的学习实践后我体会到了许多在基础课程中认识不到的经验和心得。
首先,软件工程项目是需要团体作业才能够完成的。团体作业就需要交流,有交流,就必然会有合作;有合作,就需要有分工;有分工,就需要有协调;有所有这些,就需要有管理。然而一个人的项目是否不需要管理?当然不是,因为有文档,有代码,有灵感,有经验,等等都需要管理。只是此刻的管理是自己完成的,可以更简单一点。我们已经有过一遍又一遍的调试以前已经fix过的bug体验,也有过一遍又一遍的查找以前自己实现过的技术的经历。软件工程的理论,在开发过程中的作用,就是指导如何做好管理,以取得软件的可用性、正确性和合理性。如果我们清楚知道这是它的目标,就可以抛开一些对自己不适用的枝节。
我认为软件工程中最重要的,最有实际意义的,是它界定了工作职能,从而也确定了责任归属。什么意思?说白了,就是什么人做什么事,出了问题谁负责。那么它是怎么界定工作职能的?是通过对软件开发流程的划分来实现的。软件工程把软件的开发划分成很多个相对独立的阶段,每一个阶段都有相关的人员来实现,也就有相关的人员来负责。分工不清,责权不明,是导致管理混乱的最主要的因素。所以即使是两个人的项目,也是需要软件工程来指导的,因为通过它,可以更好的知道如何可以合理分工,划分工作职权以取得最终的成果。当然,走教条主义的道路是非常愚蠢的。
软件开发的一个共识,是把一个大的项目划分成一些小的模块,再把小的模块划分成更小的模块。如果这些小模块是独立的(或者原来就是一个独立的项目),那么软件工程至少可以提高它的重用性。对于一个软件工程观念不深的团队,不要期望他们在接手大的项目的时候可以使用软件工程,如果他们在小项目中不愿使用的话。前者的复杂度不是他们可以想象和承受的。
其次,通过这学期的实践,我才真的体会到,良好的文档是正规研发流程中非常重要的环节,一个好的程序是先写好设计文档再进行编程的,在设计文档的指导下,才能写出安全的代码。如果你不写文档,一开始就写程序,这样你就不
会按已设计好的路线走,而是想到哪写到哪。小功能还好说,要是大功能,就容易混乱。
以前在做实验提交文档的时候,总是有一种为了写文档而写文档,是被动的完成工作的感觉。但现在我认识到,维护良好的文档对于保证软件质量是必不可少的。对软件文档的深入接触,让我认识到文档本身就是软件产品,没有文档的软件,不能称其为软件,更谈不上为软件产品。软件文档的编制在软件开发工作中占有突出的地位和相当的工作量。高效率、高质量地开发、分发、管理和维护文档对于转让、变更、修正、扩充和使用文档,对于充分发挥软件产品的效益有着重要意义。
文档在软件开发人员、软件管理人员、维护人员、用户以及计算机之间起着桥梁作用。软件开发人员在各个阶段中以文档作为前阶段工作成果的体现和后阶段工作的依据,这个作用是显而易见的。软件开发过程中软件开发人员需制定一些工作计划或工作报告,这些计划和报告都要提供给管理人员,并得到必要的支持。管理人员则可通过这些文档了解软件开发项目安排、进度、资源使用和成果等。软件开发人员需为用户了解软件的使用、操作和维护提供详细的资料,我们称此为用户文档。以上三种文档构成了软件文档的主要部分。
我们初级编程人员总是或多或少的存在对软件文档不够重视的现象,总是把工作重心放在代码编程上。结果编出的代码总是不能尽如人意,因此,在今后的工作与学习之中,我们应该给予软件文档的编制应有的重视,这样才能让开发出来的软件系统更符合客户要求,更少漏洞,更加完善,臻于完美,这也是我们软件开发人员所孜孜以求的。
最后,经过这学期软件工程实验的学习,深深感到用户需求对软件的重要性。成功的软件产品是建立在成功的需求基础之上的,而高质量的需求来源于用户与开发人员之间有效的沟通与合作。当用户有一个问题可以用计算机系统来解决,而开发人员开始帮助用户解决这个问题,沟通就开始了。
需求获取可能是最困难、最关键、最易出错及最需要沟通交流的活动。对需求的获取往往有错误的认识:用户知道需求是什么,我们所要做的就是和他们交谈从他们那里得到需求,只要问用户系统的目标特征,什么是要完成的,什么样的系统能适合商业需要就可以了,但是实际上需求获取并不是想象的这样简单,
这条沟通之路布满了荆棘。首先需求获取要定义问题范围,系统的边界往往是很难明确的,用户不了解技术实现的细节,这样造成了系统目标的混淆。
还有就是对问题的理解,用户对计算机系统的能力和限制缺乏了解,任何一个系统都会有很多的用户或者不同类型的用户,每个用户只知道自己需要的系统,而不知道系统的整体情况,他们不知道系统作为一个整体怎么样工作效率更好,也不太清楚那些工作可以交给软件完成,他们不清楚需求是什么,或者说如何以一种精确的方式来描述需求,他们需要开发人员的协助和指导,但是用户与开发人员之间的交流很容易出现障碍,忽略了那些被认为是"很明显"的信息。最后是需求的确认,因为需求的不稳定性往往随着时间的推移产生变动,使之难以确认。为了克服以上的问题,必须有组织的执行需求的获取活动。
如果客户要求的功能与已有的系统很相似,则可查看需求是否有足够的灵活性以允许重用一些已有的软件组件。业务建模和领域建模式需求重用的最好方法,像分析模式和设计模式一样,需求也有自己的模式。
总而言之,经过一学期的软工实验,深刻感到其重要性的同时也学到了不少的东西 ,将对我在今后的软件开发过程中起极大的作用。
计算机软件基础实践心得体会篇十
《软件开发实习心得》
软件开发实习心得
一直以来期望从事自己喜欢的事业的我,对软件开发有者及大的兴趣,可由说种种原因使我从事工作以来走了好几年弯路,心中的梦想迟迟不能得以实现,可程序员的梦想从来没有从我的心中抹去,但这扇大门好像并没有向我敞开,今天,贵公司给了我敲开这扇大门的机会,让我真实体验了程序员的诞生过程。早就听说,程序员的前几个月是最苦的,可从来没有感受到,海马实习基地让我提前感受到了刚刚进入软件行业的压力和困惑,再也没有在自己家里随便写段小程序后的那种“自豪”感了。要面对每天必须面对的问题,再也不可能以“逃避”而了之了。也让我感觉到做为一个程序员所应该具备的基本素质在这不到一个月的实习过程中也让我深深体会到了作为一个合格的程序员应该具备的基本素质。
团队精神和协作能力是程序员应该具备的基本素质,最近的工作中让我深深休会到了这一点,由于小组成员配合不好,使本来很方便的cvs给自己的工作带来的及大的麻烦,一不小心自己写的的东西就会被小组别的成员在上传文件的时候给覆盖掉,一整天的工作可能就这样被反工,我们小组这次就是因为协作不好,导致各模块之间不法连接,给工作带来了及大的麻烦,消耗了大量的劳动力还没有提高工作效率。这使我深深的体会到:一个成功商业性软件的开发必须有一个有强大凝聚力的团队,个人的力量是有限的,团队精神和良好的协作会使我们做出优秀的软件。
良好的文档是正规研发流程中非常重要的环节,作为代码程序员,30%的工作时间写技术文档是很正常的,缺乏文档,一个软件系统就缺乏生命力,在未来的查错,升级以及模块的复用时就都会遇到极大的麻烦。这次的这个小小的项目,就因为文档上的一点点理解错误让我们花了很大的工夫去改代码,改页面。很庆幸的是,这是一个小项目,要是大项目,这种问题可能就会导致大量的代码修改,可见文档在一个项目中起者巨大的做用。
此外,良好的代码编写习惯,不但有助于代码的移植和纠错,也有助于不同技术人员之间的协作。作为一个程序员,对需求的理解能力也是很重要的,只有真正理解了一个模块的作用,才会写出高效率的代码,才能使整个软件项目作出来更加优秀,具备更好的安全性和稳定性,我在写代码的过程中就遇到了需求理解上的问题,使得写出来的代码功能不全,幸好不是给客户发现在,要不,这个软件的商业价值可能就会打折扣了。单元测试对于一个程序员来说是不可不做的一项工作,不做好测试就会给后期的集成工作带来麻烦,往往为了一个小问题会让我们查找好多模块,给后期工作带来很大麻烦。
这一段时间的工作也让我明白了一点:一个优秀的程序员必须不断的学习,随时总结,找到自己的不足,这样逐步提高,才能让自己很快的成长起来。 建站侠客 发表于 2008-4-28 10:19
对软件开发的一点心得体会
一、前期规划:
我理解的前期规划是:在市场人员们汇总一个需求提交给产品专家带领的产品经理团队,然后经过这个团队根据公司具体情况再次分析和规划出一个最终需求文档。
这个需求文档应当首先提交给技术研发部门的负责人以及核心开发人员。由开发团队对其进行技术和风险分析。如果对此需求统一有异议的地方,需要返回给产品团队,重新修正需求。反复如此,直至需求完善准确,细致,清晰。
前期规划就像高楼的地基,如果马马虎虎,就算是一块砖块没摆好都可能导致整个高楼建设的失败。在规划中我认为,交流永远是需要双方积极主动,能认真听取每个人的建议。前期工作思维不慎重,不细致,不认真,不够完善,将产生连锁效应直接导致整个工程和项目的失败。
这种失败可能表现为:第一种,软件按需求实现但是功能根本不能满足用户需要。第二种,功能都有了,软件没有达到可用性、易用性。
对于第一种,当然是因为前期规划疏漏了某些细小功能,没能把需求文档做完善。应该是规划工作做的还不够认真和细致。
对于第二种情况,我认为更多是在产品设计规划方面经验还不够成熟。这种问题应该是很难避免的。因为每种新产品对产品团队来说都很陌生。即使以前做过类似的东西,也难免面面俱到。这只能通过不断努力和认真的态度来弥补。
前期规划的交流涉及了市场、产品和技术研发等多个团队之间。需要的不仅是团队内部的交流,更多需要协调好团队之间的交流。可能有时候需要公司高层和中层参与协调。
目前,很多开发人员深感项目的需求文档写的都很单薄。大家可以想一想,如果没有好的开始,怎么会有好的结束呢?需求文档单薄,不够细致,由谁来继续完善呢?难道让程序员们自己去完善。我想程序员也可能没有这种能力。对于程序员能把代码写的很健壮很稳定就已经是很不容易的事情了。
二、概要设计:
我理解的概要设计步骤:(以项目为中心的开发流程)
1〉 项目经理仔细阅读项目需求文档。
2〉 项目经理召集项目开发成员,开项目启动会议。具体商议项目的开发任务和责任分配。
3〉 核心开发人员开发确定,以及各模块开发人员确定。
4〉 由系统分析员和核心开发人员仔细阅读需求文档,对系统整个架构分析和做技术规划。
5〉 系统分析员整理和书写最终的系统架构和概要设计文档。
6〉 系统分析员在文档提交日,提交给项目经理。项目经理确认文档并审批。
7〉 项目经理召集项目开发成员,开一个概要设计以及系统架构确定的会议。向每个成员分发文档,并讨论确定最终概要设计文档。
8〉开始详细设计文档的工作
三、详细设计:
1〉 项目经理组织成立各个模块的开发小组,并确定开发小组组长(程序经理)。
2〉 各开发组长书写各自模块的详细设计文档,开发成员需要协助,配合。
3〉 在指定提交日,开发组长提交文档给系统分析员。由系统分析员审批。
4〉 系统分析员组织召开一个详细设计文档确认的会议。
5〉 然后开发组长分发各自模块的详细设计文档给程序员,程序员在指定时间内完成。
6〉 程序员做内部测试。开发组长协调并配合。
7〉 确认无bug提交给开发组组长。
8〉 所有模块整合工作,由整个开发组成员参与完成。由所有开发组长和系统分析员负责主要部分工作。程序员协助和配合。
9〉 对整合后工程做详细测试。
10〉 确认测试通过后,开发组长根据开发成员表现以及提交成果填写绩效考核表。然后提交给项目经理。
11〉 项目经理会召开项目总结会,同时向优秀成员颁奖。同时鼓励所有成员继续努力。对不能按时完成导致项目能按时提交,以及对导致失败的
关键人员给与惩罚处理。
当然,以上只是一个简单的开发流程,一定是有很多不足的地方。希望能起到抛砖引玉的作用。大家都明白,流程和制度是死的,但人是活的,所以如何按流程做得好,关键还是在人本身了。没有一个流程和制度,一个团队也必将是一盘散沙。正所谓“无规矩无以成方圆”。这句话说得很有道理。
四、具体编码:
开发几个项目之后,对编写程序有了更进一步的了解。
好的程序应该具有: 易读性,易扩展性,容错性。
易读性: 所有变量和函数以及类名用简单易懂易记忆的命名方式。所有类和函数甚至变量都有关键的注释说明。这点很重要,也是最基础的。如果代码书写不够美观和易懂,我想自己以后也不想再看。就更别谈功能的扩展和新版本开发了。
易扩展性: 整体系统架构逻辑简单清晰。模块与模块之间尽量做到互不影响,也就是尽可能的独立。这部分工作主要体现在前期设计工作中,需要掌握好的设计经验和方法才能够做得比较好。
容错性: 对数据流和指针以及数组都做数据有效性检查;对第三方接口的调用失败的容错性。对所有代码都做调用失败后的错误处理。以及在大的工程中加入trace文件输出,把关键的数据流和关键处理部分的操作信息输出。以便对工程异常情况产生条件的定位,及时解决问题。
我觉得程序员能在这三方面做得很好就算一个优秀的programmer了。
五、调试、跟踪与测试:
1 测试需要注意的:
对每个模块的接口做测试,数据边界的检查。在对整个模块做测试。
主要测试稳定性,效率以及功能是否正常。
确认单个模块完全正常后,再加入工程。
在系统架构设计的时候,可能会引入原型参考。要对原型做完成测试后,确认没有问题后,才可使用。
2 可以采用VC自带Trace或者将信息输出为文本文件的方式跟踪程序并输出关键信息,以便定位程序异常的原因。
3 对于通信模块的测试,特别注意服务端和客户端的数据流。可以针对性的写一个客户端或服务端的测试程序,检验通讯过程是否正常。
4 在用VC做开发中,一定先要让Debug版本正常运行,保证没有任何异常,内存泄漏和Assert等调试警告信息。如果用到其他Lib,一定要保证Lib本身不存在问题。
这里只是提到一些自己容易忽略的东西,希望能对大家有所帮助,欢迎指正!谢谢。
上一篇:教师课题结题论文格式
下一篇:政审报告范文