?
一、選擇題
1.C ????2.A?????3.C ????4.B ???5.D ???6.C ?????7.D
8.C ????9.A ???10.B ???11.C ???12.D ???13.D ???14.C
15.C ???16.D ???17.D ???18.D ???19.B ???20.B ???21.B
22.C ???23.A ???24.A ???25.A ???26.D ???27.D ???28.D ??29.C
?
二、寫出下列程序的運(yùn)行結(jié)果
1. ?3 ?6 ?9 ???????????2.4
3.1,2,3,8,7,6,5,4,9,10, ??????????????4.7 ??0
5.572
三、程序填空
1. (1)?k ??????????????????????????????(2)?-1
2. (1)?i-1
3. (1)?x[i++]或y[i++] ???????????????????(2)i++
4. (1)?‘a(chǎn)’+h-10 ????????????????????????(2)s[i]=?’\0’
5. (1)s[i]!=’\0’??????????????????????????(2)s[j++]=s[i]
6. (1)s[j]!=’\0’&& t[k]!=’\0’????????????????(2)t[k]==’\0’
?
四、編程題(每個(gè)程序的數(shù)據(jù)結(jié)構(gòu)均用數(shù)組)
1.編寫程序:從鍵盤上輸入一個(gè)字符,用折半查找法找出該字符在已排序的字符串a中的位置。若該字符不在a中則輸出**。
#include<stdio.h>
main()
{
char c,a[10]="abcdefghi";
int top,bot,mid;
printf("input c:\n");
scanf("%c",&c);
printf("c=\'%c\'\n",c);
for(top=0,bot=10;top<=bot;)
{
mid=(top+bot)/2;
if(c==a[mid])
{
printf("The position is %d\n",mid+1);
break;
}
else if(c>a[mid]) top=mid+1;
else bot=mid-1;
}
if(top>bot) printf("**\n");
}
?
2.編寫程序:輸出某數(shù)列的前20項(xiàng),該數(shù)列第1、2項(xiàng)分別為0和1,以后每個(gè)奇數(shù)編號(hào)的項(xiàng)是前兩項(xiàng)之和,每個(gè)偶數(shù)編號(hào)的項(xiàng)是前兩項(xiàng)之差的絕對(duì)值。生成的20個(gè)數(shù)存在一維數(shù)組x中,并按每行4項(xiàng)的形式輸出。
#include<stdio.h>
#include<math.h>
main()
{
int x[21],i;
x[1]=0,x[2]=1;
i=3;
do
{
x[i]=x[i-2]+x[i-1];
x[i+1]=fabs((double)(x[i-1]-x[i]));
i=i+2;
}while(i<=20);
for(i=1;i<=20;i++)
{
printf("%6d",x[i]);
if(i%4==0) printf("\n");
}
}
?
3.編寫程序:將s所指字符串中除了下標(biāo)為奇數(shù)、同時(shí)ASCII值也為奇數(shù)的字符之外,其余的所有字符都刪除,串中剩余字符所形成的一個(gè)新串放在t所指的數(shù)組中。
例如:若s所指字符串中的內(nèi)容為:“ABCDEFG12345”,則最后t所指的數(shù)組中的內(nèi)容應(yīng)是:“135”。
#include<stdio.h>
#include<string.h>
void fun(char *s,char t[])
{
int i,j=0;
for(i=1;i<strlen(s);i+=2)
if(s[i]%2!=0)t[j++]=s[i];
t[j]='\0';
}
main()
{
char s[100],t[100];
printf("\nPlease enter string s:");
scanf("%s",s);
fun(s,t);
printf("\nThe result is:%s\n",t);
}
?
4.編寫程序:一個(gè)自然數(shù)平方的末幾位與該數(shù)相同時(shí),稱此數(shù)為自同構(gòu)數(shù)。例如,因252=625,故25為自同構(gòu)數(shù)。求出[1,700]之間的:① 最大的自同構(gòu)數(shù);② 自同構(gòu)數(shù)數(shù)目。
(1)最大的自同構(gòu)數(shù):625 ?(2)自同構(gòu)數(shù)數(shù)目:7個(gè)(1、5、6、25、76、376、625)
#include<stdio.h>
main()
{
int i,n,ns,flag,count,r,rs;
static int a[50];
count=0;
for(i=1;i<700;i++)
{
n=i;
ns=i*i;flag=1;
while(n>0&&flag)
{
r=n%10;n=n/10;
rs=ns%10;ns=ns/10;
if(rs!=r) flag=0;
}
if(flag)
{
a[count]=i;count++;
printf("%5d",i);
}
}
printf("\ncount=%d,max=%d\n",count,a[count-1]);
}
?
5.已知:
f(0)?=?f(1)?=?1
f(2)?=?0
f(n)?=?f(n?-?1) -?2*f(n?-?2)?+?f(n?-?3) ?????(n>2)
編寫程序:求f(0)~f(50)中的最大值。
f(0)到f(50)中的最大值:598325
#include<stdio.h>
main()
{
int n;
double f[181],max=0;
f[0]=f[1]=1;f[2]=0;
for(n=3;n<=50;n++)
{
f[n]=f[n-1]-2*f[n-2]+f[n-3];
if(max<f[n]) max=f[n];
}
printf("\n max=%.0lf",max);
}
?
6.編寫程序:自然數(shù)1~1000按順時(shí)針圍成一圈,首先取出1,然后順時(shí)針?lè)较虬床介L(zhǎng)L?=?50取數(shù)(已取出的數(shù)不再參加計(jì)數(shù)),直至所有的數(shù)均取完為止,最后一個(gè)取出的數(shù)是多少?
最后一個(gè)取出的數(shù)是:630
#include<stdio.h>
main()
{
int a[1001],i,s=0,n=1;
for(i=1;i<=1000;i++) a[i]=i;
a[1]=0;
for(i=1;i<=1000;i++)
{
if(a[i]!=0)
{
s+=1;
if(s==50)
{
n++;
if(n==1000)
{
printf("\n a[%d]=%d",i,a[i]);
break;
}
a[i]=0;s=0;
}
}
if(i==1000) i=0;
}
}
?
7.編寫程序:輸出下列格式的楊輝三角形前5行。
1
1 ?1
1 ?2 ?1
1 ?3 ?3 ?1
1 ?4??6 ?4 ?1
#include<stdio.h>
main()
{
int a[10][10],i,j,t,k;
printf("input lines <10:\n");
scanf("%d",&t);
for(i=0;i<t;i++)
{ ??
for(j=0;j<t-i;j++)
{
????printf(" ??");
}
for(j=0;j<=i;j++)
{
????if((i==j)||(j==0)) a[i][j]=1;
else a[i][j]=a[i-1][j-1]+a[i-1][j];
printf("%6d",a[i][j]);
}
printf("\n");
}
}
?
8.若兩素?cái)?shù)之差為2,則稱該兩素?cái)?shù)為雙胞胎數(shù)。編寫程序,求出[2,300]之內(nèi):
(1)有多少對(duì)雙胞胎數(shù);
(2)最大的一對(duì)雙胞胎數(shù)。?
(1)最大的一對(duì)雙胞胎數(shù):281、283 ?(2)有19對(duì)雙胞胎
#include<stdio.h>
int sushu(int n)
{
int flag=1,i;
for(i=2;i<=n/2;i++)
if(n%i==0){flag=0;break;}
return(flag);
}
main()
{
int i,b,max1=0,max2=0,count=0;
for(i=2;i<300;i++)
{
if(sushu(i))
{
b=i+2;
if(sushu(b))
{ ??
if(i>max1)
{max1=i;max2=b;}
count++;
}
}
}
printf("count=%d\nmax1=%4d,max2=%4d\n",count,max1,max2);
}
?
9.編寫程序:將兩個(gè)遞增的數(shù)組a[10] = {2,?4,?6,?8,?10,?12,?14,?16,?18,?20}和b[10]?=?{1,?3,?5,?7,?9,?11,?13, 15,?17,?19}合并成一個(gè)數(shù)組c[20],并保持遞增的順序。
#include<stdio.h>
#define N 10
#define NN 20
main()
{
int a[N]={2,4,6,8,10,12,14,16,18,20},b[N]={1,3,5,7,9,11,13,15,17,19},
c[NN];
int i,j,t,k;
i=0;j=0;t=0;
do
{
if(a[i]<b[j])
{c[t]=a[i];i++;t++;}
else {c[t]=b[j];j++;t++;}
}while(i<N&&j<N);
if(i<N)
for(k=i;k<N;k++)
{c[t]=a[k];t++;}
if(j<N)
for(k=j;k<N;k++)
{c[t]=b[k];t++;}
{for(j=0;j<NN;j++)
printf("%4d",c[j]);
}
}
?
10.請(qǐng)編寫程序:建立一個(gè)N×N的矩陣(N<10)。矩陣元素的構(gòu)成規(guī)律是:最外層元素的值全部為1;從外向內(nèi)第2層元素的值全部為2;第3層元素的值全部為3,……依次類推。例如,當(dāng)N?= 5,生成的矩陣為:
#include<stdio.h>
#define N 7
void fun(int (*a)[N])
{
int i,j,k,m;
if(N%2==0)m=N/2;
else m=N/2+1;
for(i=0;i<m;i++)
{
for(j=i;j<N-i;j++)
a[i][j]=a[N-i-1][j]=i+1;
for(k=i+1;k<N-i;k++)
a[k][i]=a[k][N-i-1]=i+1;
}
}
main()
{
int x[N][N]={0},i,j;
fun(x);
printf("\nThe result is:\n");
for(i=0;i<N;i++)
{for(j=0;j<N;j++)
printf("%3d",x[i][j]);
printf("\n");
}
}
?
一、選擇題
1.D ????2.C ????3.A ????4.D ???5.A ????6.D ?????
7.C ????8.B ????9.D ???10.C ??11.D ???12.A ??
二、寫出下列程序的運(yùn)行結(jié)果
1.s=30 ?
t=-10 ?
m=200 ??????????
2.2 ?2 ?2 ?2 ?1 ???????3.51 ?????????????4.a(chǎn)bcdeedcba
5.31 ??????????????????6. 1bc,a23 ????????7. 50
三、程序填空
1. ①?*p2=*p1???????②p1++ ??????③p2++(注意:第二空和第三空的答案可以調(diào)換位置)
2. ①?*p&&*q或*p!='\0'&&*q!='\0'或*p!=0&&*q!=0????②*p>*q 或?*p>=*q ???③q++
3. ①q=&s[k]
4. ①s1[m1-1+k]?????②sub
5.?①return ?min????②min=minnum(a,N)
6. ①?avg=avg/n?????②a
7. ①sp ????????????②k ??????③<0 ??④?printf(“%s\n”,str[k]) 或puts(str[k]) ?
8. ①48或'0'???????②?ctod(b)
9.?①n<0或n<=0?????②n%8 ?????③*(s+i-1)或s[i-1]
10. ①a[i][j]???????②j ????????③find==1
11. ①char *name[]??②?strcmp(name[k],name[j])>0 ????③??name[i]
?
四、編程題
1.(1)定義一個(gè)函數(shù)separate(int *data,int n),該函數(shù)將n的各個(gè)位上的數(shù)分離保存在data所指向的數(shù)組中。
(2)定義一個(gè)函數(shù)judge(int *data,int len),判斷data所指向的數(shù)組是否為回文。
(3)在main函數(shù)中調(diào)用上述函數(shù),完成程序的功能。
參考代碼:
#include "stdio.h"
#include "stdlib.h"
#define N 10
int separate(int *data,int n)
{
??int i,k=0,temp;
????while(n>0)
{ ?
??data[k]=n%10;
??n=n/10;
??k++;
?
}
for(i=0;i<=k/2;i++)
{
temp=data[i];
data[i]=data[k-1-i];
data[k-1-i]=temp;
}
return k;
}
int judge(int *data,int len)
{
int i,j;
i=0;j=len-1;
????while(i<j)
{
if(data[i]==data[j])
{i++;j--;}
else
return 0;
}
return 1;
}
?
void main()
{
??int data[N],n,len;
??printf("請(qǐng)輸入要轉(zhuǎn)換的數(shù)n:\n");
??scanf("%d",&n);
??len=separate(data,n);
??if(judge(data,len)==1)
??printf("%d是回文數(shù)\n",n);
??else
??printf("%d不是回文數(shù)\n",n);
??
}
?
2.從鍵盤輸入兩個(gè)字符串,輸出第一個(gè)字符串在第二個(gè)字符串中第一次出現(xiàn)的位置(即第一個(gè)字符串的首字母在第二個(gè)字符串中的位置,如“abc”在“bbacccabcddaw3”中的位置為7)。
要求:使用指針的方法遍歷數(shù)組。
參考代碼:
#include<stdio.h>
int find(char *s,char *t);
main()
{ ?
int n;
char a[]="apbcdabfabcx";
char b[]="ab";
????n=find(a,b);
if(n!=-1)
???printf("%d\n",n);
else
printf("未找到!");
}
int ?find(char *s,char *t)
{ ?
char *p,*q,*r;
int len,Loc=1;
while(*s)
{
p=s;r=t;
while(*r)
if(*p==*r)
{
p++;r++;
}
else
break;
if(*r=='\0') return Loc;
s++;Loc=Loc+1;
}
return ?-1;
}
?
3.有n個(gè)人圍成一圈,順序排號(hào)。從第一個(gè)人開始報(bào)數(shù)(從1~3報(bào)數(shù)),報(bào)到3的人退出圈子,問(wèn)最后留下的是原來(lái)第幾號(hào)的人。
參考代碼:
#include "stdio.h"
#define N 20 ????????????/*總?cè)藬?shù)*/
void main()
{
int i,a[N],num,dist;
num=0;
for(i=0;i<N;i++) a[i]=1;
i=0;dist=0;
????while(num<N)
{
????????if(a[i]==1) dist++;
if(dist==3)
{printf("%d\n",i);
a[i]=0;
dist=0;
num++;
}
i=(i+1)%N;
}
printf("最后留下的人是:%d號(hào)\n",i);
}
?
4.編寫一個(gè)程序,實(shí)現(xiàn)兩個(gè)順序字符串(ASC碼值由小到大)的連接,連接后的字符串仍為順序串。如字符串1為“aty”,字符串2為“eknx”,連接后的字符串為“aekntxy”。
?參考代碼:
#include "stdio.h"
void fun(char *s,char *t,char str[]) /*串s和t按ascii碼順序連接存入str中*/
{
?int k=0;
?while(*s&&*t)
?{
?if(*s<*t) str[k++]=*s++;?
?else ?str[k++]=*t++;
?}
?while(*s) str[k++]=*s++;/*把串s剩余字符存入str中*/
?while(*t) str[k++]=*t++;/*把串t剩余字符存入str中*/
?str[k]='\0';
}
?
void main()
{
char s[20],t[20],str[40];
printf("請(qǐng)輸入字符串s和t\n");
scanf("%s%s",s,t);
fun(s,t,str);
printf("%s\n",str);
}
?
5.輸入一行文字,找出其中大寫字母、小寫字母、空格、數(shù)字及其他字符各有多少?
參考代碼:
#include "stdio.h"
void main()
{
char str[40],*p,n1=0,n2=0,n3=0,n4=0,n5=0;
gets(str);
p=str;
????while(*p)
{
if(*p>='A'&&*p<='Z')n1++;
else if(*p>='a'&&*p<='z') ??n2++; ?
else if(*p>='0'&&*p<='9') ??n3++;
else if(*p==' ') ??n4++;
else ?n5++;
p++;
}
printf("大寫字母:%d 小寫字母:%d
數(shù)字:%d 空格:%d 其它:%d\n",n1,n2,n3,n4,n5);
}
?
6.輸入一個(gè)字符串,內(nèi)有數(shù)字和非數(shù)字字符,如:a123x456=4567?45at587,將其中連續(xù)的數(shù)字作為一個(gè)整數(shù),依次存放到數(shù)組a中。例如,123存放在a[0],456存放在a[1],…,統(tǒng)計(jì)共有多少個(gè)整數(shù),并輸出這些數(shù)。
參考代碼:
#include "stdio.h"
#define N 10
void main()
{
char str[40],*p;
int k,i,a[N]; ???
gets(str);
p=str;
k=0; ????????/*k保存字符串中數(shù)的個(gè)數(shù)*/
for(;*p!='\0';p++)
if(*p>='0'&&*p<='9') ??/*計(jì)算連續(xù)的數(shù)字,遇到非數(shù)字結(jié)束計(jì)算,并將該數(shù)保存*/
{
a[k]=*p-'0';
p++;
while(*p>='0'&&*p<='9')
{
a[k]=a[k]*10+(*p-'0');
p++;
}
k++;
}
for(i=0;i<k;i++)
printf("%d \n",a[i]);
}