今天,我在青海民族大学上大二的一个月即将结束。马上就是国庆节了,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即为相应字母的下标值,相应下标值的数组元素的值增加1。b[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])
最大值小于被比较数时,把被比较数的下标值赋给max,max中存放的总是当前最大值。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。然后依次取出字符串的每个字符进行判断,使对应数组b加1。Max初始值为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本书,一本已经买过了,但没时间看,正在纠结还买不买。。。。
¥ 81.79
为您节省:
¥ 46.21 (36%)