目录
第7章 有了它你能做更多的事
第1节 字符的妙用
从键盘读入一个字符并将其输出:
int main()
{
char a;
scanf("%c", &a);
printf("你刚才输入的字符是%c", a);
return 0;
}
输出结果:
a
你刚才输入的字符是a
'1'、1、“1”是不同的。第1个是字符;第2个是整数1;第3个是字符串;
计算器(整数):
int main()
{
int a, b;
char c;
scanf("%d%c%d", &a, &c, &b);
if (c == '+')
printf("%d", a + b);
if (c == '-')
printf("%d", a - b);
if (c == '*')
printf("%d", a * b);
if (c == '/')
printf("%d", a / b);
return 0;
}
输出结果:
3+7
10
第2节 多余的回车键
a = getchar() 与 scanf("%c",&a)的作用是完全一样的。但是当用户输入一个字符后,程序并不会继续往下执行,直到用户按下“Enter”键,程序才会认为刚才的输入已经结束,然后继续执行余下的内容。
使用getchar()显示你刚才输入的字符是……:
int main()
{
char a;
a = getchar();
printf("你刚才输入的字符是%c\n", a);
return 0;
}
输出结果:
e
你刚才输入的字符是e
使用getche()显示你刚才输入的字符是……:
int main()
{
char a;
a = getche();
printf("你刚才输入的字符是%c", a);
return 0;
}
输出结果:
c你刚才输入的字符是c
使用getch()显示你刚才输入的字符是……:
int main()
{
char a;
a = getch();
printf("你刚才输入的字符是%c", a);
return 0;
}
输出结果:
你刚才输入的字符是h
getchar()读取一个字符,输入后等待用户按“Enter”键结束(带回显);
getche()读取一个字符,输入后立即获取字符,不用按“Enter”键结束(带回显);
getch()读取一个字符,输入后立即获取字符,不用按“Enter”键结束(不带回显);
第3节 字符的本质
循环变量i从1开始一直循环到128:
int main()
{
int i;
for (i = 0; i <= 127; i++)
{
printf("%d %c\n", i, i);
}
return 0;
}
输出结果:
apple
pear
orange
hello
world
apple
hello
orange
pear
world
第4节 人名怎么存储呢
比较两个人的分数高低:
#include <stdio.h>
int main()
{
char a[101], b[101];
int x, y;
scanf("%s", a);
scanf("%x", &x);
scanf("%s", b);
scanf("%x", &y);
if (x > y)
{
printf("%s", a);
}
else
{
if (x < y)
{
printf("%s", b);
}
else
{
printf("%s和%s的分数相同", a, b);
}
}
return 0;
}
输出结果:
读取字符串除了用scanf外还可以用gets,它们有细微的区别,分别运行代码并输入Tom SMith:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a[10];
scanf("%s", a);
printf("%s", a);
return 0;
}
输出结果:
---------------------------------------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a[10];
gets(a);
printf("%s", a);
return 0;
}
输出结果:
--------------------------------------------------------------------------------------------------------------------------------由此可见,用scanf进行字符串读入时,遇到空格就提前终止了,但是用gets进行读入时却可以读入一整行。
同样,输出字符串除了用printf以外还可以用puts,用法如下:
puts(a);
使用puts(a)输出时,会在末尾自动换到下一行,相当于printf("%s\n",a)。
给单个字符赋初始值很简单,但是如何给一个字符数组赋初始值呢?也很简单,在字符串的两边加上双引号和花括号就可以。例如:
char a[10] = {"hello"};
第5节 逻辑挑战16:字母的排序
读入1行小写字母,然后将这行字母从a到z进行排序:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a[101], t;
int len, i, j;
gets(a);
len = strlen(a);
for (i = 0; i <= len - 2; i++)
{
for (j = i + 1; j <= len - 1; j++)
{
if (a[i] > a[j])
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
puts(a);
return 0;
}
输出结果:
第6节 逻辑挑战17:字典序
输出两个字符串,将其按字典序输出:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a[101], b[101];
gets(a);
gets(b);
if (strcmp(a, b) <= 0)
{
puts(a);
puts(b);
}
else
{
puts(b);
puts(a);
}
return 0;
}
输出结果:
第7行 多行字符
输入5个单词,然后吧这些单词按照字典序输出:
#include <string.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
char a[5][11], t[11];
int i, j;
for (i = 0; i <= 4; i++)
{
gets(a[i]);
}
for (i = 0; i <= 3; i++)
{
for (j = i + 1; j <= 4; j++)
{
if (strcmp(a[i], a[j]) > 0)
{
strcpy(t, a[i]);
strcpy(a[i], a[j]);
strcpy(a[j], t);
}
}
}
for (i = 0; i <= 4; i++)
{
puts(a[i]);
}
return 0;
}
输出结果:
第8节 存储一个迷宫
一维字符数组初始化:
char a[10] = {"hello"};
二维字符数组初始化:
char a[2][10] = {"hello","word"};
char a[2][10] = {"hello",
"world"};
初始化迷宫:
#include <string.h>
int main()
{
int i;
char a[7][12] =
{
"###########",
"#O # ###",
"# ## ## #",
"# # # #",
"# #### ## #",
"# # ",
"###########",
};
for (i = 0; i < 7; i++)
{
puts(a[i]);
}
system("pause");
return 0;
}
输出结果:
###########
#O # ###
# ## ## #
# # # #
# #### ## #
# #
###########
第8章 游戏时间到了
第1节 走迷宫
向上移动时,小球还在当前列,但不在这一行而在上一行,因此向上移动是y不变,x减1;
向下移动时,小球还在当前列,但不在这一行而在下一行,因此向下移动是y不变,x加1;
向左移动时,小球还在当前行,但不在这一列而在上一列,因此向上移动是x不变,y减1;
向右移动时,小球还在当前行,但不在这一列而在下一列,因此向下移动是x不变,y加1;
x - 1 y - 1 | x - 1 y | x - 1 y + 1 |
x y - 1 | x y | x y + 1 |
x + 1 y - 1 | x + 1 y | x + 1 y + 1 |
走迷宫:
#include <windows.h>
int main()
{
char a[50][50] = {
"######",
"#O # ",
"# ## #",
"# # #",
"## #",
"######",
};
int i, x, y, p, q;
char ch;
x = 1; y = 1; p = 1; q = 5;
for (i = 0; i <= 5; i++)
puts(a[i]);
while (x != p || y != q)
{
ch = getch();
if (ch == 's')
{
if (a[x + 1][y] != "#")
{
a[x][y] = ' ';
x++;
a[x][y] = '0';
}
}
if (ch == 'w')
{
if (a[x - 1][y] != '#')
{
a[x][y] = ' ';
x--;
a[x][y] = 'O';
}
}
if (ch == 'a')
{
if (a[x][y - 1] != '#')
{
a[x][y] = ' ';
y--;
a[x][y] = 'O';
}
}
if (ch == 'd')
{
if (a[x][y + 1] != '#')
{
a[x][y] = ' ';
y++;
a[x][y] = 'O';
}
}
system("cls");
for (i = 0; i <= 5; i++)
puts(a[i]);
}
system("cls");
printf("You win!\n");
Sleep(5000);
return 0;
}
输出结果:
第2节 推箱子
推箱子:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<conio.h>
int x = 0, y = 0;
//存储当前使用的地图
int map[10][10] = { 0 };
//地图 1
int map_1[10][10] = {
{ 0,0,1,1,1,0,0,0 },
{ 0,0,1,4,1,0,0,0 },
{ 0,0,1,0,1,1,1,1 },
{ 1,1,1,0,0,2,4,1 },
{ 1,4,2,2,0,1,1,1 },
{ 1,1,1,3,2,1,0,0 },
{ 0,0,0,1,4,1,0,0 },
{ 0,0,0,1,1,1,0,0 }
};
//地图 2
int map_2[10][10] = {
{ 0,0,0,1,1,1,1,1,1,1 },
{ 0,0,1,1,0,0,1,0,3,1 },
{ 0,0,1,0,0,0,1,0,0,1 },
{ 0,0,1,2,0,2,0,2,0,1 },
{ 0,0,1,0,2,1,1,0,0,1 },
{ 1,1,1,0,2,0,1,0,1,1 },
{ 1,4,4,4,4,4,0,0,1,0 },
{ 1,1,1,1,1,1,1,1,1,0 },
};
//判断游戏是否挑战成功
int finish();
//控制小人移动
void move(int x1, int y1, int x2, int y2);
//根据二维数组,渲染地图
int render();
//查找小人所在的当前位置
void find();
//根据用户输入,确定用户选择哪张地图
void setmap(int n);
//设置文本显示时的颜色
void color(int m);
int main() {
int n;
char dir;
char c;
printf("**************推箱子游戏欢迎您***************\n"
"* *\n"
"* ----------------------- *\n"
"* | Powered By c.biancheng.net | *\n"
"* ----------------------- *\n"
"* *\n"
"* ♀:自己的位置 *\n"
"* ☆:箱子要到的的位置 *\n"
"* ■:箱子的位置 *\n"
"* *\n"
"* | 游戏规则 | *\n"
"* *\n"
"* 控制♀将■推到☆的位置 *\n"
"* 按 wasd 控制♀的移动 *\n"
"* 按 r 重新开始游戏 *\n"
"* 按 q 退出游戏 *\n"
"*********************************************\n");
color(0xA);
printf("请选择关卡:(1/2)(0:退出游戏):");
while (scanf("%d", &n)) {
getchar();
//n==0,游戏退出
if (n == 0) {
printf("game over\n");
break;
}
system("cls");//清空命令行窗口中显示的所有信息
if (n == 1 || n == 2) {
setmap(n);//根据 n 的值,设置当前地图
render();//根据所选地图,在命令行窗口中将其渲染出来
//游戏开始,用户输入字符w/a/s/d,控制小人移动
while ((dir = _getch()) != EOF) {
system("cls");//移动之前,删除原有命令行中的地图
find();//移动之前,需找到当前小人所在的位置
//根据 dir 字符的值,控制小人的移动,以及设置重新开始和退出选项的操作
switch (dir) {
case 'w':move(x - 1, y, x - 2, y); break;
case 's':move(x + 1, y, x + 2, y); break;
case 'a':move(x, y - 1, x, y - 2); break;
case 'd':move(x, y + 1, x, y + 2); break;
case 'r':setmap(n); break;
case 'q':return 0;
}
//重新渲染人移动后的场景
render();
//每次移动,判断是否挑战成功
if (finish()) {
printf("游戏胜利,请重新选择关卡(1/2)(0:退出游戏):");
break;
}
}
}
else {
printf("输入有误,请重新输入\n");
printf("请选择关卡:(1/2)(0:退出游戏):");
}
}
system("pause");
return 0;
}
// 按w的时候的输出结果
void move(int x1, int y1, int x2, int y2) {
if (map[x][y] == 3) //找到自己的位置
{
//人前边是箱子,箱子在空格上
if (map[x1][y1] == 2) {
//箱子前边是空格
if (map[x2][y2] == 0) {
map[x][y] = 0;
map[x1][y1] = 3;
map[x2][y2] = 2;
}
//箱子前边是位置
if (map[x2][y2] == 4) {
map[x][y] = 0;
map[x1][y1] = 3;
map[x2][y2] = 5;
}
}
//人前是箱子,箱子在位置上
if (map[x1][y1] == 5) {
//箱子前边是空格
if (map[x2][y2] == 0) {
map[x][y] = 0;
map[x1][y1] = 6;
map[x2][y2] = 2;
}
//箱子前边是位置
if (map[x2][y2] == 4) {
map[x][y] = 0;
map[x1][y1] = 6;
map[x2][y2] = 5;
}
}
//人前为空格
if (map[x1][y1] == 0) {
map[x1][y1] = 3;
map[x][y] = 0;
}
if (map[x1][y1] == 4) {
map[x][y] = 0;
map[x1][y1] = 6;
}
}
if (map[x][y] == 6) //人在位置上
{
//位置前是箱子,箱子在空格上
if (map[x1][y1] == 2) {
//箱子前是空格
if (map[x2][y2] == 0) {
map[x][y] = 4;
map[x1][y1] = 3;
map[x2][y2] = 2;
}
//箱子前是位置
if (map[x2][y2] == 4) {
map[x][y] = 4;
map[x1][y1] = 3;
map[x2][y2] = 5;
}
}
//位置前是箱子,箱子在位置上
if (map[x1][y1] == 5) {
//箱子前是空格
if (map[x2][y2] == 0) {
map[x][y] = 4;
map[x1][y1] = 6;
map[x2][y2] = 2;
}
//箱子前是位置
if (map[x2][y2] == 4) {
map[x][y] = 4;
map[x1][y1] = 6;
map[x2][y2] = 5;
}
}
//人前面是位置
if (map[x1][y1] == 4) {
map[x][y] = 4;
map[x1][y1] = 6;
}
//人前面是空格
if (map[x1][y1] == 0) {
map[x][y] = 4;
map[x1][y1] = 3;
}
}
}
void find() {
for (x = 0; x < 10; x++) {
for (y = 0; y < 10; y++) {
if (map[x][y] == 3 || map[x][y] == 6) {
return;
}
}
}
}
int render() {
for (x = 0; x < 10; x++) {
for (y = 0; y < 10; y++) {
if (map[x][y] == 1) {
color(8);
printf("■"); //输出砖块的样子
}
if (map[x][y] == 3) {
color(3);
printf("♀"); //输出自己的位置
}
if (map[x][y] == 2) {
color(4);
printf("■"); //输出箱子
}
if (map[x][y] == 4) {
color(0xE);
printf("☆"); //输出箱子要到的位置
}
if (map[x][y] == 0) {
color(0xF);
printf(" "); //输出空白
}
if (map[x][y] == 5) {
color(6);
printf("★"); //箱子到达目标位置后的图标
}
if (map[x][y] == 6) {
color(3);
printf("♀");//人达到星星处,要由☆改为♀
}
}
printf("\n");
}
return 0;
}
void setmap(int n) {
if (n == 1) {
memcpy(map, map_1, sizeof(map_1));
}
if (n == 2) {
memcpy(map, map_2, sizeof(map_2));
}
}
int finish()
{
for (x = 0; x < 10; x++) {
for (y = 0; y < 10; y++) {
if (map[x][y] == 2)
return 0;
}
}
return 1;
}
void color(int m) {
HANDLE consolehend;
consolehend = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(consolehend, m);
}
输出效果: