华南俳烁实业有限公司

自考

各地資訊
當前位置:華課網(wǎng)校 >> 自考 >> 模擬試題 >> 工學類 >> C語言程序設(shè)計 >> 文章內(nèi)容

排行熱點

自學考試《C語言程序設(shè)計》隨堂習題及答案_第2頁

來源:華課網(wǎng)校  [2017年1月31日]  【

  【4.91】分析:分析題目,我們可以將題目進行抽象:在有放回的前提下,求全部從m個不同的元素中任取n個元素的排列。根據(jù)題目的含義,我們可以用整數(shù)0~m-1表示這m個不同的元素,將要生成的n個元素分為兩部分:第一個元素和其它n-1個元素。如果n=1,即要從m個元素中任取1種,這樣有m種不同得取法,我們可以直接使用循環(huán)完成。若n>1,則可以知道,第一個元素一定有m種不同的取法,可以針對第一個元素m種不同取法種的1種,對后面的n-1個元素進行同樣的(遞歸)操作即可產(chǎn)生一種新的不同的排列。具體算法描述如下:

  fun(指向第一個元素的指針,從m個元素中,取n個元素)

  { for ( i=0; i

  { 確定第一個元素的選取方法:=i;

  if (n>1) fun(指向下一個元素的指針,從m中,取n-1個)

  else 完成一種排列

  }

  }

  根據(jù)以上算法分析可以得出程序。

  參考答案:

  #include

  int a[10];

  fun( int *p, int m, int n ) /* 從m個元素中取n個存入數(shù)組p中 */

  { int i; /* 用數(shù)0~m-1表示m個不同的元素 */

  for( i=0;i

  { *p = i;

  if( n > 1 ) fun( p+1, m, n-1);

  else print(p);

  }

  }

  print( int *p )

  { int *q;

  for( q=a;q<=p;q++ ) /* 輸出結(jié)果,將整數(shù)轉(zhuǎn)換為字母a起始的序列 */

  printf("%c", 'a'+ *q);

  printf("\t");

  }

  main( )

  { int m, n;

  printf("\nEnter m n:");

  scanf("%d%d", &m, &n);

  fun( a, m, n);

  }

  【4.92】參考答案:

  smmt ( char s[ ] ) /* 指針s指向字符串的第一個字符 */

  { char *p;

  p=s;

  while(*p!='\0') p++;

  p--; /* 指針p指向字符串的最后一個字符 */

  if(p==s) return(1); /* 兩個指針指向同一個字符表示字符串對稱 */

  else

  { if(*s!=*p)

  return(0); /* 兩個指針指向字符不等表示字符串不對稱 */

  else

  { *p='\0';

  smmt(s+1); /* 取掉首尾比較過的字符繼續(xù)比較 */

  }

  }

  }

  【4.93】參考答案:

  #include

  int n, r, flag; /* flag:標志,=0:表示要另起一行 */

  main( )

  { int s;

  printf("Enter N,R:");

  scanf("%d%d", &n, &r);

  printf("combinations:\n");

  flag=1;

  combination (1,r);

  }

  combination ( s, j )

  int s, j; /* 從s開始選j個元素 */

  { int i,k;

  for( i=s;i<=n-j+1;i++ )

  { if( flag )

  for( k=0;k

  printf("%3d ", i);

  flag=0;

  if(j>1) combination ( i+1, j-1 );

  else { putchar('\n'); flag=1; }

  }

  }

  【4.94】分析:此題給出的參考答案使用了指針和函數(shù)遞歸的概念。讀者在學習完指針的概念后再研究此題。放于此處主要是便于和其它排序方法比較。

  合并排序法排序的步驟是:第一次將數(shù)組中相鄰的2個數(shù)兩兩排序,第二遍4個4個地排序,第三遍8個8個地排序...... 。程序中的合并排序函數(shù)(mergesort)采用了遞歸調(diào)用。例如有一組數(shù)是:4,3,1,81,45,8,0,4,-9,26,7,4,2,9,1,-1

  采用合并排序法的過程如下:

  未排序時 4 3 1 81 45 8 0 4 -9 26 7 4 2 9 1 -1

  第一遍后 3 4 1 81 8 45 0 4 -9 26 4 7 2 9 -1 1

  第二遍后 1 3 4 81 0 4 8 45 -9 4 7 26 -1 1 2 9

  第三遍后 0 1 3 4 4 8 45 81 -9 -1 1 2 4 7 9 26

  第四遍后 -9 -1 0 1 1 2 3 4 4 4 7 8 9 26 45 81

  參考答案:

  #define N 16

  #include "stdio.h"

  merge(a,b,c,m) /* 數(shù)組合并函數(shù):將長度為m的*/

  int a[],b[],c[],m; /* 數(shù)組a、b合并到c */

  { int i=0,j=0,k=0;

  while(i

  if(a[i]>b[j])

  c[k++]=b[j++]; /* 將a[i]、*b[j]中的小 */

  else c[k++]=a[i++]; /* 者存入c[k] */

  while(i

  while(j

  }

  mergesort(w,n) /* 數(shù)組排序函數(shù): 對長度為n */

  int w[],n; /* 的數(shù)組w排序 */

  { int i,t,ra[N];

  for(i=1;i

  if(i==n)

  { if(n>2) /* 遞歸調(diào)用結(jié)束條件 */

  { mergesort (w,n/2); /* 將數(shù)組w一分為二,遞歸調(diào) */

  mergesort (w+n/2,n/2); /* 用mergesort */

  merge( w,w+n/2,ra,n/2 ); /* 將排序后的兩數(shù)組重新合并 */

  for(i=0;i

  w[i]=ra[i];

  } else if(*w>*(w+1))

  { t=*w; *w=*(w+1); *(w+1)=t;

  } }

  else printf("Error:size of array is not a power of 2/n");

  }

  main( )

  { int i;

  static int key[N]={4,3,1,81,45,8,0,4,-9,26,7,4,2,9,1,-1};

  mergesort(key,N);

  for(i=0;i

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

  printf("\n");

  }

  【4.95】參考答案:

  #include "stdio.h"

  main( )

  { char s[21],*p,*q;

  gets(s);

  p=s;

  q=s;

  while(*q!='\0') q++;

  q-=2;

  while(p

  if(*p++ != *q--) /* 指針p、q同時向中間移動,比較對稱的兩個字符 */

  { printf("NO\n");

  break;

  }

  if(p>=q)

  printf("YES\n");

  }

  【4.96】參考答案:

  strcut(s,m,k)

  char s[ ];

  int m,k;

  { char *p;

  int i;

  p=s+m; /* 指針p指向要被刪除的字符 */

  while((*p=*(p+k))!='\0') /* p+k指向要前移的字符 */

  p++;

  }

  【4.97】參考答案:

  strchg(s)

  char *s;

  { char c,*p;

  p=s;

  while(*p!='\0') p++;

  p--;

  while(s

  { c=*s;

  *s++=*p;

  *p--=c;

  }

  }

  【4.98】參考答案:

  insert(s1,s2,ch)

  char s1[],s2[],ch;

  { char *p,*q;

  p=s1;

  while(*p++!=ch) ;

  while(*s2!='\0')

  { q=p;

  while(*q!='\0') q++;

  while(q>=p)

  *(q+1)=*q--;

  *++q=*s2++;

  p++;

  }

  }

  【4.99】參考答案:

  strcnb(s1,s2)

  char s1[],s2[];

  { char *p;

  int i=1;

  p=s1;

  while(*p!='\0') p++;

  while((*p++=*s2++)!='\0') ; /* 將s2接于s1后面 */

  p=s1;

  while(*p!='\0') /* 掃描整個字符串 */

  { if(*p==' ') /* 當前字符是空格進行移位 */

  { while(*(p+i)==' ') i++; /* 尋找當前字符后面的第一個非空格 */

  if(*(p+i)!='\0')

  { *p=*(p+i); /* 將非空格移于當前字符處 */

  *(p+i)=' '; /* 被移字符處換為空格 */

  }

  else break; /* 尋找非空格時到字符串尾,移位過程結(jié)束 */

  }

  p++;

  }

  }

  【4.100】參考答案:

  #include "stdio.h"

  struct strnum

  { int i;

  char ch;

  }

  main( )

  { char c;

  int i=0,k=0;

  struct strnum s[100]={0,NULL};

  while((c=getchar())!='\n')

  { for(i=0;s[i].i!=0;i++)

  { if(c==s[i].ch)

  { s[i].i++;

  break;

  }

  }

  if(s[i].i==0)

  { s[k].ch=c;

  s[k++].i=1;

  }

  }

  i=0;

  while(s[i].i>0)

  { printf("%c=%d ",s[i].ch,s[i].i);

  i++;

  }

  }

  【4.101】分析:程序中函數(shù)cmult的形式參數(shù)是結(jié)構(gòu)類型,函數(shù)cmult的返回值也是結(jié)構(gòu)類型。在運行時,實參za和zb為兩個結(jié)構(gòu)變量,實參與形參結(jié)合時,將實參結(jié)構(gòu)的值傳遞給形參結(jié)構(gòu),在函數(shù)計算完畢之后,結(jié)果存在結(jié)構(gòu)變量w中,main函數(shù)中將cmult返回的結(jié)構(gòu)變量w的值存入到結(jié)構(gòu)變量z中。這樣通過函數(shù)間結(jié)構(gòu)變量的傳遞和函數(shù)返回結(jié)構(gòu)型的計算結(jié)果完成了兩個復(fù)數(shù)相乘的操作。

  參考答案:

  #include "stdio.h"

  struct complx

  { int real; /* real為復(fù)數(shù)的實部 */

  int im; /* im為復(fù)數(shù)的虛部 */

  };

  main( )

  { static struct complx za = {3,4} /* 說明結(jié)構(gòu)靜態(tài)變量并初始化 */

  static struct complx zb = {5,6};

  struct complx x, y, z;

  struct complx cmult();/* 說明函數(shù)cmult的返回值類型是結(jié)構(gòu)complx型 */

  void cpr( );

  z=cmult(za, zb); /* 以結(jié)構(gòu)變量調(diào)用cmult函數(shù),返回值賦給結(jié)構(gòu)變量z */

  cpr (za, zb, z); /* 以結(jié)構(gòu)變量調(diào)用cpr函數(shù),輸出計算結(jié)果 */

  x.real = 10; x.im = 20;

  y.real = 30; y.im = 40; /* 下一組數(shù)據(jù) */

  z = cmult (x, y);

  cpr (x, y, z);

  }

  struct complx cmult(za, zb) /* 計算復(fù)數(shù)za×zb,函數(shù)的返回值為結(jié)構(gòu)類型 */

  struct complx za, zb; /* 形式參數(shù)為結(jié)構(gòu)類型 */

  { struct complx w;

  w.real = za.real * zb.real - za.im * zb.im;

  w.im = za.real * zb.im + za.im * zb.real;

  return (w); /* 返回計算結(jié)果,返回值的類型為結(jié)構(gòu) */

  }

  void cpr (za,zb,z) /* 輸出復(fù)數(shù)za×zb=z */

  struct complx za, zb, z; /* 形式參數(shù)為結(jié)構(gòu)類型 */

  { printf ("(%d+%di)*(%d+%di)=", za.real, za.im, zb.real, zb.im);

  printf ("(%d+%di)\n", z.real, z.im);

  }

  【4.102】參考答案一:

  /*這份代碼經(jīng)源碼格式軟件格式化過

  yang_hx@neusoft.com */

  #include "stdio.h"

  struct student

  {

  int n ;

  int mk ;

  }

  ;

  main()

  {

  int i,j,k,count=0,no ;

  struct student stu[100],*s[100],*p ;

  printf("\nPlease enter mark(if mark<0 is end)\n");

  for(i=0;i<100;i++)

  {

  printf("No.%04d==",i+1);

  scanf("%d",&stu[i].mk);

  s[i]=&stu[i];

  stu[i].n=i+1 ;

  if(stu[i].mk<=0)break ;

  for(j=0;j

  for(k=j+1;k<=i;k++)

  if(s[j]->mkmk)

  {

  p=s[j];

  s[j]=s[k];

  s[k]=p ;

  }

  }

  for(no=1,count=1,j=0;j

  {

  if(s[j]->mk>s[j+1]->mk)

  {

  printf("\nNo.%3d==%4d%4d : ",no,s[j]->mk,count);

  for(k=j-count+1;k<=j;k++)

  {

  printf("%03d ",s[k]->n);

  if((k-(j-count))%10==0&&k!=j)

  printf("\n ");

  }

  count=1 ;

  no++;

  }

  else count++;

  }

  }參考答案二:

  /*這份代碼經(jīng)源碼格式軟件格式化過

  yang_hx@neusoft.com */

  #include "stdio.h"

  #define N 5

  struct student

  {

  int number ;

  int score ;

  int rank ;

  int no ;

  }

  stu[N];

  main()

  {

  int i,j,k,count,rank,score ;

  struct student temp ;

  for(i=1;i<=N;i++)

  {

  printf("Enter N.o %d=",i);

  scanf("%d%d",&temp.number,&temp.score);

  for(j=i-1;j>0;j--)

  if(stu[j-1].score

  stu[j]=stu[j-1];

  else break ;

  stu[j]=temp ;

  }

  stu[0].rank=1 ;

  count=1 ;

  k=0 ;

  for(i=0;i

  {

  score=stu[i].score ;

  rank=stu[i].rank ;

  if(stu[i+1].score==stu[i].score)

  {

  stu[i+1].rank=stu[i].rank ;

  count++;

  }

  else

  {

  for(j=0;j

  stu[k+j].no=count-j ;

  stu[i+1].rank=stu[i].rank+1 ;

  count=1 ;

  k=i+1 ;

  }

  if(i==N-2)

  for(j=0;j

  stu[k+j].no=count-j ;

  }

  for(i=0;i

  {

  rank=stu[i].rank ;

  count=stu[i].no ;

  printf("\n%3d (%3d)-%d: ",rank,stu[i].score,count);

  for(k=1;k<=count;k++)

  if((k-1)%3!=0)

  printf("%d ",stu[i+k-1].number);

  else printf("\n %d ",stu[i+k-1].number);

  i+=count-1 ;

  }

  }【4.103】參考答案:

  /*這份代碼經(jīng)源碼格式軟件格式化過

  yang_hx@neusoft.com */

  #include "stdio.h"

  struct time

  {

  int hour ;

  int minute ;

  int second ;

  }

  ;

  main()

  {

  struct time now ;

  printf("Please enter now time(HH,MM,SS)=\n");

  scanf("%d,%d,%d",&now.hour,&now.minute,&now.second);

  now.second++;

  if(now.second==60)

  {

  now.second=0 ;

  now.minute++;

  }

  if(now.minute==60)

  {

  now.minute=0 ;

  now.hour++;

  }

  if(now.hour==24)

  now.hour=0 ;

  printf("\nNow is %02d:%02d:%02d",now.hour,now.minute,now.second);

  }【4.104】參考答案:

  /*這份代碼經(jīng)源碼格式軟件格式化過

  yang_hx@neusoft.com */

  #include

  #define SIZE 3

  /* 定義結(jié)構(gòu) */

  struct student

  {

  long num ;

  char name[10];

  int age ;

  char address[10];

  }

  stu[SIZE],out ;

  void fsave()

  {

  FILE*fp ;

  int i ;

  /* 以二進制寫方式打開文件 */

  if((fp=fopen("student","wb"))==NULL)

  {

  printf("Cannot open file.\n");

  /* 打開文件的出錯處理 */

  exit(1);

  /* 出錯后返回,停止運行 */

  }

  /* 將學生的信息(結(jié)構(gòu))以數(shù)據(jù)塊形式寫入文件 */

  for(i=0;i

  printf("File write error.\n");

  /* 寫過程中的出錯處理 */

  fclose(fp);

  /* 關(guān)閉文件 */

  }

  main()

  {

  FILE*fp ;

  int i ;

  /* 從鍵盤讀入學生的信息(結(jié)構(gòu)) */

  for(i=0;i

  {

  printf("Input student %d:",i+1);

  scanf("%ld%s%d%s",

  &stu[i].num,stu[i].name,&stu[i].age,stu[i].address);

  }

  fsave();

  /* 調(diào)用函數(shù)保存學生信息 */

  fp=fopen("student","rb");

  /* 以二進制讀方式打開數(shù)據(jù)文件 */

  printf(" No. Name Age Address\n");

  /* 以讀數(shù)據(jù)塊方式讀入信息 */

  while(fread(&out,sizeof(out),1,fp))printf("%8ld %-10s %4d %-10s\n",

  out.num,out.name,out.age,out.address);

  fclose(fp);

  /* 關(guān)閉文件 */

  getch();

  }【4.105】參考答案:

  /*這份代碼經(jīng)源碼格式軟件格式化過

  yang_hx@neusoft.com */

  #include

  main()

  {

  FILE*fp ;

  char str[100],filename[15];

  int i ;

  if((fp=fopen("test","w"))==NULL)

  {

  printf("Cannot open the file.\n");

  exit(0);

  }

  printf("Input a string:");

  gets(str);

  /* 讀入一行字符串 */

  /* 處理該行中的每一個字符 */

  for(i=0;str[i]&&i<100;i++)

  {

  /* 若是小寫字母 */

  if(str[i]>='a'&&str[i]<='z')str[i]-='a'-'A' ;

  /* 將小寫字母轉(zhuǎn)換為大寫字母 */

  fputc(str[i],fp);

  /* 將轉(zhuǎn)換后的字符寫入文件 */

  }

  fclose(fp);

  /* 關(guān)閉文件 */

  fp=fopen("test","r");

  /* 以讀方式打開文本文件 */

  fgets(str,100,fp);

  /* 從文件中讀入一行字符串 */

  printf("%s\n",str);

  fclose(fp);

  getch();

  }【4.106】參考答案:

  /*這份代碼經(jīng)源碼格式軟件格式化過

  yang_hx@neusoft.com */

  /*這份代碼經(jīng)源碼格式軟件格式化過

  yang_hx@neusoft.com */

  #include "stdio.h"

  FILE*fp ;

  void main()

  {

  int c,d ;

  if((fp=fopen("d:\\tc\\test8.c","r"))==NULL)

  exit(0);

  while((c=fgetc(fp))!=EOF)

  /* 如果是字符注釋的起始字符'/' */

  /* 則判斷下一個字符是否為'*' */

  if(c=='/')if((d=fgetc(fp))=='*')in_comment();

  /* 調(diào)用函數(shù)處理(刪除)注釋 */

  /* 否則原樣輸出讀入的兩個字符 */

  else

  {

  putchar(c);

  putchar(d);

  }

  else

  /* 判斷是否是字符'或" */

  if(c=='\''||c=='\"')echo_quote(c);

  /* 調(diào)用函數(shù)處理字符'或"包含的字符 */

  else putchar(c);

  }

  in_comment()

  {

  int c,d ;

  c=fgetc(fp);

  d=fgetc(fp);

  while(c!='*'||d!='/')

  {

  /* 連續(xù)的兩個字符不是 * 和 / 則繼續(xù)處理注釋 */

  c=d ;

  d=fgetc(fp);

  }

  }

  echo_quote(c)

  int c ;

  /* c中存放的是定界符'或" */

  {

  int d ;

  putchar(c);

  /* 讀入下一個字符判斷是否是定界符c */

  while((d=fgetc(fp))!=c)

  {

  putchar(c);

  /* 當不是定界符c時繼續(xù)循環(huán) */

  /* 若出現(xiàn)轉(zhuǎn)義字符\ */

  if(d=='\\')putchar(fgetc(fp));

  /* 則下一個字符不論是何均原樣輸出 */

  }

  putchar(d);

  }

首頁 1 2 尾頁
責編:zhangjing0102
九寨沟县| 密云县| 洛扎县| 衡水市| 东明县| 来凤县| 咸宁市| 连城县| 固镇县| 苏尼特右旗| 凌源市| 东丽区| 安阳县| 神农架林区| 和田县| 上高县| 纳雍县| 金华市| 桓台县| 左贡县| 澳门| 曲阳县| 治多县| 襄垣县| 稷山县| 瑞金市| 工布江达县| 乌审旗| 望都县| 高陵县| 襄樊市| 金坛市| 水城县| 孝昌县| 岳西县| 永和县| 襄樊市| 太白县| 鸡东县| 贵溪市| 十堰市|