声明switch语句,然后在以后调用它

vqlkdk9b  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(127)

我已经开发了一个代码,可以根据输入创建字母的同心矩形,不幸的是,因为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功能,然后在需要的时候将其调用到main函数中,但到目前为止,我最终失败了,我试着用指针为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语句(一般来说,不是特别在这里)

zxlwwiss

zxlwwiss1#

您可以使用"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-1value查找字母的代码,您可以将int value = z+1;更改为int value = z;,这是另一种简化。

e4yzc0pl

e4yzc0pl2#

你可以通过使用一个查找表来泛化你的循环并消除switch语句:

#include <stdio.h>

void print_pattern(int a)
{
    static const char* alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int n = (a % 2 == 0 ? a / 2 : a / 2 + 1);

    // The above line is equivalent to
    // int n;
    // if (a % 2 == 0)
    //   n = a / 2
    // else
    //   n = a / 2 + 1

    int loop_len = (a % 2 == 0 ? 2 * n : 2 * n - 1);
    printf("\nThe output is: \n");
    for (int i = 0; i < loop_len; i++)
    {
        for (int j = 0; j < loop_len; j++)
        {
            int z = i;
            if (z > loop_len - 1 - i)
            {
                z = loop_len - 1 - i;
            }
            if (z > j)
            {
                z = j;
            }
            if (z > loop_len - 1 - j)
            {
                z = loop_len - 1 - j;
            }
            int value = z + 1;
            printf("%c ", alpha[value - 1]);
        }
        printf("\n");
    }
}

int main() {
    int a, n;
    printf("Enter the Number: ");
    scanf("%d", &a);
    print_pattern(a);
    return 0;
}

相关问题