目录
(1)C语言传值与传地址变量
(2)算法效率的度量
(3)基本操作
(4)主函数
主要由实现基本操作和算法的程序构成。这些程序有6类:
- 数据存储结构,文件名第一个字母为c,以h为扩展名。如c1-1.h是第1章的第1种存储结构。
- 每种存储结构的一组基本操作函数。以bo开头,cpp为扩展名。
- 调用基本操作的主程序。以main开头,cpp为扩展名。
- 实现算法的程序。以algo开头,cpp为扩展名。
- 不同于基本操作又被多次调用的函数,以func开头,cpp为扩展名。
- 数据文件,以txt为扩展名。
(1)C语言传值与传地址变量
#include <stdio.h>void fa(int a)
{a++;printf("在函数fa中:a=%d\n", a);
}
void fb(int *a)
{(*a)++;printf("在函数fb中:a=%d\n", *a);
}int main()
{int n = 1;printf("在主程序中,调用函数fa之前:n=%d\n", n);fa(n);printf("在主程序中,调用函数fa之后:n=%d\n", n);fb(&n);printf("在主程序中,调用函数fa之后:n=%d\n", n);
}
传地址变量,若变量值在函数中被修改,则变化的值会带回到主函数中,运行结果为:
(2)算法效率的度量
//计算1-1/x+1/(x*x)…的更快捷的算法
//计算程序运行时间
#include<sys/timeb.h>
#include<stdio.h>void main()
{timeb t1, t2;long t;double x, sum1=1, sum=1;int i, n;printf("请输入x n:");scanf("%lf%d", &x, &n);ftime(&t1); for(i=1; i<=n; i++){ sum1*=-1.0/x;sum+=sum1;}ftime(&t2); t=(t2.time-t1.time)*1000+(t2.millitm-t1.millitm); printf("sum=%lf,用时%ld毫秒\n", sum, t);
}
运行结果为,具体运行时间跟计算机有关。
(3)基本操作
这里介绍抽象数据类型的8个基本操作函数,返回值类型都是Status,即智能返回OK、ERROR.
// bo1-1.h 抽象数据类型Triplet和ElemType(由c1-1.h定义)的基本操作(8个)
Status InitTriplet(Triplet &T, ElemType v1, ElemType v2, ElemType v3)
{ //操作结果,构造三元组T,依次置T的3个元素的初值为v1,v2,v3T=(ElemType*)malloc(3*sizeof(ElemType)); if(!T)exit(OVERFLOW); //OVERFLOW为定义的宏变量T[0]=v1, T[1]=v2, T[2]=v3;return OK;
}Status DestroyTriplet(Triplet &T)
{ //操作结果,三元组T被销毁free(T); T=NULL; return OK;
}Status Get(Triplet T, int i, ElemType &e)
{ //初试条件:三元组T已存在,操作结果:用e返回T的第i个元素的值if(i<1 || i>3) return ERROR;e=T[i-1]; return OK;
}Status Put(Triplet T, int i, ElemType e)
{ //改变T的第i元的值为eif(i<1 || i>3) return ERROR;T[i-1]=e; return OK;
}Status IsAscending(Triplet T)
{ // 判断T的3个元素是否按升序排列return(T[0]<=T[1] && T[1]<=T[2]);
}Status IsDescending(Triplet T)
{ //判断T的3个元素是否按降序排列return(T[0]>=T[1] && T[1]>=T[2]);
}Status Max(Triplet T, ElemType &e)
{ //返回最大值e=(T[0]>=T[1]) ? (T[0]>=T[2] ? T[0] : T[2]) : (T[1]>=T[2] ? T[1] : T[2]);return OK;
}Status Min(Triplet T, ElemType &e)
{ //返回最小值e=(T[0]<=T[1]) ? (T[0]<=T[2] ? T[0] : T[2]) : (T[1]<=T[2] ? T[1] : T[2]);return OK;
}
(4)主函数
主函数是用来检验基本操作函数是否正确。
// main1-1.cpp 检验基本操作bo1-1.h的主函数
// 以下两行可根据需要选其一(且只能选其一),而无须改变基本操作.
typedef int ElemType;
//typedef double ElemType; // 定义抽象数据类型ElemType在本程序中为双精度型。
#include"c1-1.h"
#include"bo1-1.h"
#include"func1-1.h"int main()
{Triplet T;ElemType m;Status i;i=InitTriplet(T, 5, 7, 9);//i=InitTriplet(T, 5.0, 7.1, 9.3); // 当ElemType为双精度型时,可取代上句。第15行printf("调用初始化函数后,i=%d(1:成功)。T的3个值为",i);PrintT(T);i=Get(T, 2, m);if(i==OK){printf("T的第2个值为");PrintE(m);}i=Put(T, 2, 6);if(i==OK){printf("将T的第2个值改为6后,T的3个值为");PrintT(T);}i=IsAscending(T);printf("调用测试升序的函数后,i=%d(0:否 1:是)\n", i);i=IsDescending(T);printf("调用测试降序的函数后,i=%d(0:否 1:是)\n", i);if((i=Max(T, m))==OK){printf("T中的最大值为");PrintE(m);}if((i=Min(T, m))==OK){ printf("T中的最小值为");PrintE(m);}DestroyTriplet(T);printf("销毁T后,T=%u\n", T);return 0;
}
运行结果为: