#include <stdio.h> main() { int c; while ((c = getchar()) != '\n') switch (c - '2') { case 0: case 1: putchar(c+4); case 2: putchar(c+4); break; case 3: putchar(c+3); default:putchar(c+2); break; } }
时间: 2024-02-14 16:06:12 浏览: 194
该程序存在语法错误,因为第5行的括号没有闭合。如果将第5行修改为如下形式:
```
while ((c = getchar()) != '\n')
```
那么程序的运行结果为:读入一行字符,将每个字符转换为 ASCII 码并减去字符 '2' 的 ASCII 码,然后根据不同的结果执行不同的操作。具体来说:
- 如果结果为0或1,输出字符的 ASCII 码加上4对应的字符;
- 如果结果为2,输出字符的 ASCII 码加上4对应的字符,并跳出 switch 语句;
- 如果结果为3,输出字符的 ASCII 码加上3对应的字符;
- 如果结果不是0、1、2、3中的任意一个,输出字符的 ASCII 码加上2对应的字符。
需要注意的是,每个 case 语句块如果没有 break 语句,则会继续执行下一个 case 语句块或 default 语句块中的代码。因此,在 case 0 和 case 1 中,如果不加上 break 语句,则会继续执行 case 2 和 default 语句块中的代码。
相关问题
这段代码为什么无法按键控制 #include <stdlib.h> #include <stdio.h> #include <graphics.h> #include <conio.h> HWND hwnd = NULL; //表示主窗口 typedef struct pointxy { int x; int y; } MYPOINT;//坐标属性 struct snake { int num; //蛇的节数 MYPOINT xy[100]; //蛇最多100节 char position; //方向 }snake;//蛇属性 struct food { MYPOINT fdxy; //食物坐标 int eatgrade; //食物分数 int flag; //食物是否存在 }food;//食物属性 enum moveposition{right='D', left = 'A', down = 'S', up = 'W'};//枚举方向 //初始化蛇 void initsnake(); void initsnake() { snake.xy[2].x = 0; snake.xy[2].y = 0; snake.xy[1].x = 10; snake.xy[1].y = 0; snake.xy[0].x = 20; snake.xy[0].y = 0; snake.num = 3; snake.position = right; } //画蛇 void drawsnake(); void drawsnake() { for (int i = 0; i < snake.num; i++) { setlinecolor(BLACK); //矩形边框黑色 setfillcolor(GREEN); fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10); } } //移动蛇 void movesnake(); void movesnake() { for (int i = snake.num - 1; i > 0; i--) { snake.xy[i].x = snake.xy[i - 1].x; snake.xy[i].y = snake.xy[i - 1].y; } switch (snake.position) { case right: snake.xy[0].x += 10; break; case left: snake.xy[0].x -= 10; break; case down: snake.xy[0].y += 10; break; case up: snake.xy[0].y -= 10; break; default: break; } } //键盘控制 void keydown(); void keydown() { char userkey = 0; userkey = _getch(); switch (userkey) { case right: case'd' : case 77 : if (snake.position != left) snake.position = right; break; case left: case'a' : case 75 : if (snake.position != right) snake.position = left; break; case down: case's' : case 80 : if (snake.position != up) snake.position = down; break; case up: case'w': case 72: if (snake.position != down) snake.position = up; break; default: break; } } //初始化食物 void initfood(); //出现食物 void drawfood(); //吃食物 void eatfood(); //失败判定 void snakedie(); int main() { hwnd = initgraph(640, 480); IMAGE img; loadimage(&img,L"1.jpg", 640, 480); initsnake(); while (1) { cleardevice(); //刷新 putimage(0, 0, &img); drawsnake(); movesnake(); while (_kbhit()) { keydown(); } Sleep(50); } getchar(); //防止闪屏 closegraph(); //关闭图形系统 return 0; }
这段代码无法按键控制是因为在主循环中没有调用键盘控制函数 keydown()。可以在主循环中加入调用 keydown() 的代码,如下所示:
```
while (1)
{
cleardevice(); //刷新
putimage(0, 0, &img);
drawsnake();
movesnake();
keydown(); //调用键盘控制函数
Sleep(50);
}
```
当用户按下键盘时,会调用 keydown() 函数来改变蛇的移动方向。但需要注意的是,在调用 keydown() 函数之前,需要先判断用户是否按下了键盘,可以使用 _kbhit() 函数来实现,如下所示:
```
while (1)
{
cleardevice(); //刷新
putimage(0, 0, &img);
drawsnake();
movesnake();
if (_kbhit()) //判断用户是否按下键盘
{
keydown(); //调用键盘控制函数
}
Sleep(50);
}
```
从键盘输入“12”,执行#include<stdio.h> void main() { int c; while((c=getchar())!='\n'); switch(c) { case'0'; case'1':putchar(c+1); case'2':putchar(c+1);break; case'3':putchar(c+2); default:putchar(c+2);break; } }代码,输出结果是什么,为什么?
从键盘输入 "12",程序会读入字符 '1' 和 '2',但是由于代码中的 while 循环将会读入并丢弃所有的输入字符,直到读入一个换行符为止。因此,在 switch 语句中,只有最后一个输入的字符 '2' 会被处理。
根据代码中的 switch 语句,字符 '2' 会匹配 case '2',然后输出字符 '3',因为 '2' 的 ASCII 码是 50,加上 1 后变成 51,对应的字符是 '3'。由于代码中加了 break 语句,程序会跳出 switch 语句,然后输出字符 '3',因为 '2' 的 ASCII 码是 50,加上 2 后变成 52,对应的字符是 '4'。
因此,程序的输出结果是 "34"。
阅读全文