分数 20
本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印
*****
***
*
***
*****
所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。
给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。
输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。
首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。
19 *
*****
***
*
***
*****
2
感觉我这个方法有一些复杂,但是不难理解,通过上述样例我们可以发现这个沙漏一共五行,而且每行最大占五个空格,如果把这个沙漏拆成两半,我们不难发现上面那半的*个数是按照5,3,1依次递减,而下半部分依次递增。
我们来简单的进行数学归纳,如果n=1时,会用掉1个*,n=2时会用掉7个*,n=3时会用掉17个*,......那么发现规律了吗?想想上面提到的5,3,1递减,我们可以借助等差数列求和公式得到规律,当序号为n时会用掉2*n*n-1个*(即2乘以n的平方减一),且此时一共有2*n-1行,每行所占最大空格数为2*n-1。
#include
int main()
{
int m;
char a;
scanf("%d %c",&m,&a);
int i=1,j,p,l,h,c;
if(m==1)
printf("%c\n%d",a,m-1);
else
{
while(2*i*i-1=l&&j<=h)
printf("%c",a);
else
printf(" ");
}
c--;
printf("\n");
}
c=1;
for(i=p/2-1;i>=0;i--)//这里直接复制上面的过程,反着进行就好
{
l=p/2-c;
h=p/2+c;
for(j=0;j=l&&j<=h)
printf("%c",a);
else
printf(" ");
}
c++;
printf("\n");
}
printf("%d",m);
}
}
大家要是有什么想法欢迎积极留言呀
下面看几个指针练习
本题要求实现一个函数,可以输出一个数组第i个元素到第j个元素之间的逆序排列后的结果。(i,j均为不超过n的正整数正整数且i<=j)
void Reverse ( int *a, int n, int i, int j);
其中 n
、 i
和 j
都是用户传入的参数。 n
是数组长度,其值不超过int
的范围; i
和j
是(0, n]区间内的整数。
在这里给出函数被调用进行测试的例子。例如: #include
10 3 5
1 2 3 4 5 6 7 8 9 10
1 2 5 4 3 6 7 8 9 10
这个题目不难理解只需要注意传给函数的是数组的首地址,是个常量即可
a[i]与*(a+i)是等价的
#include
void Reverse ( int *a, int n, int i, int j)
{
int k,l=i,b[n];
for(k=0;k=i-1;k--)
{
b[l-1]=a[k];
l++;
}
for(k=j;k
void Find_MaxMin(int a[], int n, int *pmax, int *pmin);
其中 a
和 n
是用户传入的数组和数组长度。 *pmax
和*pmin
分别是求出的数组最大值和最小值;
在这里给出函数被调用进行测试的例子。例如: #include
在这里给出一组输入。例如:
10
3 4 7 8 9 4 11 0 2 1
在这里给出相应的输出。例如:
max = 11, min = 0
这个题目充分体现了指针的优势,可以返回一个以上的值
#include
void Find_MaxMin(int a[], int n, int *pmax, int *pmin)
{
int min,max,i;
min=a[0];
max=a[0];
for(i=1;imax)
max=a[i];
if(a[i]
整数交换
本题要求实现一个函数,可交换4个整数的位置,要求所有整数往后移动一位,最后一位往后移动就成为该组数据的第一位。具体请查看输入输出样例。
在这里描述函数接口。例如: void Swap ( int *a, int *b, int *c, int *d );
#include
10 2 3 4
4 10 2 3
相比与前两个题目这个就略微有点复杂了
通过题目我们可以了解到传给函数的是这四个数的地址,所以形参应该为int *类型,表示存放int型变量的地址
#include
void Swap ( int *a, int *b, int *c, int *d )
{
int f,k;
f=*d; //这里把第四个数的值给f
k=*a;
*a=f; //这里完成把第一个数改为第四个数的值,会损坏第一个数原本的值,所以上一行把第一个数的值
先存储在k中,以方便以后使用
f=*b; //以下同上述均为相同思路
*b=k;
k=*c;
*c=f;
*d=k;
}
最后二维指针为函数形参时,例如a[ ][ ],第一个[ ]内可以不写具体数值,但是第二个[ ]内必须标明具体数字,像a[ ][6]和a[5][6]都是正确的,而a[ ][ ]是错误的。
欢迎大家积极留言呀!