萌新的c语言学习6
题目1 常用显示模块的编写
void xianshi(char board[Hang][Lie], int hang, int lie)//显示模块
{
int i = 0;
for (i = 0; i < hang; i++)
{
//打印一行数据
//打印份隔行
int j = 0;
for (j = 0; j < lie; j++)
{
printf(" %c ", board[i][j]);
if (j < lie - 1)
printf("|");
}
printf("\n");
//上面的操作针对一行 ,一个数输完打印然后仅在前两个之后输出一个"|"
if (i < hang - 1)
{
for (j = 0; j < lie; j++)
{
printf("---");
if (j < lie - 1)
printf("|");
}
printf("\n");
//同理对于上面以列为标准附加”---"
}
}
}
题目2 c语言字符和字符串的含义
1.字符串和字符基础
字符是构成源程序的基本单位,在源程序中,当一个字符被认为是一个字符常量。字符常量实际是一个整数,对应其ASCLL码中的值。
字符串是用一对双撇号引起来的,做为一整体对待的一串字符。组成字符串的字符可以是字母、数字一起各种特殊字符。
字符串的定义:字符串是多个字符组成的
单个字符定义:char ch = ‘a’;
字符串的定义:
1.char ch[ ] = {‘a’,‘b’,‘c’,‘d’};
2.char ch[ ] = “hello”;
字符串的本质就是数组,只不过比字符数组多存了一个标志字符“\0”,"\0"就时字符串的结束标志。
c语言的字符是由‘ ’ 单引号构成
c语言的字符串是由双引号构成 “ ”
字符他其实键盘上每一个字符都对应这ASIC码值
而字符串内部可以只由一个字母构成,但是写成字符串,末尾以\0结束
题目3 大小端
int main()
{
int a = 1;//要么0x00 00 00 14要么0x 14 00 00 00
char* p = (char*)&a;//强制将a转化成char类型 只能访问一个字节
if (*p==1)//低位放到低位是小端
{
printf(“是xiao端”);
}
else
printf(“是da端”);
return 0;
}//小端存储
题目4 数组指针的用法
void printf1(int arr[3][5], int x, int y)
{
int i = 0;
int j = 0;
for (i = 0; i < x; i++)
{
for (j = 0; j < y; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
void printf2(int(*p)[5], int x, int y)
{
//二维数组的首元素地址是整行!!!!!
//二维数组那么就是第一行元素的地址
int i = 0;
int j = 0;
for (i = 0; i < x; i++)
{
for (j = 0; j < y; j++)
{
printf("%d ", *(*(p + i) + j));
}
printf("\n");
}
//这边的意思就是p我代表的是数组的地址 *p那就是数组例如arr
// 但是数组arr也可以理解成首元素地址
// 那么就是arr+1 那是不是第二个元素的地址 我再取地址
// 那是不是就是第二个元素的值
//
//
//
//
}
//我们在这里想要通过首元素地址求解,那么就在定义中
//不能像上面那个过程一样得在文件包含中写入
int main()
{
int arr[3][5] = { { 1,2,3,4,5 }, { 2,3,4,5,6 }, { 3,4,5,6,7 } };
//二位数组
printf1(arr, 3, 5);//数组是一个特别有意思的该概念除了两种情况以外
//数组名就是首元素地址
printf2(arr, 3, 5);
return 0;
}
//完美展现
//在我们假想中是 1 2 3 4 5
//2 3 4 5 6
// 3 4 5 6 7
int main()
{
int arr[5] = {1,2,3,4,5};
int (*p)[5] = &arr;
//arr既是数组名字也是首元素地址
//p是数组的地址 那么*p是不是就代表了数组 以及数组的内容
printf("%d\n", arr);//乱码
printf("%d\n", arr);//乱码
printf("%d\n", *p);//乱码和上面那个一摸一样因为就是代表着arr
printf("%d\n", arr[0]); //1
printf("%d\n", (*p)[0]);//都表示第一个元素1
printf("%d\n", *(arr+1));//地址加1 取值那就是2
printf("%d\n", *(*p + 1));//2
return 0;
}
int arr[5]; arr 是一个5个元素的整型数组
int parr1[5]; []优先级高 parr1是一个数组 内有5元素 元素类型是int指针数组
int(*parr2)[5]; parr2是一个指针 该指针指向了一个数组 该数组有5个元素 每个元素类型是int 数组指针
int(parr3[10])[5];parr3是数组 除了数组名和方块剩下的就是元素类型int( )[5]
Parr3是一个数组 该数组有十个元素 每个元素是一个数组指针
该数组指针指向的数组有5个元素 每个人元素类型是int
题目5 函数指针的用法
int main()
{
int input = 0;
int x = 0;
int y = 0;
do
{
menu();
printf("请选择:");
scanf("%d\n", &input);
printf("请输入两个操作数:");
scanf("%d%d", &x, &y);
switch (input)
{
case 1:printf("请输入两个操作数:"); printf("%d\n",add(x,y)); break;
case 2:printf("请输入两个操作数:"); printf("%d\n",sub(x,y)); break;
case 3: printf("请输入两个操作数:"); printf("%d\n",mul(x,y)); break;
case 4: printf("请输入两个操作数:"); printf("%d\n",div(x,y)); break;
case 0: printf("请输入两个操作数:"); printf("youxijieshu"); break;
default:
printf("xuanzecuowu "); break;
}
}
while (input);
return 0;
}
法二
int main()
{
int input = 0;
int x = 0;
int y = 0;
int (*pf[5])(int, int) = { 0,add,sub,mul,div };
do
{
menu();
printf("请选择:");
scanf("%d\n", &input);
if (input >= 1 && input <= 4)
{
printf("请输入操作数:");
scanf("%d%d", &x, &y);
printf("%d", pf[input](x, y));
}
else if (input == 0)
{
printf("tuichu:\n");
}
else
printf("qingchongxin输入");
}
while (input);
return 0;
}
法三
int add(int x, int y)
{
return x + y;
}
int sub(int x, int y)
{
return x - y;
}int mul(int x, int y)
{
return x * y;
}
int div(int x, int y)
{
return x / y;
}
void calc(int (*pf)(int, int))
{
int x = 0;
int y = 0;
printf("请输入操作数:");
scanf("%d%d", &x, &y);
printf("%d\n", pf(x, y));
}
void menu()
{
printf("********************************\n");
printf("***1.add 2.sub *********\n");
printf("***3. mul 4.div ***********\n");
printf("********0.exit********\n");
printf("*******************************\n");
printf("*******************************\n");
}
int main()
{
int input = 0;
int (*pf[5])(int, int) = { 0,add,sub,mul,div };
do
{
menu();
printf("请选择:");
scanf("%d\n", &input);
switch (input)
{
case 1:calc(add); break;
case 2:calc(sub); break;
case 3:calc(mul); break;
case 4:calc(div); break;
case 0:printf("退出\n"); break;
default:printf("选择错误\n"); break;
}
}
while (input);
return 0;
}
//回调函数的做法
法四
{
int arr[10] = { 0 };
int(*p)[10] = &arr;//这是我们上次显示的数组指针
//意思是p指向了数组的地址
//*p=arr
//int(*pf)(int, int);//pf是函数指针
int(*pfarr[4])(int, int);//函数指针的数组
//表示的是函数指针的数组 ,我里面的东西是函数的指针
int(*(*ppfarr)[4])(int, int) = &pfarr;
//ppfarr指向的是pfarr的地址
//叫指向函数指针数组的指针
//意思就是我这个ppfarr 这个指针 指向了你这个数组的地址
//那么我*ppfarr是不是就是这个数组 (数组有4个元素,每个元素是其他函数的指针)
return 0;
}
题目6 简易冒泡函数
void bubble_sort(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int a = 0;
int temp = 0;
int j = 0;
for (j = 0; j < sz - 1-i; j++)
{
if (arr[j] > arr[j+1])
{
a = arr[j];
arr[j] = arr[j + 1];
arr[j+1] = a;
}
}
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1 };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
///想要排成升序的效果
bubble_sort(arr,sz);///冒泡排序函数
for (i = 0; i < sz; i++)
{
printf("%d", arr[i]);
}
return 0;
}