级计算机学院课程设计题目及参考程序.docx

上传人:b****5 文档编号:6413463 上传时间:2023-01-06 格式:DOCX 页数:41 大小:28.33KB
下载 相关 举报
级计算机学院课程设计题目及参考程序.docx_第1页
第1页 / 共41页
级计算机学院课程设计题目及参考程序.docx_第2页
第2页 / 共41页
级计算机学院课程设计题目及参考程序.docx_第3页
第3页 / 共41页
级计算机学院课程设计题目及参考程序.docx_第4页
第4页 / 共41页
级计算机学院课程设计题目及参考程序.docx_第5页
第5页 / 共41页
点击查看更多>>
下载资源
资源描述

级计算机学院课程设计题目及参考程序.docx

《级计算机学院课程设计题目及参考程序.docx》由会员分享,可在线阅读,更多相关《级计算机学院课程设计题目及参考程序.docx(41页珍藏版)》请在冰豆网上搜索。

级计算机学院课程设计题目及参考程序.docx

级计算机学院课程设计题目及参考程序

问题A:

整数排序一

时间限制:

 20Sec  内存限制:

 128MB

题目描述

经过三天的任务1的训练,大家的确辛苦了.因此,在任务2开始时,我为大家准备了一道令人非常愉快的热身题.即将一个杂乱无序的整数序列,按照从小到大的顺序排列并输出.

输入

测试数据不止一组,每组测试数据:

1)先输入无序序列的整数个数n;(n不超过1000000)

2)然后连续输入n个整数;

若n的值输入为0值,则输入结束.

输出

与每组输入的测试数据相对应,输出其按从小到大排好序后的整数序列.

注意:

每组输出占一行.

样例输入

10

987654321-1

5

8877665533

0

样例输出

-1123456789

3355667788

提示

本题测试对第10章“内部排序”的理解程度。

可采用冒泡排序、插入排序、选择排序、快速排序、希尔排序、堆排序等方法完成此题。

警告:

目的是让大家熟悉内部排序的各种算法,因此禁止调用sort或qsort等函数!

不改正者降最终成绩等级.

简单排序版:

#include

#include

#defineSIZE10000

voidfastsort(inta[],intn)

