关于博客的用处

今天,我在青海民族大学上大二的一个月即将结束。马上就是国庆节了,9.20刚考完了计算机二级的考试,虽然操作题做得很糟糕也许过不了,但也暴露了我一些学习上的问题。

我大概用了一个月重新学习了一下C语言,主要是把教材(谭浩强)大概过了一遍,不过还缺少“用户建立数据类型,对文件的输入输出,常见错误分析”的学习和研究。考前的前一个礼拜把选择题过了一遍,大题只做了30道。整理了有大概20几种类型题,可是考试抽的题完全没在我的掌控之中。。。先上我的大题,顺便我重新做一次。

1、程序填空

围绕山顶一圈有N个山洞,编号为0、1、2、3、……、N-1,有一只狐狸和一只兔子在洞中居住。狐狸总想找到兔子并吃掉它,它的寻找方法是先到第一个洞(即编号为0的洞)中找;再隔1个洞,即到编号为2的个洞中找;再隔2个洞,即到编号为5的洞中找;下次再隔3个洞;即到编号为9的洞中找;……。若狐狸找一圈,请为兔子指出所有不安全的洞号。程序中用a数组元素模拟一个洞,数组元素的下标即为洞号,数组元素中的值为0时,表示该洞安全,为1时表示该洞不安全。若形参n的值为30时,不安全的洞号是0、2、5、9、14、20、27。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

 

#include  <stdio.h>

#define  N    100

void fun( int *a , int  n )

{ int  i, t;

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

/**********found**********/

     a[i]=___1___;                        //与下面的while语句对照,不安全洞赋值0,全体洞赋值0,所以应该填0

  i=0; 

/**********found**********/

  ___2___=1;                             //这里给一个变量赋值1,i,a[i],在前两句已经赋值过了,而t却没有赋值,而且题目里“先到第一个洞(即编号为0的洞)中找;再隔1个洞,即到                                                       编号为2的个洞中找;再隔2个洞,即到编号为5的洞中找;下次再隔3个洞;即到编号为9的洞中找;……。”的说法,所以填1;

   while(i<n )

  {  a[i]= 1;                                     //第一个洞为不安全的洞 a[0]=1;

     t++;

/**********found**********/

     i=___3___;                             //为得到接下来不安全洞用了while循环,第一次隔一个,以后累加(t++)实现,i=i+t;

   }

}

main()

{ int  a[N], i, n=30;

  fun( a, n);

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

    if( a[i]==1 )  printf("不安全的洞号是:   %d\n",i );

}

 

 

2、程序改错

给定程序MODI1.C中规定输入的字符串全部为字母,fun函数的功能是:统计a所指字符串中每个字母在字符串中出现的次数(统计时不区分大小写),并将出现次数最高的字母输出(如果有多个相同,输出一个即可)。

    例如对于字符串:dadbcdbabdb,对应的输出应为:b或d。

    请改正函数fun中指定部位的错误,使它能得出正确的结果。

 

#include<stdio.h>

#include <stdio.h>

#include <string.h>

void fun(char  a[])

{ int  b[26], i, n,max;

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

/**********found**********/

 a[i] = 0;                                                       

数组a存放的是字符串,数组b为整型数组存放的是每个字符的个数,应将数组b每个元素初始化为0。 b[i]=0;

   n=strlen(a);

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

     if (a[i] >='a' && a[i]<='z')

/**********found**********/

        b[a[i] - 'A']++;

小写字母的ASCII码减去'a'ASCII即为相应字母的下标值,相应下标值的数组元素的值增加1b[a[i] - 'a']++; 

  else  if (a[i] >='A' &&a[i]<='Z')

        b[a[i] -'A']++;

   max= 0;

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

/**********found**********/

    if (b[max] > b[i])

最大值小于被比较数时,把被比较数的下标值赋给maxmax中存放的总是当前最大值。if (b[max] < b[i]);


      max=i;

  printf("出现次数最多的字符是 :  %c\n", max + 'a');

}

main( )

{ char  a[200];

  printf("请输入一个待统计的字符串 :   ");   scanf("%s", a);

  fun(a);

}

 

【解题思路】

    要统计字符串中每个字符在这个字符串中出现的次数,可以设数组b中存放每个字符出现的次数b[0]存放字符a的次数,b[1]存放字符b的次数……。统计之前为数组b各元素赋初值为0。然后依次取出字符串的每个字符进行判断,使对应数组b1Max初始值为0,与数组b中的每个元素进行比较,如果小于,就把下标进行交换。

 

3、程序设计

请编函数fun,其功能是将一个数字字符串转换成与其面值相同的长整型整数。可调用strlen函数求字符串的长度。例如:在键盘输入字符串2345210,函数返回长整型数2345210。

#include  <stdio.h>

#include  <string.h>

void NONO();

long fun( char  *s )

{

  int i,sum=0,len;

 len=strlen(s);

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

 {

         sum=sum*10+*s-48;

         s++;

 }

return sum;

 

}

main()

{ char  s[10];    long r;

  printf("请输入一个长度不超过9个字符的数字字符串 :  ");  gets(s);

   r= fun( s );

  printf(" r = %ld\n" , r );

  NONO();

}

 

void NONO()

{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */

 FILE *fp, *wf ;

  inti;  long r;

 char s[10], *p;

fp =fopen("in.dat","r") ;

  wf= fopen("out.dat","w") ;

 for(i = 0 ; i < 10 ; i++) {

   fgets(s, 10, fp);

    p= strchr(s, '\n');

   if (p) *p = 0;

    r= fun(s);

   fprintf(wf, "%ld\n", r);

  }

 fclose(fp) ;

 fclose(wf)

【解题思路】

要把一个数字字符转为相应的数字,只要用它的ASCII码减去48即可。要把数字字符串转为相应的数字,则要从左到右依次取出字符转为相应数字,乘10再加上下一位数字。

 



 弄完这三道题并理解还是有些难度的,我在亚马逊看了4本书,一本已经买过了,但没时间看,正在纠结还买不买。。。。

C和指针 Pointers On C

¥ 41.60

为您节省: 
¥ 23.40 (36%)

C陷阱与缺陷

¥ 21.20

为您节省: 
¥ 8.80 (29%)

C Primer Plus(中文版)(第5版)

¥ 41.40

为您节省: 
¥ 18.60 (31%)

C++ Primer(中文版)(第5版)

¥ 81.79

为您节省: 
¥ 46.21 (36%)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值