C语言程序设计实例教程(第三版)练习题答案3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
练习3
1.在C语言中,引用数组元素时,其允许的数组元素下标的数据类型是(C)。
A、实型常量
B、字符型常量
C、整型常量或整型表达式
D、任何类型的表达式解析:C语言中数组元素下标所引用的是整型常量或整型表达式,答案选C;
2.以下对一维整型数组a的正确说明形式是(D)。
A、int arry(10) ;
B、int n=10;
int arry[n]; C、int n;
scanf("%d",&n);
int arry[n];
D、#define N 10
int a[N];
解析:本题主要考察数组定义语法要求,数组定义时下标不能使用变量,只能使用常量,数组定义时下标使用中括号表示,故答案选D;
3.若有定义:int a[10],则对数组a元素的正确引用形式是(D)。
A、a[10]
B、a[4.5]
C、a(0)
D、a[10-10]
解析:本题考察数组元素的引用语法,使用中括号表示下标,数组元素使用整数或整型变量表示,且下标数值表示范围在0至9,故答案选择D;
4.以下不能对一维数组a进行正确初始化的语句是(D)。
A、int a[5]={1,2,3,4,5};
B、int a[5]={1,2,3} ;
C、int a[] = {1,2,3,4,5} ;
D、int a[5]={1,2,3,4,5,6} ;
解析:一维数组的初始化时,数值的个数不能超过所定义的数组元素的个数;对于选项D定义的元素个数是5个,但是初始化赋值的个数为6个,故不能正确为数组元素赋值,本题答案选择D;
5.以下对二维数组a的正确说明形式是(C)。
A、int a[5][ ];
B、float a[][3];
C、long a[5][3];
D、float a(3)(5);
解析:声明数组未初始化时不能省略行数和列数,故答案A和B都是错误的,而D答案定义数组时下标使用时中括号而不是圆括号,故答案选择C;
6.若有定义:int a[3][4],则对数组a元素的正确引用是(C)。
A、a[2][4]
B、a[1,3]
C、a[2][3]
D、a[3][1]
解析:在C语言中二维数组书写格式行列下标分别使用中括号表示,且下标从0开始到长度-1,答案A列下标越界,答案B格式错误,答案D行下标越界,所以答案选C;
7.以下能对二维数组a进行正确初始化的语句是(B)。
A、int a[2][]={{1,3,1},{2,4,6}} ;
B、int a[][3]={{1,2,3},{4,5,6}} ;
C、int a[2][4]={{1,2,3},{4,5},{6}} ;
D、int a[][]={{3,4,1},{1,2,3},{1,1}} ;
解析:在C语言中二维数组初始化中列号不能省略,所以A答案与D答案错误,且初始化数据量不能超过定义的行列下标数量;C答案中行下标为2,但是初始化数据量超过了行下标限制数量;故选择答案B;
8.若有二维数组初始化语句int a[3][4]={0};则下面正确的叙述是。
( D)
A、只有元素a[0][0]可得到初值0
B、此说明语句不正确
C、数组a中各元素都可得到初值,但其值不一定为0
D、数组a中每个元素均可得到初值0
解析:根据二维数组初始化概念,可以逐一为数组元素赋值,也可以只给部分元素赋值,未赋值的元
素默认其值为0;,故A,B,C答案描述错误,D答案正确。
9.若二维数组a有n列,则计算任一元素a[i][j]是数组中位置的公式为(D)。
(注:a[0][0]在数组中的位置为1)
A、i*n+j
B、j*n+i
C、i*n+j-1
D、i*n+j+1
解析:这里主要时将二维数组转换为一维概念,只是一维是从1开始描述,a[i][j]描述为:每行个数:i*n,再加上当前行的列的个数:j,但是j是从0开始描述,要转换为1开始,需要加1,故答案选D
10.若有说明:int a[][3]={1,2,3,4,5,6,7,8,9,10};则数组a第一维大小是(C)。
A、2
B、3
C、4
D、无法确定
解析:本题主要需要掌握C语言中二维数组初始化时按行初始化,故每行需要3为元素,故数组的一维大小为初始化数据个数10与列数3相除,10/3向上取整为4,故答案选C;
11.若有定义char str[ ]= "china";则该字符串的长度是(A),字符数组str所占的存储空间字节数
是(B)。
A、5
B、6
C、7
D、8
解析:本题主要需要掌握字符串长度代表字符个数,故答案选A,而存放字符串的字符数组的存储控件大小是字符长度加1,因为字符串末尾需要添加一个字节存放’\0’,故答案选B;
12.下面程序段的输出结果是(A)。
int k,a[3][3]={1,2,3,4,5,6,7,8,9};
for (k=0;k<3;k++)
printf("%d ",a[k][2-k]);
A、3 5 7
B、3 6 9
C、1 5 9
D、1 4 7
解析:掌握二维数组访问时下标的表示方法,for循环输出执行3次,分别输出a[0][2],a[1][1],a[2][0]三个元素,故答案选择A;
13.下面是对字符数组str的初始化语句,其中不正确的是(D)。
A、char str[5]={"abcd"};
B、char str[5]={ 'a', 'b', 'c', 'd'};
C、char str[]="abcd";
D、char str[5];str="abcdef";
解析:本题考察一维数组的初始化方法,对于答案D,我们需要知道定义的字符数组str中数组名str 代表数组的首地址,不是变量,所以不能放置在赋值号的左面,故D答案时错误的。
14.下面程序段的输出结果是(B)。
char str[10]={ 'C', 'H', 'I', '\0' , 'N', 'A' , '\0'}
printf("%s",str);
A、'C', 'H', 'I'
B、CHI
C、CHINA
D、CHI NA
解析:本题考察printf中格式符%s输出内容,该格式符对应参数为地址,即冲该地址位置开始,以字符型输出直到遇到ASCII码值为0,也即是'\0'终止输出;故答案选B;
15.有两个字符数组str1,str2,则以下正确的输入语句是(B)。
A、gets(str1,str2);
B、scanf("%s%s",str1,str2);
C、scanf("%s%s",&str1,&str2);
D、gets("str1");gets("str2");
解析:本题考察各种输入函数的使用方法啊,选项A中gets函数的参数只有1个,故是错误的,选项C错误在于str1与str2是字符数组,数组名本身就是地址,不能在前面再加上地址运算符&,而选项
D错误再于,gets的参数只能是变量的首地址,这样参能将键盘键入数据送入,故答案只能选择B选项。
16.下面程序段的输出结果是(B)。
char str1[10]= "Chongqing";
char str2[10]= "Beijing";
strcpy(str1,str2);
printf("%c",str1[7]);
A、i
B、\0
C、n
D、g
解析:这里主要考察strcpy函数的作用,是将str2地址开始的字符串(到'\0'终止)赋值到以str1地址开始,且包含'\0'一起赋值,所以执行strcpy(str1,str2);之后,str1字符数组变为"Beijing\0g",故str1[7]元素内存储的就是\0 ,故答案选B;
17.下面程序段的输出结果是(A)。
char c[ ]="china\0\t\'\\";
printf("%d",strlen(c));
A、5
B、9
C、10
D、13
解析:这里考察对于strlen函数的作用,是求参数地址开始到'\0'终止位置之前字符的个数,因为字符串中本身存在'\0'字符,故答案选A;
18.判断字符串a是否大于b,应当使用(D)。
A、if (a>b)
B、if (strcmp(a,b)<0)
C、if (strcmp(b,a)>0)
D、if (strcmp(a,b)>0)
解析:再C语言中字符串的比较不能直接通过关系运算符比较,只能通过函数strcmp实现,该函数有两个参数a,b,函数返回值为0代表两个字符串相等,函数返回值大于0代表,第一个参数a字符串大于第二个参数字符串b,如果函数返回小于0,代表第一个参数a字符串小于第二个参数字符串b,故答案选择D;
19.设已定义了字符数组s1、s2和s3,其中s2和s3已存储了字符串,则下面函数调用的功能是(C)。
strcat(strcpy(s1,s2),s3);
A、将s1中字符串复制到s2中后再连接到s3中的字符串后
B、将s1中字符串连接到s2中的字符串后再复制到s3中
C、将s2中字符串复制到s1中后,再将s3中的字符串连接到s1中的字符串后
D、将s2中字符串连接到s1中的字符串后,再将s1中的字符串复制到s3中
解析:本题考察字符串函数strcpy与strcat两个函数的作用,strcpy是字符串赋值,strcat是字符串连接,故答案选C;
20.以下对二维数组a的正确说明形式是(C)。
A、int a[5][ ];
B、float a[][3];
C、long a[5][3];
D、float a(3)(5);
解析:再C语言中二维数组定义需要给出数组的维度长度,故选项A,B都是错误的,且下标使用中括号表示,故D选项也是错误的,故答案选择C选项;
21.下面函数的功能是:(A)
int fun(char *x)
{
char *y=x;
while(*y++){};
return y-x-1;
}
A、求字符串的长度
B、求字符串存放位置
C、比较两个字符串的大小
D、将字符串x连接到字符串y后面
解析:该函数返回的是一个整数,函数的参数是字符型指针变量,获取字符串的地址,y指针变量作为中专的指针变量获取的该字符串的地址,while(*y++)循环的作用是不断向后扫描字符串直到'\0'终止,返回的是扫描结束位置的地址与起始位置的差值减1,故求取的是字符串的长度,答案选A;
22.若有以下说明和语句,且0<i<10,则(C)是对数组元素的错误引用。
int a[ ]={1,2,3,4,5,6,7,8,9,0},*p,i;
p=a;
A、*(a+i)
B、a[p-a]
C、p+i
D、*(&a[i])
解析:这里主要要求注意题目要求是元素的表示,而选项C表示的是元素的地址,而不是对元素的引用,故答案选C;
23.下面程序的输出是:(A)
#include<stdio.h>
int main( )
{
int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;
printf("%d", *(p+2));
return 0;
}
A、3
B、4
C、1
D、2
解析:对于指针变量可以间接访问数组元素,这里p变量中存储的是数组a的起始地址,所以p+2代表指向数组a[2]元素的地址指针,所以*(p+2)代表数组元素a[2],故答案选A;
24.若有以下语句,且0<=k<6,则正确表示数组元素地址的语句是(C)
int x[]={1,9,10,7,32,4},*ptr=x,k=1;
A、x++
B、&ptr
C、&ptr[k]
D、&(x+1)
解析:A答案的书写显然是错误的,x属于数组元素的首地址,属于常量,不能做自增运算,根据题目定义,ptr是指向数组x的指针变量,答案B表示的是指针变量的地址而不是数组元素地址,答案D 书写错误的,因为x+1本身是数组元素x[1]的地址而不是变量,前面不能再使用&运算符,故答案选C;表示数组元素x[1]的地址;
25.若有说明:int i,j=7,*p; p=&i;则与i=j等价的语句是(B)
A、i=*p;
B、*p=*&j;
C、i=&j
D、i=**p;
解析:这里需要了解指针引入的作用,就是我们就可以通过变量名直接访问,也可以通过指针变量间接访问;根据题目所述,指针变量p指向i变量,而赋值语句i=j,是将j变量的值赋值给i变量,故需要了解等价关系就是要描述将j变量的值赋给i变量;答案B 中的*p代表的就是i变量,而*&j代表的就是j变量;其他选项都是错误的;-
26.设p1和p2是指向同一个int型一维数组的指针变量,k为int型变量,则不能正确执行的语句是(B)
A、k=*p1+*p2;
B、p2=k;
C、p1=p2;
D、k=*p1*(*p2);
解析:这里考察对于指针变量可以进行的运算,对于答案B而言,赋值号右边是指针变量,而左边是
整型变量,显然赋值号左右两边的数据类型不统一,故答案选B;而A答案是指指针变量p1和p2所指向的变量进行算术加运算,并将结果赋值给变量k;C答案是让p1指针与p2指针一样指向相同的整型变量;D答案是指指针变量p1和p2所指向的变量进行算术乘运算,并将结果赋值给变量k;
二、填空题
1.C语言中定义数组后,构成数组的各个数组元素具有相同的数据类型,不同的下标。
2.若有数组定义int a[10],则引用数组a的数组元素时,下标最小值为0,下标最大值为9。
3.在C语言中,定义二维数组后,系统为其数组元素在内存中分配连续的内存空间,各个数组元素
在内存中的存放顺序是按行存放。
4.若有定义double x[3][5],则引用x数组元素时,行标的最小值为0,列标的最小值为0,
该数组共有15个数组元素。
5.若有数组初始化语句int a[3][4]={{1,2},{0},{3,4,5,6}},则该数组初始化后,数组元素a[1][2]的值为
0 ,a[2][1]的值为 4 。
6.如有字符数组初始化语句:char a[]=”Chong\0qing”,则字符数组a的长度是11。
7.如果有字符数组定义语句char str[10],使用gets(str); 语句键盘输入一个字符串存储在字符数组str
中,则作为函数参数的字符数组名str表示该字符串的首地址。
8.下面程序段的运行结果是741。
int main()
{
int i,x[10];
for(i=9;i>=0;i--)
x[i]=10-i
printf("%d%d%d\n",x[3],x[6],x[9]);
return 0;
}
9.如果要在字符数组s1中存储键盘输入的字符串”Hello World!”,其语句是gets(s1);。
10.如果要将字符数组s1中存储的字符串连接到字符数组s2中存储的字符串后,然后再将连接后的
字符串复制到到字符数组s3中,其语句是strcpy(s3,strcat(s2,s1)); 。
11.C语言中定义函数时如果未指定函数类型,则默认的函数类型是int。
12.C语言中没有返回值的函数类型应指定为void。
13.下面函数返回值的类型是float。
float fun(float a,double b)
{return a*b;}
14.发生函数调用时,实参和形参间的数据传递有两种方式:传值和传地址。
15.在一个函数内部调用另一个函数的调用方式称为嵌套调用,在一个函数内部直接或间接调用
该函数本身的调用方式称为函数的递归调用。
16.如果被调函数在主调函数后定义,一般应该在主调函数中或主调函数前对被调函数进行声明。
17.C语言中的变量按其作用域分为局部变量和全局变量,按其生存期分为静态存储变量和
动态存储变量。
18.已知如下函数定义,其函数声明的两种写法为double fun(long m,double n); ,double
fun(long,double); 。
double fun(long m,double n)
{return (m+n);}
19.C语言中变量的存储类别包括auto,static,extern,和register。
20.在一个多文件的C程序中,若要定义一个只允许本源文件中函数使用而不允许其它源文件中函数
使用的全局整型变量a,则变量a的定义语句应写为static int a;(static float a;)。
三、阅读程序,写出程序运行结果。
1.#include<stdio.h>
#define N 10
int main()
{
int num[N];
int c1,c2,s1,s2,v1,v2,i;
c1=c2=s1=s2=0;
for(i=0;i<N;i++)
scanf("%d",&num[i]);
for(i=0;i<=N;i++)
if(num[i]>=0) {s1+=num[i];c1++;}
else {s2+=num[i];c2++;}
v1=s1/c1;v2=s2/c2;
printf("v1=%d,v2=%d\n",v1,v2);
return 0;
}
如果程序运行时键盘输入:1 -2 3 -4 5 -6 7 -8 9 10↙
答案:v1=5,v2=-5
2.#include<stdio.h>
#define N 4
int main()
{
int arry[N][N],i,j,n=1;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{ arry[i][j]=n; n+=2;}
for(i=0;i<N;i++)
{
for(j=0;j<=i;j++)
printf("%5d",arry[i][j]);
printf("\n");
}
}
答案:
1
9 11
17 19 21
25 27 29 31
3.#include<stdio.h>
int main ( )
int i=0;
char s1[ ]= "ABD", s2[ ]= "ADCF", s3[10];
while (s1[i]!= '\0'&&s2[i]!= '\0')
{
if (s1[i]>=s2[i]) s3[i]=s1[i]+32 ;
else s3[i]=s2[i]+32 ;
i++;
}
s3[i]= '\0';
puts(s3);
return 0;
}
答案:add
4.#include<stdio.h>
int main ( )
{
char str[]={"cde345ab"};
int i,m=0;
for (i=0; str[i]>= 'a' && str[i]<= 'z'; i+=2)
m = 10*m + str[i] - 'a';
printf("%d\n",m);
return 0;
}
答案:24
5.#include<stdio.h>
int main ( )
{
char s1[10]="ABCDEFG",s2[10]="ABCDGFE";
int i=0,n;
while((s1[i]==s2[i])&&(s1[i]!='\0'))
i++;
n=s1[i]-s2[i];
printf("%d\n",n);
return 0;
}
答案:-2
6.int fun(int a,int b)
{
return a>b?a+b:a-b;
}
int main()
int x=3,y=5;
printf("%d\n",fun(x,y));
return 0 ;
}
答案:-2
7.void fun(int x,int y,int z)
{
x=2*x;
y=2*y;
z=2*z;
}
int main()
{
int x=3,y=6,z=9;
fun(x,y,z) ;
printf("%d,%d,%d\n",x,y,z);
return 0 ;
}
答案:3,6,9
8.void fun();
int main()
{
int i=1,j=2;
fun();
printf("i=%d,j=%d\n",i++,j++);’
return 0;
}
void fun()
{
int i=3,j=5;
{
int i=4,j=6;
printf("i=%d,j=%d\n",i++,j++);
}
printf(“i=%d,j=%d\n”,i++,j++);
}
答案:i=4,j=6
i=3,j=5
i=1,j=2
9.int x=0;
fun(int n)
int x=8;
x-=n;
printf("%d\n",x);
}
int main()
{
int y=6;
fun(y);
x+=y;
printf("%d\n",x);
return 0 ;
}
答案:2
6
10.fun (int a,int b)
{
static int m=0,i=2;
i+=m+1;
m=i+a+b;
return (m);
}
int main ( )
{
int x=5,y=2,p1,p2;
p1=fun(x,y) ;
p2=fun(x,y) ;
printf("%d,%d\n",p1,p2) ;
return 0;
}
答案:10,21
11.#include<stdio.h>
int fun(int n)
{
auto int p=1;
p*=n;
return p;
}
int main()
{
int i;mul;
for(i=1;i<=5;i++)
mul=fun(i);
printf("mul=%d\n",mul);
return 0;
}
答案:mul=5
12.int fac(int n)
{
static int f=1;
f=f*n;
return (f);
}
int main()
{
int i;
for(i=1;i<=5;i++)
printf("%d!=%d\n",i,fac(i));
return 0;
}
答案:
1!=1
2!=2
3!=6
4!=24
5!=120
13.long xn(int x,int n)
{
long f=0;
if (n<0) printf("n<0,data error!\n");
else if (n==0) f=1;
else f=x*xn(x,n-1);
return (f);
}
int main( )
{
int x=2,n=10; long y;
y=xn(x,n);
printf("%ld\n",y);
return 0 ;
}
答案:1024
14.void fun(int *x)
{
printf("%d\n",++*x);
int main()
{
int a=25;
fun(&a);
return 0;
}
答案:26
15.#include<stdio.h>
int main( )
{
int a[ ]={1,2,3,4,5};
int x, y, *p;
p=&a[0];
x=*(p+2);
y=*(p+4);
printf("*p=%d,x=%d,y=%d\n",*p,x,y);
return 0;
}
答案:*p=1,x=3,y=5
四、程序设计题
1、键盘输入n个整数(n值由键盘输入),统计n个整数中奇数的个数及输出这些奇数。
分析:使用数组获取这n个整数,再使用循环判断这n个整数是否是奇数,是奇数输出,并使用变量计数,n个整数判断结束,输出统计个数;(奇数判断可自定义函数实现)
解:
#include<stdio.h>
int main ( )
{
int a[20],n,i,count=0;
printf("请输入整数个数:");
scanf("%d", &n);
printf("请输入%d个整数:",n);
for(i=0;i<n;i++)
scanf("%d", &a[i]);
printf(“奇数有:”);
for(i=0;i<n;i++)
if(a[i]%2!=0)
{
printf("%d\t",a[i]);
count++;
}
printf("\n奇数个数为:% d \n", count);
return 0;
方法二:
int oddput(int n )
{
if(n%2!=0)
{
printf("%d ",n);
return 1;
}
return 0;
}
int main ( )
{
int a[20],n,i,count=0;
printf("请输入整数个数:");
scanf("%d", &n);
printf("请输入%d个整数:",n);
for(i=0;i<n;i++)
scanf("%d", &a[i]);
printf("奇数有:");
for(i=0;i<n;i++)
if(oddput(a[i]))
{
count++;
}
printf("\n奇数个数为:% d \n", count);
return 0;
}
2、键盘输入一个班n个学生的C语言成绩,求超过平均成绩(含平均成绩)的学生人数和低于平均成绩的学生人数。
分析:定义数组获取n个学生的C语言成绩,并累计求和,获取结束即求和结束后,求平均值,然后使用循环使用两个变量用来计数,统计大于等于平均成绩和小于平均成绩的人数,最后输出结果;(或者求其中一个,另一个使用学生总数减去求出的值获得)
解:
#include<stdio.h>
int main ( )
{
int a[20],n,I,count=0,sum=0;
float ave;
printf("请输入学生的个数:");
scanf("%d", &n);
printf("请输入%d个学生的C语言成绩:",n);
for(i=0;i<n;i++)
{
scanf("%d", &a[i]);
sum=sum+a[i];
}
ave=(float)sum/n;
for(i=0;i<n;i++)
if(a[i]>=ave)count++;
printf("超过平均成绩好的有%d个,低于平均值的有%d个\n", count,n-count);
return 0;
}
3、键盘输入9个整数保存在一维整型数组中,对该数组按照从大到小的顺序进行排序,然后键盘输入1个整数,将该整数插入到数组中,插入后该数组依然保持有序。
分析:数组排序可以使用冒泡或选择排序进行排序,对于向数组中插入一个键盘数组整数,保持数组有序,可以从数组末端开始依次与键盘数据比较(数组从大到小),如果键盘数据大,数组元素后移,如果数组元素大,键盘数据就放在该元素之后即可;
解:
#include<stdio.h>
int main ( )
{
int a[10],n,i,j,temp;
printf("请输入9个整数:");
for(i=0;i<9;i++)
scanf("%d", &a[i]);
for(j=1;j<10;j++)
for(i=0;i<9-j;i++)
if(a[i]<a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t; }
printf("请输入要插入的整数:");
scanf("%d", &n);
for(i=8;i>=0;i--)
if(a[i]<n)a[i+1]=a[i];
else break;
a[i+1]=n;
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
4、定义二维数组保存一个4行4列的方阵,方阵中各元素的值由键盘输入,要求将方阵的除主对角线外的上三角部分的每个元素的值加2,下三角部分的每个元素的值减2,然后输出改变后的方阵。
分析:这里需要了解上三角元素的行列关系,下三角的行列关系,例如:
a[0][0],a[0][1],a[0][2],a[0][3]
a[1][0],a[1][1],a[1][2],a[1][3]
a[2][0],a[2][1],a[2][2],a[2][3]
a[3][0],a[3][1],a[3][2],a[3][3]
(除去主对角线元素)右边棕色表示上三角元素,左边绿色表示下三角元素;
上三角元素行列特征为行i小于列j;下三角元素行列特征为行i大于列j;故扫描二维数据元素,根
据条件可对元素进行加减处理即可;
解:
#include<stdio.h>
int main ( )
{
int a[4][4],i,j;
printf("请输入4*4行矩阵的数据:\n");
for(i=0;i<4;i++)
for(j=0;j<4;j++)
scanf("%d", &a[i][j]);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(i<j)a[i][j]=a[i][j]+2;
else if(i>j)a[i][j]=a[i][j]-2;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
printf("%d ", a[i][j]);
printf("\n");
}
return 0;
}
5.移数字游戏:
有这样一个包含9个圆圈的数阵,如图1所示。
将1~8这8个数随机地填写到该数阵的外层的圆圈中,只剩
下中间的一个空圆圈。
规定每个数字只能按照数阵中的直线从一
个圆圈移动到另一个空的圆圈中。
通过若干步的移动,要求将该
数阵中的数字移动成为如图2所示的状态。
分析:可以使用二维数组表示9个圆圈的方正,自定义函数随机初始化方正:随机定位二维数组将1到8赋值到8个位置上;移动数据:根据题目含义1至8数字最终放置的位置是固定的,故定义函数实现移动,从数字1开始移动,即在数组方阵中找寻数字1,放置到指定位置上,放置方法就是数据交换,利用方阵中心元素实现;但是注意的是移动有一定的规定,故需要定义交换移动函数实现数据1值8依次移动到固定位置,并输出移动轨迹;
解:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
/*将1-8数据随机初识化外圆圈*/
void RandCircle(int circle[3][3])
{
int n,i,j;
srand((unsigned)time(NULL));
for(n=1;n<=8;n++)
{
while(1)
{
i=rand()%3;
j=rand()%3;
if(circle[i][j]==0&&(i!=1||j!=1))
break;
}
circle[i][j]=n;
}
}
/*输出矩形外圆数据*/
void OutPut(int circle[3][3])
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
if(i==1&&j==1)
printf("[%c]--",0);
else
{
printf("[%d]",circle[i][j]);
if(j!=2)printf("--");
}
printf("\n");
if(i==0)printf(" | %c | %c |\n",92,47);
if(i==1)printf(" | %c | %c |\n",47,92);
}
printf("\n");
}
/*移动i行j列的数据到m行n列*/
void swapCircle(int circle[3][3],int i,int j,int m,int n)
{
int temp;
while(1)
{
switch(i)
{
case 0:
switch(j)
{
case 0:if(i==m&&j==n)return;
temp=circle[i][j]; printf("circle[%d][%d]->circle[1][1]\n",i,j);
circle[i][j]=circle[i+1][j];printf("circle[%d][%d]->circle[%d][%d]\n",i+1,j,i,j);
circle[i+1][j]=temp;printf("circle[1][1]->circle[%d][%d]\n",i+1,j);
i=i+1;continue;
case 1:
case 2:if(i==m&&j==n)return;
temp=circle[i][j]; printf("circle[%d][%d]->circle[1][1]\n",i,j);
circle[i][j]=circle[i][j-1];printf("circle[%d][%d]->circle[%d][%d]\n",i,j-1,i,j);
circle[i][j-1]=temp;printf("circle[1][1]->circle[%d][%d]\n",i,j-1);
j=j-1;continue;
}
case 1:
switch(j)
{
case 0:if(i==m&&j==n)return;
temp=circle[i][j]; printf("circle[%d][%d]->circle[1][1]\n",i,j);
circle[i][j]=circle[i+1][j];printf("circle[%d][%d]->circle[%d][%d]\n",i+1,j,i,j);
circle[i+1][j]=temp;printf("circle[1][1]->circle[%d][%d]\n",i+1,j);
i=i+1;continue;
case 2:if(i==m&&j==n)return;
temp=circle[i][j]; printf("circle[%d][%d]->circle[1][1]\n",i,j);
circle[i][j]=circle[i-1][j];printf("circle[%d][%d]->circle[%d][%d]\n",i-1,j,i,j);
circle[i-1][j]=temp;printf("circle[1][1]->circle[%d][%d]\n",i-1,j);
i=i-1;continue;
}
case 2:
switch(j)
{
case 0:
case 1:if(i==m&&j==n)return;
temp=circle[i][j]; printf("circle[%d][%d]->circle[1][1]\n",i,j);
circle[i][j]=circle[i][j+1];printf("circle[%d][%d]->circle[%d][%d]\n",i,j+1,i,j);
circle[i][j+1]=temp;printf("circle[1][1]->circle[%d][%d]\n",i,j+1);
j=j+1;continue;
case 2:if(i==m&&j==n)return;
temp=circle[i][j]; printf("circle[%d][%d]->circle[1][1]\n",i,j);
circle[i][j]=circle[i-1][j];printf("circle[%d][%d]->circle[%d][%d]\n",i-1,j,i,j);
circle[i-1][j]=temp;printf("circle[1][1]->circle[%d][%d]\n",i-1,j);
i=i-1;continue;
}
}
}
}
/*移动矩形数据*/
void MoveCircle(int circle[3][3])
{
int i,j,num,m=0,n=0;
for(num=1;num<=8;num++)
{
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
if(circle[i][j]==num)
{
swapCircle(circle,i,j,m,n);
}
}
switch(num){
case 1:case 2:n++;break;
case 3:case 4:m++;break;
case 5:case 6:n--;break;
case 7:m--;break;
}
}
}
/*主函数*/
int main()
{
int circle[3][3]={0};
/*将1-8数据随机初识化外圆圈*/
RandCircle(circle);
printf("1-8随机分配后的矩形:\n");
/*输出当前矩形外圆圈数据*/
OutPut(circle);
/*移动矩形数据*/
MoveCircle(circle);
printf("\n移动后的矩形:\n");
/*输出当前矩形外圆圈数据*/
OutPut(circle);
return 0;
}
6、编写程序实现将一个字符数组中存放的字符串复制到另一个字符数组中,要求不能使用strcpy函数。
分析:
解:
#include<stdio.h>
void Strcpy(char s1[],char s2[ ])
{
int i;
for(i=0;s2[i]!='\0';i++)
s1[i]=s2[i];
s1[i]='\0';
}
int main()
{
char s1[20],s2[20];
printf("请输入字符串1:") ;
gets(s1);
printf("请输入字符串2:") ;
gets(s2);
Strcpy(s1,s2);
printf("请输出赋值后的字符串1:") ;
puts(s1);
return 0;
}
7、编写程序实现从键盘输入一行包含英文字母、数字、空格和其他字符的字符串,将该字符串中的英文字母复制生成新的字符串并输出。
解:
#include<stdio.h>
int main()
{
char s1[20],s2[20];
int i,j;
printf("请输入字符串:") ;
gets(s);
for(i=0,j=0;s1[i]!='\0';i++)
{
if( s1[i]>='A'&&s1[i]<='Z'||s1[i]>='a'&&s1[i]<='z')
{
s2[j]=s1[i];
j++;
}
}
s2[j]='\0';
printf("新字符串:") ;
puts(s2);
return 0;
}
8、编写程序,搜索一个指定字符在字符串中的位置(例如:字符’u’在字符串”student”中的位置为3)。
如果找到则输出该字符在字符串中的位置,如果没找到,则输出“没找到!”。
解:
#include<stdio.h>
void Findchar(char s1[],char c)
{
int i;
for(i=0;s1[i]!='\0';i++)
if(s1[i]==c)
{
printf("字符\'%c\' 在字符串\"%s\"中的位置为%d\n",c,s1,i+1) ;
return;
}
printf("没找到!\n")
}
int main()
{
char s1[20],c;
printf("请输入字符串:") ;
gets(s1);
printf("请输入搜索的字符:") ;
c=getchar();
Findchar(s1,c);
return 0;
}
9、从键盘输入一任意字符串,然后,输入所要查找字符。
存在则返回它第一次在字符串中出现的位置;否则,输出"在字符串中查找不到!" 。
并实现对同一字符串,能连续输入所要查找的字符。
解:
#include<stdio.h>
void Findchar(char s1[],char c)
{
int i;
for(i=0;s1[i]!='\0';i++)
if(s1[i]==c)
{
printf("字符\'%c\'在字符串\"%s \"中第一次位置:%d\n",c,s1,i+1) ;
return;
}
printf("在字符串中查找不到!\n")
}
int main()
{
char s1[20],c;
printf("请输入字符串:") ;
gets(s1);
do
{
printf("请输入搜索的字符:") ;
c=getchar();
Findchar(s1,c);
printf("还要搜索字符吗(Y/N)?") ;
ch=getchar();
}while(ch!='N'||ch!='n');
return 0;
}
10. 对一个方阵如图1所示,如果将该方阵顺时针旋转,得到如图2所示;请编辑程序代码实现将一个方阵顺时针旋转。
解:
#include<stdio.h>
#define N 4
/*输出矩形数据*/
void OutPut(int Rectangle[N][N])
{
int i,j;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%02d ",Rectangle[i][j]);
}
printf("\n");
}
printf("\n");
}
/*旋转矩形*/
void RotateRectangle(int Rectangle[N][N])
{
int Rectangler[N][N];
int i,j,m,n;
/*获取旋转后的临时矩形*/
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
m=N-1-j;n=i;/*顺时针旋转90度后对应的行与列*/
Rectangler[i][j]=Rectangle[m][n];
}
/*临时矩形覆盖原有矩形*/
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
Rectangle[i][j]=Rectangler[i][j];
}
}
/*主函数*/
int main()
{
int Rectangle[N][N];
int i,j,n=1;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
Rectangle[i][j]=n++;
/*输出旋转前的矩形*/
printf("\n旋转前的矩形:\n"); OutPut(Rectangle);
/*顺时针旋转矩形数据*/ RotateRectangle(Rectangle);
/*输出旋转后的矩形*/
printf("\n旋转后的矩形:\n"); OutPut(Rectangle);
return 0;
}。