02年系统设计师(高级程序员)下午试题2
出处:日期2004-03-17

            从下列的 2 道试题(试题五至试题六)中任选 1 道解答。如果解答的试题数超过 1 道,则题号小的 1 道解答有效。

            试题五

            阅读下列程序说明和C代码,将应填入__(n)__处的字句写在答题纸的对应栏内。

            [程序 5.1 说明]

            “背包问题”的基本描述是:有一个背包,能盛放的物品总重量为 S,设有 N

            件物品,其重量分别为w1,w2,...,wn,希望从N件物品中选择若干件物品,所选物品的重量之和恰能放入该背包,即所选物品的重量之和等于

            S 。

            如下程序均能求得“背包问题”的一组解,其中程序 5.1 是“背包问题”的递归解法,而程序 5.2 是“背包问题”的非递归解法。

            [程序 5.1]

            #include

            #define N 7

            #define S 15

            int w[N+1] = {0,1,4,3,4,5,2,7};

            int knap ( int S, int n)

            { if(S == 0) return 1;

            if ( sO && n<1 )) return 0;

            if ( __(1)__ ) ) {

            printf( "4d",w[n] );return 1;

            } return __(2)__ ;

            }

            main() {

            if ( knap(S,N) ) printf( "OK!\n" );

            else printf( "N0!\n" );

            }

            [程序 5.2]

            #include

            #define N 7

            #define S 15

            typedef struct {

            int S;

            int n:

            int job;

            } KNAPTP;

            int w[N+1] = {0,1,4,3,4,5,2,7};

            int knap(int S,int n);

            main(){

            if ( knap(S,N) ) printf("0K!\n" );

            else printf( "N0!\n" );

            int knap( int S,int n )

            { KNAPTP stack[100],x;

            int top, k, rep;

            x.s = s; x.n = n;

            x.job = 0;

            top = l; stack[top] = x;

            k = 0;

            while ( __(3)__ ) {

            x = stack[top];

            rep = l;

            while ( !k && rep ) {

            if( x.s=0 ) k = 1; /*已求得一组解*/

            else if ( x.S<0 || x.n<=0 ) rep = 0;

            else { x.s = __(4)__ ; x.job=1;

            __(5)__ = x;

            }

            }

            if ( !k ) {

            rep = 1;

            while ( top >= 1 && rep) {

            x = stack[top--];

            if ( x.job=1){

            x.s += w[x.n + 1];

            x.job = 2;

            stack[++top] = x;

            __(6)__ ;

            }

            }

            }

            }

            if (k){ */输出一组解*/

            while ( top >= 1 ) {

            x = StaCk [ top-- ];

            if ( x.job == 1 )

            printf ( "M\t,w[x.n+1] );

            }

            }

            return k;

            }

            试题六

            阅读下列程序说明和 C++ 代码,将应填入__(n)__处的字句写在答卷的对应栏内。

            [程序 6 说明]

            本程序实现两个多项式的乘积运算。多项式的每一项由类 Item 描述,而多项式由类 List 描述。类 List 的成员函数有:

            createList():创建按指数降序链接的多项式链表,以表示多项式。

            reverseList():将多项式链表的表元链接顺序颠倒。

            multiplyList( List L1,List 12 )计算多项式 L1 和多项式 L2 的乘积多项式。

            [程序6]

            #include

            class List;

            class ltem {

            friend class List;

            private:

            double quot;

            int exp;

            Item *next;

            public:

            Item( double_quot,int_exp)

            {__(1)__;}

            };

            class List{

            private:

            Item *list;

            public:

            List(){list:NULL;}

            void reverseList();

            void multiplyList(List L1,List L2);

            void createList();

            };

            void List::createList()

            { Item *p, *U, *pre;

            int exp;

            double quot;

            1ist = NULL;

            while __(1)__ {

            cout << "输入多项式中的一项(系数、指数):" << endl;

            cin >> quot >> exp:

            if ( exp<0 ) break; //指数小于零,结束输入

            if ( quot=0 ) continue;

            p = list;

            while ( __(2)__ ) { //查找插入点

            pre = p;p = p->next;}

            if ( p != NULL && exp = p->exp ) { p->quot += quot;continue;}

            u = __(3)__ ;

            if (p == list) list = u;

            else pre->next = u;

            u ->next = p;}

            }

            void List :: reverseList()

            { Item *p,*u;

            if ( 1ist=NULL ) return;

            p = list ->next;list -> next = NULL;

            while ( p != NULL) {

            u = p -> next;p ->next = list;

            list = p; p = u;}

            }

            void List :: multiplyList ( List L1,List L2 )

            { Item *pLl,*pL2,*u;

            int k,maxExp;

            double quot;

            maxExp = __(4)__;

            L2.reverseList(); list=NULL

            for ( k = maxExp;k >= 0;k-- ){

            pLl = L1.1ist;

            while ( pLl != NULL && pLl -> exp > k ) pLl = pLl ->next;

            pL2 = L2.1ist

            while (pL2 NULL && __(5)__ pL2 = pL2 -> next;

            quot = 0.0;

            while (pLl != NULL && pL2 != NULL){

            if(pLl—>exp+pL2->exp’:k) {

            __(6)__ ;

            pLl = pLl -> next;pL2 = pL2 -> next;

            } else if ( pLl -> exp + pL2 -> exp > k ) pLl = pLl -> next;

            else pL2 = pL2 -> next;

            }

            if ( quot !=0.0 ){

            u = new ltem( quot,k );

            u -> next = list;list = u;}

            }

            reverseList(); L2.reverseList():

            }

            void main()

            { List L1,L2,L;

            cout << "创建第一个多项式链表\n"; L1.createList();

            cout << "创建第二个多项式链表\n"; L2.createList();

            L.multiplyList ( L1,L2);

            }

百灵编辑:宝葵

  • 02年系统设计师(高级程序员)下午试题1 ( 2004-03-17 )
  • 02年系统设计师(高级程序员)上午试题3 ( 2004-03-17 )
  • 02年系统设计师(高级程序员)上午试题2 ( 2004-03-17 )
  • 02年系统设计师(高级程序员)上午试题1 ( 2004-03-17 )
  • 推荐
    计算机专业技术资格(水平)考试12日起报名
    名师详解2004年高考考试大纲
    04考研调剂、复试及录取指南
    04同等学力申硕考试5日起报名
    两会:教育振兴 国运所系
    2004年度注册会计师全国统一考试报名简章
    2004考研成绩查询指南
    关注高中课程改革