打印沙漏以及指针相关练习题

L1-002 打印沙漏

分数 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);
    }
}

大家要是有什么想法欢迎积极留言呀

下面看几个指针练习

 

6-12 数组区间逆序

本题要求实现一个函数,可以输出一个数组第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 void Reverse ( int *a, int n, int i, int j); int main() { int n, i, j; scanf("%d %d %d", &n, &i, &j); int a[n]; for(int x = 0; x < n; x++){ scanf("%d", &a[x]); } Reverse (a, n, i, j); for(int x = 0; x < n; x++){ printf("%d ", a[x]); } return 0; } /* 请在这里填写答案 */

输入样例:

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

 

6-13 查找数组最大值和最小值

本题要求实现一个函数,可以查找数组的最大值和最小值。

函数接口定义:


void Find_MaxMin(int a[], int n, int *pmax, int *pmin);

其中 a和 n 是用户传入的数组和数组长度。 *pmax 和*pmin分别是求出的数组最大值和最小值;

裁判测试程序样例:


在这里给出函数被调用进行测试的例子。例如: #include void Find_MaxMin(int a[], int n, int *pmax, int *pmin); int main() { int i,n; int max,min; scanf("%d",&n); int a[n]; for(i=0;i

输入样例:

在这里给出一组输入。例如:

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]

 

6-14 整数位移

整数交换
本题要求实现一个函数,可交换4个整数的位置,要求所有整数往后移动一位,最后一位往后移动就成为该组数据的第一位。具体请查看输入输出样例。

函数接口定义:


在这里描述函数接口。例如: void Swap ( int *a, int *b, int *c, int *d );

裁判测试程序样例:


#include void Swap ( int *p, int *q, int *s, int *t ); int main() { int a, b, c, d; scanf("%d %d %d %d", &a, &b, &c, &d); Swap(&a, &b, &c, &d); printf("%d %d %d %d", a, b, c, d); return 0; } /* 请在这里填写答案 */

输入样例:

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[ ][ ]是错误的。

欢迎大家积极留言呀!

你可能感兴趣的:(算法,数据结构,c#)