声明 switch 语句然后稍后调用它

问题描述 投票:0回答:1

我开发了一个代码,可以根据输入创建字母表的同心矩形,不幸的是,由于 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 语句(通常,不是特别在这里)

c function switch-statement
1个回答
0
投票

您可以使用

"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;
,这是另一种简化。

© www.soinside.com 2019 - 2024. All rights reserved.