题目51-55
51、输入3个数a,b,c,按大小顺序输出(利用指针)。
#include "stdio.h"
int main(){
void compare(int *a,int *b);
int a, b,c;
scanf("%d,%d,%d",&a,&b,&c);
if (a<b) {
compare(&a, &b);
}
if (a<c) {
compare(&a, &c);
}
if (b<c) {
compare(&b, &c);
}
printf("%d,%d,%d",a,b,c);
}
void compare(int *a,int *b){
int temp;
temp=*a;*a=*b;*b=temp;
}
运行结果:
52、输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
刚开始写这道题时出错,调试后发现错误原因,也记录一下~
一定要知道错误的原因,不能一知半解,不然下次一样会错~
错误代码
#include "stdio.h"
#define N 5
int main(){
void input(int array[N]);
void output(int array[N]);
int array[N],*max,*min,*p;
max=array,min=array;
input(array);
for (p=array; p<array+N; p++) {
if (*max<*p) {
*max=*p;
}
else if (*min>*p) {
*min=*p;
}
}
int temp=*min;*min=array[0];array[0]=temp;
temp=*max;*max=array[N-1];array[N-1]=temp;
output(array);
}
void input(int array[N]){
int *p;
for(p=array;p<array+N;p++)
scanf("%d",p);
}
void output(int array[N]){
int *p;
for(p=array;p<array+N;p++){
printf("%d ",*p);
}
printf("\n");
}
运行结果:
调试部分结果如下图所示:
分析:假设array[0]的地址为200,则min和max的地址也为200,循环一次后*min变为2,即200这个地址上的值变为2,即array{2,2,1,5,4},*max也随之发生改变,也变为2。
循环一次的结果 | *max=2 | *min=2 | array{2,2,1,5,4} |
---|---|---|---|
循环两次的结果 | *max=1 | *min=1 | array{1,2,1,5,4} |
循环三次的结果 | *max=5 | *min=5 | array{5,2,1,5,4} |
循环四次次的结果 | *max=4 | *min=4 | array{4,2,1,5,4} |
结论:变化的是200这个地址上的值,我们得到的仅仅是最大最小值,而数组值的交换要求我们必须知道最大最小值的位置。
修改代码如下:
#include "stdio.h"
#define N 5
int main(){
void input(int array[N]);
void output(int array[N]);
int array[N],*max,*min,*p;
max=array,min=array;
input(array);
for (p=array; p<array+N; p++) {
if (*max<*p) {
max=p;//不能写成*max=*p
}
if (*min>*p) {
min=p;
}
}
int temp=*min;*min=array[0];array[0]=temp;
temp=*max;*max=array[N-1];array[N-1]=temp;
output(array);
}
void input(int array[N]){
int *p;
for(p=array;p<array+N;p++)
scanf("%d",p);
}
void output(int array[N]){
int *p;
for(p=array;p<array+N;p++){
printf("%d ",*p);
}
printf("\n");
}
运行结果:
53、有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。
#include<stdio.h>
int main(){
void move(int n,int m,int array[20]);
int number[20],n,m,i;
printf("输入数组的大小:");
scanf("%d",&n);
printf("输入后移的m值:");
scanf("%d",&m);
for(i=0;i<n;i++){
scanf("%d,",&number[i]);
}
move(n,m,number);
for(i=0;i<n-1;i++){
printf("%d,",number[i]);
}
printf("%d",number[n-1]);
}
void move(int n,int m,int array[20]){
int *p,array_end;
array_end=*(array+n-1);
for(p=array+n-1;p>array;p--){
*p=*(p-1);
}
*array=array_end;
m--;
if(m>0){move(n,m,array);}
}
运行结果:
54、有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
#include<stdio.h>
#include<math.h>
int main(void) {
int n, * p, number=0, k = 0;//k表示退出的人数
printf("输入人数n:");
scanf("%d", &n);
int array[20];
for (int i = 1; i <= n; i++) {
array[i - 1] = i;
}
while (k != n-1) {
for (p = array; p < array + n; p++) {
if(*p != 0){
number++;
if (number % 3 == 0) {
number = 0;
//printf("%d\n", *p);
*p = 0;
k++;
}
}
}
}
for (p = array; p < array + n; p++) {
if (*p != 0) {
printf("最后留下的是原来第%d号。", *p);
}
}
}
运行结果:
55、写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
#include<stdio.h>
#include<math.h>
int length(char c[]){
char *p;p=c;
int n=0;
while (*p!='\0') {
n++;
p++;
}
return n;
}
int main(void) {
int length(char c[]);
char c[20];
scanf("%s",c);//gets(c)把空格也算成字符;
printf("%d",length(c));
}
运行结果:
注意:scanf () 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串。.而gets () 认为空格也是字符串的一部分,只有遇到回车键时才认为字符串输入结束。