我已经开发了一个代码,可以根据输入创建字母的同心矩形,不幸的是,因为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语句(一般来说,不是特别在这里)
2条答案
按热度按时间zxlwwiss1#
您可以使用
"ABCDEFGHIJKLMNOPQRSTUVWXY"[value-1]
将索引转换为字母表。字符串字面量创建一个数组,[value-1]
从数组中获取一个元素。您可以使用
'A' + (value-1)
进行非可移植转换。这适用于C实现,其中字母在执行字符集中按字母顺序连续,这是非常常见的,但C标准不要求。你可以在多个地方使用相同的代码,方法是将switch语句或上面的代码放入函数调用中:
然后可以使用
IndexToLetter(value)
调用该函数。例如,要打印字母和空格,可以使用printf("%c ", IndexToletter(value));
或:由于您没有显示“带有指针的switch语句的函数,但它似乎无法工作”,因此无法诊断其中的错误。
备注
字符串文字
"ABCDEFGHIJKLMNOPQRSTUVWXY"
使用27个字节,因为它包含一个终止空字节。这种浪费在程序中不太可能是重要的。但是,上面显示的Alphabet
数组通过将数组大小限制为26个字节来避免这种情况。我们可以用一个复合文字来达到同样的效果:return (char [26]){"ABCDEFGHIJKLMNOPQRSTUVWXYZ"}[value-1]
。为了简化从
value-1
到value
查找字母的代码,您可以将int value = z+1;
更改为int value = z;
,这是另一种简化。e4yzc0pl2#
你可以通过使用一个查找表来泛化你的循环并消除switch语句: