【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;
}
经验分享 程序员 微信小程序 职场和发展