1.打印菱形
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i, j, k, n;
printf("输入菱形的行数(只能输入奇数):");
scanf_s("%d", &n);
for (i = 0; i <= n / 2 + 1; i++)
{
for (j = n / 2; j >= i; j--)
{
printf(" ");
}
for (k = 1; k <= 2 * i - 1; k++)
{
printf("#");
}
printf("\n");
}
for (i = 1; i <= n / 2; i++)
{
for (j = 1; j <= i; j++)
{
printf(" ");
}
for (k = 1; k <= n - 2 * i; k++)
{
printf("#");
}
printf("\n");
}
system("pause");
return 0;
}
根据观察菱形的行数n只能是奇数,上半行打印的行数应该是n / 2 + 1,下半行打印的行数应该是n / 2;(也可以上半行打印行数n / 2,下半行打印行数n / 2 + 1)。
菱形第一行打印的空格数应该是n / 2即用for循环打印为
for (j = n / 2; j >= i; j--)
或者打印为
for (j = 1; j <= n / 2 - i + 1; j++)
第二种逻辑思路更明了。
接下来打印井号的思路和打印规定函数的菱形的打印方法一致。
在打印下半部分的星号时
for (k = 1; k <= n - 2 * i; k++)
k <= n - 2 * i 可以观察图形发现n就是整个菱形的行数,k=1时打印的是下半部分打印的最长行中的星号数量。
其余部分和打印普通规定函数的菱形一致。
2.用井号打印520(不使用函数只用for循环和if条件语句)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i;//循环变量行数
int n;//控制打印第一行和第七行的星号次数
int j, k;//分别控制打印井号数和空格数
int m;//循环变量列数
for (i = 1; i <= 7; i++) //大循环控制行数
{
if (i == 1 || i == 7) //打印第1行和第7行
{
for (n = 1; n <= 3; n++)
{
for (j = 1; j <= 5; j++)
{
printf("#");
}
for (k = 1; k <= 2; k++)
{
printf(" ");
}
}
printf("\n");
}
else if (i == 2 || i == 3) //打印第2行第3行
{
for (m = 1; m <= 19; m++)
{
if (m == 1 || m == 12 || m == 15 || m == 19)
{
printf("#");
}
else
{
printf(" ");
}
}
printf("\n");
}
else if (i == 4) //打印第4行
{
for (m = 1; m <= 19; m++)
{
if (m == 6 || m == 7 || m == 13 || m == 14 || m == 16 || m == 17 || m == 18)
{
printf(" ");
}
else
{
printf("#");
}
}
printf("\n");
}
else //打印第5行和第6行
{
for (m = 1; m <= 19; m++)
{
if (m == 5 || m == 8 || m == 15 || m == 19)
{
printf("#");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
system("pause");
return 0;
}
打印的效果应该是这样
思路:算上每两个数之间的2个空格,一共有19列,7行
第一行和第七行的内容一致都是用循环控制打印{三次5个星号和2个空格}的循环嵌套,
第二行和第三行需要在第1 12 15 19列打印'#',其余列中都打印' ',因此用控制列数的循环打印,注意\n的位置
剩下几行同样以控制列数的方法打印
一定要在同一个控制行数的for循环中一行行打印,否则520会数着打印,注意逻辑语句的运用。
在不使用函数的情况下,最重要的是要控制行数和列数在是否满足条件的情况下判断是打印 ’#‘ 还是打印 ‘ ’。
3.变长数组
#include <stdio.h>
#include <stdlib.h>
#define ROWS 3
#define COLS 4
int sum2d(int rows, int cols, int ar[rows][cols]);
int main(void)
{
int i, j;
int rs = 3;
int cs = 10;
int junk[ROWS][COLS] = { {2, 4, 6, 8}, {3, 5, 7, 9}, {12 , 10, 8 , 6} };
int morejunk[ROWS - 1][COLS + 2] = { {20, 30, 40, 50, 60, 70 }, {5, 6, 7, 8, 9, 10} };
int varr[rs][cs];
for (i = 0; i < rs; i++)
for (j = 0; j < cs; j++)
varr[i][j] = i * j + j;
printf("3x5 array\n");
printf("Sum of all elements = %d\n", sum2d(ROWS, COLS, junk));
printf("2x6 array\n");
printf("Sum of all elements = %d\n", sum2d(ROWS - 1, COLS + 2, morejunk));
printf("3x10 VLA\n");
printf("Sum of all elements = %d\n", sum2d(rs, cs, varr));
system("pause");
return 0;
}
int sum2d(int rows, int cols, int ar[rows][cols])
{
int r;
int c;
int tot = 0;
for (r = 0; r < rows; r++)
{
for (c = 0; c < cols; c++)
{
tot += ar[r][c];
}
}
return tot;
}
如上代码运用了变长数组。
众所周知在定义数组时,数组长度不可以是变量,只能是常量或者常量表达式。
变长数组调用了一个以数组做形参的函数,可以在调用该函数时给形参数组赋值上另外一个确定了大小和内容的同种类型数组,以达到“变长”的目的,”变长“并不是说可以修改已创建数组的大小,一旦创建了变长数组,那么他的大小则保持不变,”变长“是指在创建数组时可以用变量制定数组的大小和维度。
然而vs2017并不支持变长数组然后就报错
但是用codeblocks可以正确打印结果:
在vs2017上打印变长数组的方法,暂时没找到。