{

inti,j,k,temp;

for(i=0;i

{

k=i;

for(j=i+1;j

if(a[j]

k=j;

if(i!

=k)

{

temp=a[i];

a[i]=a[k];

a[k]=temp;

}

}

}

intmain()

{

intsort[SIZE];

intnum,i;

while

(1)

{

scanf("%d",&num);

if(num==0)exit(0);

for(i=0;i

{

scanf("%d",&sort[i]);

}

fastsort(sort,num);

for(i=0;i

{

if(i==num-1)

printf("%d",sort[i]);

else

printf("%d",sort[i]);

}

printf("\n");

}

return0;

}

快速排序版:

#include

#defineSIZE100000

voidquick_sort(inta[],intlow,inthigh)

{

inti,j,t;

if(low

{

i=low;

j=high;

t=a[low];

while(i

{

while(it)

j--;

if(i

{

a[i]=a[j];

i++;

}

while(i

i++;

if(i

{

a[j]=a[i];

j--;

}

}

a[i]=t;

quick_sort(a,low,i-1);

quick_sort(a,i+1,high);

}

}

intmain()

{

intsort[SIZE];

intnum,i;

while

(1)

{

scanf("%d",&num);

if(num==0)return0;

for(i=0;i

{

scanf("%d",&sort[i]);

}

quick_sort(sort,0,num-1);

for(i=0;i

{

if(i==num-1)

printf("%d",sort[i]);

else

printf("%d",sort[i]);

}

printf("\n");

}

return0;

}

堆排序版:

#defineMAX10000

#include

voidsift(int*x,intn,ints)

{

intt,k,j;

t=*(x+s);

k=s;

j=2*k+1;

while(j

{

if(j

{

j++;

}

if(t<*(x+j))

{

*(x+k)=*(x+j);

k=j;

j=2*k+1;

}

else

{

break;

}

}

*(x+k)=t;

}

 

voidheap_sort(int*x,intn)

{

inti,k,t;

int*p;

for(i=n/2-1;i>=0;i--)

{

sift(x,n,i);

}

for(k=n-1;k>=1;k--)

{

t=*(x+0);

*(x+0)=*(x+k);

*(x+k)=t;

sift(x,k,0);

}

}

intmain()

{

int*p,i,a[MAX],num;

while

(1)

{

p=a;

scanf("%d",&num);

if(num==0)return0;

for(i=0;i

scanf("%d",p++);

p=a;

heap_sort(p,num);

for(i=0;i

{

if(i==num-1)

printf("%d",a[i]);

else

printf("%d",a[i]);

}

printf("\n");

}

return0;

}

问题B:

整数排序二

时间限制:

 20Sec  内存限制:

 128MB

题目描述

在完成了任务2的第一个热身题后,很多同学觉得不过瘾,那就用同样的题目让大家再交一次原来已经AC的程序,看是什么样的结果,应该怎样应对?

题目跟第一个热身题是一样的(但我已经大幅增加了测试数据),还是要求将一个杂乱无序的整数序列,按照从小到大的顺序排列并输出.

输入

测试数据不止一组,每组测试数据:

1)先输入无序序列的整数个数n;(n不超过1000000)

2)然后连续输入n个整数;

若n的值输入为0值,则输入结束.

输出

与每组输入的测试数据相对应,输出其按从小到大排好序后的整数序列.

注意:

每组输出占一行.

样例输入

10

987654321-1

5

8877665533

0

样例输出

-1123456789

3355667788

提示

本题测试对第10章“内部排序”的理解程度。

但要考虑算法的优化及排序方法的选择(排序速度要快才行)。

警告:

目的是让大家熟悉内部排序的各种算法,因此禁止调用sort或qsort等函数!

不改正者降最终成绩等级.

#defineMAX1000000

#include

 

voidsift(int*x,intn,ints)

{

 intt,k,j;

 

 t=*(x+s);

 k=s; 

 j=2*k+1;

 

 while(j

 {

   if(j

   if(t<*(x+j))

   {

    *(x+k)=*(x+j);

    k=j;

    j=2*k+1;

   }

   elsebreak;

 }

  

 *(x+k)=t;

}

 

 

voidheap_sort(int*x,intn)

{

 inti,k,t;

 int*p;

 

 for(i=n/2-1;i>=0;i--)

  sift(x,n,i);

  

  

 for(k=n-1;k>=1;k--)

 {

  t=*(x+0);

  *(x+0)=*(x+k);

  *(x+k)=t;

  sift(x,k,0);

 }

}

 

 

 

intmain()

{

 int*p,i,a[MAX],num;

  

 while

(1)

 {

     p=a;

     scanf("%d",&num);

     if(num==0)return0;

     for(i=0;i

      scanf("%d",p++);

 

     p=a;

     heap_sort(p,num);

 

     for(i=0;i

     {

      if(i==num-1)

      printf("%d",a[i]);

      else

      printf("%d",a[i]);

     }

    printf("\n");

  

  }

 return0;

}

 

 

问题C:

时间复杂度的估算

时间限制:

 1Sec  内存限制:

 128MB

题目描述

在数据结构里面,时间复杂度是决定算法效率的一项重要指标,常见的时间复杂度格式有三种:

1、O(n)

2、O(lg(n))

3、O(sqrt(n))

一个算法往往有多种解法,每种解法的复杂度由上述常见的的复杂度组合成,例如排序的两种算法:

1、 快速排序:

时间复杂度为O(n*lg(n))

2、冒泡排序:

时间复杂度为O(n*n)

现在先给定n的值,然后输入一个值m,随后输入m行数据表示有m个算法的复杂度。

请确定这些复杂度是否会超时。

若复杂度计算结果大于100000000,则为超时(TLE),否则输出计算的复杂度,输出的结果保留两位小数。

(lg(n)表示求以2为底数的n的对数 )

输入

第一行输入n(1≤n≤10000000),m(1≤m≤100), 其中n为表示问题规模的数,m为算法复杂度的个数。

接下来m行,每行为一个串,每个串都包含O(),其中,字符'O'后的括号里面的字符串保证仅由n,lg(n),sqrt(n),*组成并且合法。

如sampleinput所示。

注意:

lg()或sqrt()中只会出现字符'n',不会再嵌套lg()或sqrt()。

如果想做得难一点,可以去做编号为1049的题,1049题要考虑嵌套。

输出

对于每个串,若计算出来的复杂度大于100000000,则输出TLE,否则输出该复杂度的计算结果。

样例输入

100005

O(n*n)

O(n*n*n)

O(sqrt(n))

O(lg(n))

O(n*lg(n))

样例输出

100000000.00

TLE

100.00

13.29

132877.12

提示

本题主要测试三个方面:

1)对于时间复杂度的理解。

2)字符串处理及数组的合理使用。

3)编码能力。

#include

#include

#defineMAX100

 

intmain()

{

    intN_NUM,L_NUM,S_NUM;

    intnum;

    charstring[MAX];

    doubles;

    inti,p,n;

 

    while(scanf("%d%d",&n,&num)!

=EOF)

    {

     for(s=1.0,N_NUM=0,L_NUM=0,S_NUM=0,p=0;p

     {

         scanf("%s",string);

          s=1.0;

          N_NUM=0;

          L_NUM=0;

          S_NUM=0;

     

       for(i=2;string[i]!

='\0';i++)

       {

          if(string[i]=='n')

          {

            N_NUM++;

            i++;

          }

          if(string[i]=='l')

          {

             L_NUM++;

             i=i+5;

          }

          if(string[i]=='s')

          {

             S_NUM++;

             i=i+7;

          }

       }

       for(i=0;i

           s=s*n;

       for(i=0;i

           s=s*(log(n)/log(2.0));

       for(i=0;i

           s=s*sqrt(n);

       

       if(s>100000000)

          printf("TLE\n");

        else

          printf("%.2f\n",s);

     }

    }

}

问题D:

车站调度

时间限制:

 1Sec  内存限制:

 128MB

题目描述

有顺序排列的1,2,3,…,n节车厢在入站口等待调度。

车站设置了一个栈作为缓冲,这样的话只可能进行下列两个操作之一:

      

(1)如果还有车厢在入站口,将最前面的入栈缓冲

     

(2)将栈顶的车厢驶出车站    

给定一个1至n的排列,问其作为出站序列是否合法。

注意:

入站顺序为1,2,3,…,n,即1先入栈...,n最后入栈。

输入

输入包含若干测试用例。

每一个测试用例由多行组成。

第一行是两个整数n(1<=n<=100)和m,n表示入站序列为1至n。

m表示随后有m行出站序列。

当n,m均为0时表示输入结束。

输出

对应每一个出站序列,合法则输出一行YES,否则输出一行NO。

样例输入

36

123

132

213

231

312

321

00

样例输出

YES

YES

YES

YES

NO

YES

提示

参见习题集p21题3.1。

本题主要测试对栈的理解及灵活运用。

解本题推荐采用模拟入栈出栈的方式,以训练对栈的运用熟练程度。

当然也有其它方法,如推导出规律(出栈序列中存在“大小中”的组合是不行的)后编程求解。

#include

#defineMAX100

#defineSIZE100

 

intclear(inta[],intp)

{

   inti;

   for(i=0;i

   {

      if(a[i]

        return0;

   }

  return1;

}

 

intJudge(inta[],intnum)

{

   intjudge[SIZE];

   intp;

   inti,k,j;

 

   for(i=0;i

   {

    for(k=i+1,p=0;k

    {

      if(a[i]>a[k])

      {

         judge[p++]=a[k];

      }

    }

    if(clear(judge,p))

     continue;

    else

       {

         printf("NO\n");

         return-1;

       }

    }

 printf("YES\n");

 return0;

}

 

 

 

 

intmain()

{

    intnum,time;

    inta[MAX];

    inti,j;

    while

(1)

    {

    scanf("%d%d",&num,&time);

    if(num==0&&time==0)return0;

 

      for(i=0;i

        {

          for(j=0;j

             scanf("%d",&a[j]);

             Judge(a,num);

        }

    }

  return0;

}

问题E:

AcmersLoveAC

时间限制:

 1Sec  内存限制:

 128MB

题目描述

WehateWA!

WehateTLE!

WehateRE!

WehatePE......!

TheonlythingweloveisAC!

BecauseweareACMers!

Nowwegiveyouataskthatyoushouldfindhowmanystrings―"AcmersLoveAc"arethereinastringthatweinput.

输入

 Theinputcontainsseveraltestcases.Eachtestcaseconsistsofonestring(onlycontainscapitalletterandLowercaseletter)whichisatmost100characters.InputisterminatedbyEOF.

输出

 Foreachtestcaseoutput,printanintegerwhichstandsforthathowmanystrings―"AcmersLoveAc"arethereintheinput

string.

样例输入

IKnowAcmersLoveAc

AcmersDontLoveAc

AcmersLoveAcAndAcmersLoveAc

样例输出

1

0

2

提示

本题是今天的热身题,主要测试对字符串的处理.

#include

#include

#defineMAX100

#defineSIZE13

 

intEquals(chara[])

{

    charstr[SIZE]="AcmersLoveAc";

    returnstrcmp(str,a);

}

 

intNumofAC(chara[],intnum)

{

    inti,j,k=0,p;

    charb[SIZE];

    for(i=0,j=0;i+SIZE-2

    {

        if(a[i]=='A')

        {

            p=i;

            for(j=0;j

            {

              b[j++]=a[p++];

            }

            b[j]='\0';

            if(Equals(b)==0)

                  k++;

        }

    }

    returnk;

}

 

intmain()

{

    intnum;

    charstr[MAX];

    while(scanf("%s",str)!

=EOF)

    {

       

      for(num=0;str[num]!

='\0';num++);

      printf("%d\n",NumofAC(str,num));

    }

    return0;

}

 

问题F:

二叉树遍历

时间限制:

 1Sec  内存限制:

 128MB

题目描述

对于二叉树T,可以有先序遍历、中序遍历和后序遍历三种遍历方式。

我们知道,任意给定一颗二叉树的两种遍历方式,就可以唯一确定该树。

现在我们要求给出一棵二叉树的先序遍历序列和中序遍历序列,输出它的广度优先遍历序列。

 

输入

第一行为一个整数t(0

 以下t行,每行输入一个测试用例,包含两个字符序列s1和s2,其中s1为一棵二叉树的先序遍历序列,s2为中序遍历序列。

s1和s2之间用一个空格分 隔。

序列只包含大写字母,并且每个字母最多只会出现一次。

 

输出

为每个测试用例单独一行输出广度优先遍历序列。

样例输入

2

DBACEGFABCDEFG

BCADCBAD

样例输出

DBEACGF

BCAD

提示

本题主要测试对二叉树遍历的理解.

#include

#include

#include

#defineSIZE150

#defineMAX150

 

typedefstructBiTree

{

 chardata;

 structBiTree*lchild,*rchild;

}BiTree;

 

BiTree*CreateBT(char*pre,char*in,intn)

{

    BiTree*s;

    char*p;

    intk;

    if(n<=0)returnNULL;

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

    s->data=*pre;

    for(p=in;p

    {

        if(*p==*pre)break;

    }

    k=p-in;

    s->lchild=CreateBT(pre+1,in,k);

    s->rchild=CreateBT(pre+k+1,p+1,n-k-1);

    returns;

}

 

voidBFS(BiTree*p)

{

  BiTree*queue[

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1