C语言 练习题

时间:2022-11-08 07:21:34

#include<stdio.h>

//return 只能返回一个数!!!!!

//函数不可以嵌套调用!!!!! 但是可以嵌套定义

//函数必须保证 先 声明 后 使用

//函数的设计应该尽量 高内聚 低耦合!!!!!!

//函数应该尽量 少 的去使用全局变量!!!!!

//函数当中形参是在栈当中保存的!!!!!

//逗号表达式-(a,b,c,d,e,f。。n)整个表达式结果是()里最后一个表达式的结果  n

//sizeof函数求的是数组的字节大小 -cahr 当中\0也是一个大小!!!!!

//stelen char当中不算\0所占字符串大小!!!!!

//随着数组下标由小到大变化 -地址由低到高变化 (数组里面相邻元素的地址是连续的)

//表达式求值先看是否存在整形提升与算术装换 后进行计算!!!!!


//在32位下 :int类型:占 4 个字节;指针占 4 个字节;操作系统可以使用的最大内存空间 2^32!!!!!!!!!!

//在64位下 :int类型:占 4 个字节;指针占 8 个字节;操作系统可以使用的最大内存空间 2^64


//定义全局变量一般不初始化默认是0 !!!!!(定义在main()之前的变量)


//递归是不能无限递归下去的



//定义一个函数Init()使得函数初始化全为0

//定义函数daying()使得函数打印数组当中的元素

//定义函数nizi()实行数组元素的逆置(数组元素倒放) 再打印数组元素

//void Init(int arr[], int sz)//因为不用返回值 所以定义为void  

//{

// int i = 0;

// for (i = 0; i < sz; i++)

// {

//  arr[i] = 0;

// }

//

//}


//void daying(int arr[],int sz)

//{

// int i = 0;

// for (i = 0; i < sz; i++)

// {

//  printf("%d ", arr[i]);

// }

//}

//void nizi(int arr[], int sz)//其实逆置可以把元素两两交换

//{

// int left = 0;

// int right = sz-1;

// int i ;

// while (left < right)

// {

//  i = arr[left];

//  arr[left] = arr[right];

//  arr[right] = i;

//  left++;//记得要left与right移动!!!!!

//  right--;

// }

// printf("\n");//使得两组数据不同行

//}

//int main()

//{

// int arr[11] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11 };

// int sz = sizeof(arr) / sizeof(arr[0]);

// //Init(arr, sz);//初始化  

// daying(arr, sz);//打印数组元素

// nizi(arr, sz);//逆置数组

// daying(arr, sz);//打印逆置数组元素

// return 0;

//}



//交换数组a与b(数组a b一样大)的元素

//void jh(int a[], int b[],int sz)

//{

// int i= 0;

// for (i = 0; i < sz; i++)

// {

//  int temp= a[i];

//  a[i] = b[i];

//  b[i] = temp;

// }

//}

//void daying(int arr[],int sz)

//{

// int i = 0;

// for (i = 0; i < sz; i++)

// {

//  printf("%d ", arr[i]);

// }

// printf("\n");

//}

//int main()

//{

// int a[] = { 1, 3, 5, 7, 9 };

// int b[] = { 2, 4, 6, 8, 10 };

// int sz = sizeof(a) / sizeof(a[0]);

// jh(a, b,sz);

// daying(a, sz);//打印数组当中的元素

// daying(b, sz);

// return 0;

//}



//int a[]={1,1,1,1,1}

//short* p=(short*)a  --把 int a 强制类型转换成 short a 类型  !!!!!(short一个占2个字节)


//int a =0x11223344   --在内存当中是到着存放的 44 33 22 11 -4个字节

//cahr* p=(cahr*)&a;*p=0; --因为char是一个字节 所以只改变了 44 这个字节使得其变成了 00;!!!!!  所以输出 11223300;




//int i;//定义全局变量 -不初始化默认为 0

//int main()

//{

// i--;//-1

// if (i > sizeof(i))//sizeof()是计算变量、类型所占内存的大小   一定是>=0的!!!!!并且是无符号的 !!!!!所以 i也会转化成无符号表达的!!!!!

// {

//  printf(">\n");

// }

// else{

