c语言编程题经典1000例(C语言经典100例66-70)
下面部分地方使用指针,也有地方不使用指针。
(或许这里我都应该使用指针来让大家理解一下,但是一些时候指针不是必需品,当然,如果你要向硬件方面发展,那还是得学习指针的)
要学习指针可以看一下这里:(其他资料请自行检索)
一直流浪:C语言重点——指针篇(一篇让你完全搞懂指针)4693 赞同 · 205 评论文章
题目66
题目:输入3个数a,b,c,按大小顺序输出。
程序分析:用指针实现
#include<cstdio>
void sswap(int *p1,int *p2)
{
//*有取值的作用
int p = *p1;
*p1 = *p2;
*p2 = p;
}
int main()
{
int x,y,z;
int *p1,*p2,*p3;
scanf("%d%d%d",&x,&y,&z);
p1 = &x;// 指针指向地址
p2 = &y;
p3 = &z;
//不运行看看这里是按什么顺序输出
if(x > y) sswap(p1,p2);
if(x > z) sswap(p1,p3);
if(y > z) sswap(p2,p3);
printf("%d %d %d",x,y,z);
}
题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
这里给出两种实现方式,指针和非指针:
非指针方式:
#include<cstdio>
#define R register
// 本人不太喜欢使用指针,指针部分代码后给出。
int a[11];
// 不加&还有什么解决办法?
// 这里函数的作用是寻找数组中最大、最小的两个数的位置
void max_min_num_pos(int &pos_max,int &pos_min)
//可以想想要是想传入数组a怎么办
{
//这个函数达成的目的是返回最大数的位置与最小数的位置
//这里默认知道数组长度
//其实在OI中一般是已知的(
int maxx = -1;//找最大的要设置小的,为什么?
int minn = 2147483641;//对应
for(R int i = 1;i <= 10;i )
{
if(a[i] > maxx)
maxx = a[i],pos_max = i;
if(a[i] < minn)
minn = a[i],pos_min = i;
}
}
void sswap(int &x,int &y)
{
int t = x;
x = y;
y = t;
}
int main()
{
for(R int i = 1;i <= 10;i )
scanf("%d",&a[i]);
int pos_max, pos_min;
max_min_num_pos(pos_max,pos_min);
// printf("%d %d",pos_max,pos_min);
sswap(a[1],a[pos_max]);
sswap(a[10],a[pos_min]);
for(R int i = 1;i <= 10;i )
printf("%d ",a[i]);
}
// in:20 4 3 9 1 33 2 6 0 3
// out:
指针方式
#include<cstdio>
#define R register
//这里代码不打算过分解释,应该都能看懂
// 不理解的地方大家可以查阅一下资料,深入探讨一下
int num[11];
void input(int *a)
{
for(R int i = 1;i <= 10;i )
scanf("%d",&a[i]);
}
void max_min(int *a)
{
int *max,*min;
int *p,*a_end;
a_end = a 10;//为啥加10?
max = min = a 2;
for(p = a 2; p <= a_end;p )
{
if(*p > *max) max = p;
if(*p < *min) min = p;
}
// 这里的p有什么作用,与上面一样吗
*p = a[1]; a[1] = *max; *max = *p;
*p = a[10];a[10] = *min; *min = *p;
}
void print(int *a)
{
int *p;
for(p = a 1 ; p <= a 10;p )
printf("%d ",*p);
// a 1等价于 a[1]吗?
//自己动手试一试,这里不是很难看出来
}
//in:20 4 3 9 1 33 2 6 0 3
int main()
{
// 三个函数的形式会让主函数显得很简洁
input(num);
max_min(num);
print(num);
}
题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
#include<cstdio>
#define R register
// 看看是否能自己看懂
int n,m;//n代表数组长度,m代表位置(
int a[15];
void do_work(int *a,int len,int mm)
{
int idx = len - mm;
for(R int i = 1;i <= mm;i )
{
int *p = a idx i;
int tmp = *p;
for(R int j = idx i; j > i ;j--)
{
*p = *(p-1);
p--;
}
*(a i) = tmp;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(R int i = 1;i <= n;i )
scanf("%d",&a[i]);
do_work(a,n,m);
for(R int i = 1;i <= n;i )
printf("%d ",a[i]);
}
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
#include<cstdio>
int n,left,pos = 0,num,m;
int in[111];
// 这里实际上是约瑟夫环问题,直接拿来用了
/*
n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,
再由下一个人重新从 1 开始报数,数到 m 的人再出圈,
依次类推,直到所有的人都出圈,请输出依次出圈人的编号。*/
int main()
{
scanf("%d%d",&n,&m);
// n个人报数,报到m的出圈
left = n;//留在里面的最开始有n个
//在圈里是 0,不在圈里是1
while(1)
{
pos = pos % n 1; //环
while(in[pos]) pos = pos % n 1;
num ;
if(num % m == 0)
{
in[pos] = 1,left--;//出圈
printf("%d ",pos);
}
if(left == 1)break;
}
for(int i = 1;i <= n;i )
if(!in[i]){
printf("%d",i);
break;
}
}
// 其实可以数学推导出最后一个出圈的人是序号几,可查一下资料
// 有时间可能补充一下推导
题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
#include<cstdio>
#include<cstring>
#define R register
// 其实有现成的计算字符串长度的函数strlen(),调用cstring
char s[20];
int len(char *s)
{
int cnt = 0;
for(R int i = 0;;i )
{
if(s[i] == '\0')break;
cnt ;
}
return cnt;
}
int main()
{
scanf("%s",s);//用%s输入,注意这样子的写法从s[0]存储
printf("%d\n",len(s));
// printf("%d\n",strlen(s));
}
其实上面swap也有现成的函数,可以调用iostream库来使用
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com