蓝桥杯--c语言实现打印DNA

题意:
输入包含多组测试数据。第一个整数N(N<=15),N表示组数,每组数据包含两个整数a,b。a表示一个单位的DNA串的行数,a为奇数且 3<=a<=39。b表示重复度(1<=b<=20)。

题意解释:第一个表示有N组数据,每组数据有两个元素(a和b),a表示一个DNA占据的行数,b表示DNA的个数

解题过程:

1.主函数完成赋值和判断输入的值是否符合条件

int main()
{
    int N;
    scanf("%d",&N);        //自定义组数
    int a[N],b[N];
    for(int i = 0 ; i < N ; i ++)
    {
        scanf("%d%d",&a[i],&b[i]);         //对每组数据的赋值
        if(a[i]%2 != 1 || N > 15 || N < 0 || a[i] < 3 || a[i]>39 || 1>b[i] || b[i]>20 ) 
        {
            printf("值有错误,已返回\n");          //题意要求,值不符合条件退出
            return 0;
        }

    }
    someOperator(a,b,N);        //把a数组和b数组 的指针传过去,N表示自定义要求
    return 0;
}

2.对传进来的数组进行操作

void someOperator(int* a,int* b,int size)    //接收数组指针
{
    for(int i = 0 ; i < size ;i ++)    //数组指针遍历
    {
        Start(*a,*b);       //*a表示行数,*b表示个数
        a++;
        b++;
    }
}

3.获取行数

int getnum(int a,int b)    //a表示传进来的行数,b表示DNA的个数,返回打印的行数的值
{
    if(b == 1)        
        return a;
    if(b== 2)
        return  (2*a-1);
    return ((a-1)*b+1);
}

4.打印操作

void  Start(int a,int b)    //获取值打印函数
{
    int row = a;    //单个DNA的行数
    int cout = b;    //打印DNA的个数
    int index =getnum(row,cout);    //一组数据所占的行数


    /*左值等于右值的时候,打印‘*’,否则打印‘ ’,左值先++,右值--,如果左值到了最大就--操作
        右值++操作,用getnum(int a,int b),来获取打印的次数赋给index*/
    
    int fir = 0;          //定义左值 
    int end = row-1;1    //定义右值
    for(int i = 0 ; i < index;i++)    //控制行
    {
        for(int ii = 0 ; ii < a ;ii ++)   //列操作 
        {
            if(ii ==fir || ii==end)
             {
                printf("*");
            }
            else
             {
                printf(" ");

            }
        }
        fir++;
        end--;
        if(end == 0)    //值得替换
        {
            end = row-1;
            fir =0;
        }
        printf("\n");
    }
    //结束了
    printf("---------\n");//一组数据完成换行

}

完整代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//实现NDA
/*
 *  1、 定义组数
 *  2、 每组的成员 a为奇数 b在1到20之间
 *  3、 完成打印
*/
int getnum(int a,int b)
{
    if(b == 1)
        return a;
    if(b== 2)
        return  (2*a-1);
    return ((a-1)*b+1);
}

void  Start(int a,int b)//获取值打印函数
{
    int row = a;//多少行
    int cout = b;//打印个DNA

    int index =getnum(row,cout);//一共打印这么多行得到了行数
    int fir = 0;
    int end = row-1;
    for(int i = 0 ; i < index;i++)//row等于3
    {
        for(int ii = 0 ; ii < a ;ii ++)
        {
            if(ii ==fir || ii==end)
             {
                printf("*");
            }
            else
             {
                printf(" ");

            }
        }
        fir++;
        end--;
        if(end == 0)
        {
            end = row-1;
            fir =0;
        }
        printf("\n");
    }
    //结束了
    printf("---------\n");

}

void someOperator(int* a,int* b,int size)//赋值操作
{
    for(int i = 0 ; i < size ;i ++)
    {
        Start(*a,*b);       //*a表示行数,*b表示个数
        a++;
        b++;
    }
}

int main()
{
    int N;
    scanf("%d",&N);//获得组数
    int a[N],b[N];
    for(int i = 0 ; i < N ; i ++)
    {
        scanf("%d%d",&a[i],&b[i]); //完成输入
        if(a[i]%2 != 1 || N > 15 || N < 0 || a[i] < 3 || a[i]>39 || 1>b[i] || b[i]>20 )
        {
            printf("值有错误,已返回\n");
            return 0;
        }

    }
    someOperator(a,b,N);
    return 0;
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值