我开发了一个代码,可以根据输入创建字母表的同心矩形,不幸的是,由于 C 中没有字典函数,我使用 switch 语句将我的数值转换为字母表。我得到了所需的输出,但由于我对奇数和偶数输入有两种不同的方法,因此我必须在代码的两个部分中声明 switch 语句:
#include <stdio.h>
int a, n;
int main() {
printf("Enter the Number: ");
scanf("%d",&a);
if(a%2 == 0)
{
n = a/2;
printf("\n The Output is: \n");
for (int i = 0; i < 2 * n; i++) {
for (int j = 0; j < 2 * n; j++) {
int z = i;
if (z > 2 * n - 1 - i) {
z = 2 * n - 1 - i;
}
if (z > j) {
z = j;
}
if (z > 2 * n - 1 - j) {
z = 2 * n - 1 - j;
}
int value = z+1;
// printf("%d ", value);
switch(value){
case 1:
printf("A ");
break;
case 2:
printf("B " );
break;
case 3:
printf("C " );
break;
case 4:
printf("D " );
break;
case 5:
printf("E " );
break;
case 6:
printf("F ");
break;
case 7:
printf("G " );
break;
case 8:
printf("H " );
break;
case 9:
printf("I " );
break;
case 10:
printf("J " );
break;
case 11:
printf("K " );
break;
case 12:
printf("L " );
break;
case 13:
printf("M " );
break;
case 14:
printf("N " );
break;
case 15:
printf("O ");
break;
case 16:
printf("P " );
break;
case 17:
printf("Q " );
break;
case 18:
printf("R " );
break;
case 19:
printf("S " );
break;
case 20:
printf("T ");
break;
case 21:
printf("U " );
break;
case 22:
printf("V " );
break;
case 23:
printf("W " );
break;
case 24:
printf("X " );
break;
case 25:
printf("Y " );
break;
case 26:
printf("Z " );
break;
}
}
printf("\n");
}
}
else
{
n = (a/2)+1;
printf("\n The Output is: \n");
for (int i = 0; i < 2 * n - 1; i++) {
for (int j = 0; j < 2 * n - 1; j++) {
int z = i;
if (z > 2 * n - 2 - i) {
z = 2 * n - 2 - i;
}
if (z > j) {
z = j;
}
if (z > 2 * n - 2 - j) {
z = 2 * n - 2 - j;
}
int value = z+1;
// printf("%d ", value);
switch(value){
case 1:
printf("A");
break;
case 2:
printf("B");
break;
case 3:
printf("C");
break;
case 4:
printf("D");
break;
case 5:
printf("E");
break;
case 6:
printf("F");
break;
case 7:
printf("G");
break;
case 8:
printf("H");
break;
case 9:
printf("I");
break;
case 10:
printf("J");
break;
case 11:
printf("K");
break;
case 12:
printf("L");
break;
case 13:
printf("M");
break;
case 14:
printf("N");
break;
case 15:
printf("O");
break;
case 16:
printf("P");
break;
case 17:
printf("Q");
break;
case 18:
printf("R");
break;
case 19:
printf("S");
break;
case 20:
printf("T");
break;
case 21:
printf("U");
break;
case 22:
printf("V");
break;
case 23:
printf("W");
break;
case 24:
printf("X");
break;
case 25:
printf("Y");
break;
case 26:
printf("Z");
break;
}
}
printf("\n");
}
}
return 0;
}
输出:
Enter the Number: 7
The Output is:
A A A A A A A
A B B B B B A
A B C C C B A
A B C D C B A
A B C C C B A
A B B B B B A
A A A A A A A
由于多次声明 switch,代码变得非常冗长,所以我想知道是否有一种方法可以声明一次 switch 功能,然后在需要时将其调用到主函数中,但到目前为止我最终失败了,我'我尝试为带有指针的 switch 语句创建一个函数,但它似乎不起作用。是否可以声明一次 switch 和 case 并根据需要多次调用它?
请忽略代码的美观性。
编辑:根据评论中的支持和建议,我开发了一个更简单的代码版本,我将其上传到此处,以防对社区或新贡献者有任何帮助。
#include <stdio.h>
int a, n;
char letters[] = { 'A', 'B', 'C', 'D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y', 'Z' };
int main() {
printf("Enter the Number: ");
scanf("%d",&a);
if(a%2 == 0)
{
n = a/2;
printf("\n The Output is: \n");
for (int i = 0; i < 2 * n; i++) {
for (int j = 0; j < 2 * n; j++) {
int z = i;
if (z > 2 * n - 1 - i) {
z = 2 * n - 1 - i;
}
if (z > j) {
z = j;
}
if (z > 2 * n - 1 - j) {
z = 2 * n - 1 - j;
}
printf("%c ", letters[z]);
}
printf("\n");
}
}
else
{
n = (a/2)+1;
printf("\n The Output is: \n");
for (int i = 0; i < 2 * n - 1; i++) {
for (int j = 0; j < 2 * n - 1; j++) {
int z = i;
if (z > 2 * n - 2 - i) {
z = 2 * n - 2 - i;
}
if (z > j) {
z = j;
}
if (z > 2 * n - 2 - j) {
z = 2 * n - 2 - j;
}
printf("%c ", letters[z]);
}
printf("\n");
}
}
return 0;
}
但我的问题不是最佳方法,而是我们是否可以以某种方式在程序中调用 switch 语句(通常,不是特别在这里)
您可以使用
"ABCDEFGHIJKLMNOPQRSTUVWXY"[value-1]
将索引从字母表转换为字母。字符串文字创建一个数组,并且 [value-1]
从数组中获取一个元素。
您可以使用
'A' + (value-1)
进行非便携式转换。这适用于 C 实现,其中字母在执行字符集中按字母顺序连续,这很常见,但 C 标准不要求。
您可以通过将 switch 语句或上面的代码放入函数调用中来在多个位置使用相同的代码:
int IndexToLetter(int value)
{
static const char Alphabet[26] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
return Alphabet[value-1];
}
然后可以使用
IndexToLetter(value)
调用该函数。例如,要打印字母和空格,您可以使用 printf("%c ", IndexToletter(value));
或:
putchar(IndexToLetter(value));
putchar(' ');
由于您没有显示“带有指针的 switch 语句的函数,但它似乎不起作用”,因此无法诊断其中的错误。
字符串文字
"ABCDEFGHIJKLMNOPQRSTUVWXY"
使用 27 个字节,因为它包含一个终止空字节。这种浪费在程序中不太可能产生影响。然而,上面显示的 Alphabet
数组通过将数组大小限制为 26 字节来避免这种情况。我们可以使用复合文字获得相同的效果:return (char [26]){"ABCDEFGHIJKLMNOPQRSTUVWXYZ"}[value-1]
。
要简化从
value-1
到 value
查找字母的代码,您可以将 int value = z+1;
更改为 int value = z;
,这是另一种简化。