//  printf("<\n");

// }

// return 0;

//}



//统计变量当中二进制当中1的个数!!!!!


//#include<stdlib.h>

//int count_bit_one(unsigned int n)//如果n是负数的话把其换成 无符号来计算 最高位不是符号位  

//{

// int count = 0;

// //可利用二进制/2 %2来判断1的个数

// while (n)//while不为0即可以运行

// {

//  if (n % 2 == 1)

//  {

//   count++;

//  }

//  n = n / 2;

// }

// return count;

//}


//int count_bit_oneer(int n)

//{

// int count = 0;

// int i = 0;

// for (i = 0; i < 32; i++)//因为int 是4个字节 32位编译器当中是 32 位的

// {

//  if (((n >> i) & 1) == 1)//不断向右移动 i位 与上1 看其是否!=1;

//  {

//   count++;

//  }

// }

// return count;

//}



//int count_bit_onesahng(int n)//最好的方法!!!!!

//{

// int count = 0;

// while (n)

// {

//  n = n&(n - 1);

//  count++;

// }

// return count;

//}


//int main()

//{

// int a = 0;

// scanf_s("%d", &a);

// //写一个函数求二进制表示当中有几个一  -该变量的二进制表示是 补码!!!!!

// //int count = count_bit_one(a);//法一 :循环法

// //int count = count_bit_oneer(a);//法二 :按位与

//       int count = count_bit_onesahng(a);//法三:n&n-1

// printf("%d\n", count);

// //system("pause");//system库函数-执行系统命令-pause(暂停)  要加上头文件#include<stdlib.h>   此代码与系统当中的应用台是功能一样的!!!!!

// return 0;

//}




//统计两个int变量当中的二进制有多少位是不同的


//int get_diff_bit(int m, int n)

//{

// int count = 0;

// int tmp = m^n;//异或  相同为0,不同为1

// while (tmp)//利用上面的函数 求其中二进制位有多少个1 !!!!!

//   {

//    tmp = tmp&(tmp - 1);

//    count++;

//   }

// return count;

//}


//int main()

//{

// int m = 0;

// int n = 0;

// scanf_s("%d%d", &m, &n);

// int count = get_diff_bit(m, n);

// printf("%d\n", count);

// return 0;

//}



//获取int 变量当中的二进制的 奇数位与偶数位  并且分别打印!!!!!

//void print(int m)

//{

// int i = 0;

// printf("打印的是奇数位");

// for (i = 30; i >= 0; i -= 2)

// {

//  printf("%d", (m >> i) & 1);

// }

// printf("\n");

// printf("打印的是偶数位");

// for (i = 31; i >= 1; i -= 2)

// {

//  printf("%d", (m >> i) & 1);

// }

//}

// int main()

// {

//  int m = 0;

//  scanf_s("%d", &m);

//  print(m);

//  return 0;

// }




//输出乘法口诀表

//void print_table(int n)

//{

// int i = 0;

// for (i = 1; i <= n; i++)//表示的是行

// {

//  int j = 0;

//  for (j = 1; j <= i; j++)//表示列 (<=i可以控制其打印的项数)

//  {

//   printf("%d * %d = %-3d ", i, j, i*j);  //%-3d表示的是 输出之间相隔3个字符位

//  }

//  printf("\n");//打印完一行之后换行

// }

//}

//int main()

//{

// int n = 0;

// scanf_s("%d", &n);

// print_table(n);

// return 0;

//}





//逆序字符串数组

//#include<string.h>


//如果不能使用C语言原本的库函数

int my_strlen(char* str)

{

int count = 0;

while (*str != '\0')//其不等于\0就是有效字符

{

 count++;

 str++;

}

return count;

}

void reverse_string(char* arr)

{

int left = 0;

//int right = strlen(arr)-1;//strlen是计算字符串的长度  应该包含头文件#include<string.h>

int right = my_strlen(arr) - 1;

while (left < right)

{

 int tep = arr[left];

 arr[left] = arr[right];

 arr[right] = tep;

 left++;

 right--;

}

}

int main()

{

char arr[] = "hello world";

reverse_string(arr);//传递的是arr首元素的地址

printf("%s\n", arr);

return 0;

}