题意:
输入包含多组测试数据。第一个整数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;
}