【C语言刷题训练】——————图形打印
目录
1. 二维数组打印打印指定图形 2. 字符串比较 3. qsort函数再应用及出现问题(待解决)
一、 二维数组
如题,打印空心三角形,如果还按照以前的方法直接去输出,也可以,但是用二维数组先将其输入,再输出,这样输入和输出的时候都可以去控制条件,相较于直接输出的一层控制条件,二维数组更优(下面会有例子供证明)。 可以发现找空心的规律不是那么容易,那么反着来,把非空心的地方填充进‘*’,剩下的就是空心的。
1. 第一列均非空心。 2. 行数和列数相等,非空心。 3. 最后一行非空心。 规律出来了,代码敲出来就可以了:
int main()
{
char arr[19][19];
int n, i, j;
while (scanf("%d", &n) != EOF)
{
for (i = 0; i<n; i++)
{
if (i<2)
{
for (j = 0; j<n; j++)
{
if (j == 0 || i == j)
{
arr[i][j] = *;
}
else
{
arr[i][j] = ;
}
}
}
else if (i == n - 1)
{
for (j = 0; j<n; j++)
{
arr[i][j] = *;
}
}
else
{
for (j = 0; j<n; j++)
{
if (j==0||i==j)
{
arr[i][j] = *;
}
else
{
arr[i][j] = ;
}
}
}
}
for (i = 0; i<n; i++)
{
for (j = 0; j<n; j++)
{
printf("%c ", arr[i][j]);
}
printf("
");
}
}
return 0;
}
这里创建的数组为20行20列,是题目给了条件,三角形行数不超过20。
二、strcmp比较字符串。
如题: 比较输入的字符串和标准字符串是否一致。一开始我是用if进行判断的,效果如下:
可以看到,arr2数组中放的就是admin,为什么还是会输出else中的2呢? 因为arr2这个数组名代表首元素地址,拿一个地址和admin比较,一致才怪呢。 经查,用strcmp函数可以实现字符串比较。 当strcmp函数返回值为0时,代表两个字符串相等。 代码如下:
int main()
{
char arr1[20];
char arr2[20];
char arr3[]="admin";
scanf("%s",&arr1);
getchar();
scanf("%s",&arr2);
if(strcmp(arr2,arr3)==0)
{
printf("Login Success!");
}
else
{
printf("Login Fail!");
}
return 0;
}
这里用getchar(),是为了两个数组arr1、arr2中间输入时要隔一个空格,所以拿getchar()吸收空格。
三、qsort函数中自定义函数comp的返回值问题
可以用数组储存这七个成绩,然后qsort排序后取2——6名的成绩。已知qsort函数中自定义函数comp的返回值为正数,则为降序排列,于是我懒省事:
int comp(const void*elem1,const void*elem2)
{
return 1;
}
直接返回1。 果然,偷懒是要付出代价的,输出的答案和标注答案不照! 我还是老老实实的敲吧。
int comp(const void*elem1,const void*elem2)
{
return *(int*)elem1-*(int*)elem2;
}
答案输出后是标准答案,但我还是没搞明白这个自定义comp的返回值会影响到什么!(立个flag,三天内搞定) 解题代码如下:
int comp(const void*elem1,const void*elem2)
{
return *(int*)elem1-*(int*)elem2;
}
int main()
{
int arr[7];
int i=0;
int j=0;
for(i=0;i<7;i++)
{
scanf("%d",&arr[i]);
}
qsort(arr,7,sizeof(int),comp);
for(i=1;i<=5;i++)
{
j+=arr[i];
}
printf("%.2f",(float)j/5);
return 0;
}
