猜数字游戏
#define _CRT_SECURE_NO_WARNINGS #include
#include #include void menu() { printf("------------------------\n"); printf("-----1.开始 2.退出------\n"); printf("------------------------\n"); } void game() { int ret = rand() % 100 + 1; int guess = 0; while (1) { printf("请猜数字>"); scanf("%d", &guess); if (guess < ret) { printf("猜小了!\n"); } else if(guess > ret) { printf("猜大了!\n"); } else { printf("恭喜你,猜中了\n"); break; } } } int main() { srand((unsigned int)time(NULL));//生成随机数 int input = 0; do { menu(); printf("请选择>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏!\n"); break; default: printf("选择错误,请重新选择!\n"); break; } } while (input); return 0; }
1、一个工程中可以有多个.c,多个.c中只有一个main函数,函数改变实参需要使用指针变量传参
#include
int main() { int* p = 1;//*是解引用,P是地址 return 0; } 取地址p
0x0000003EB156FB28就是p的地址啦
2、函数参数
真实传成函数的参数叫实参,参数可以是函数,常量,变量,指针变量,表达式,函数为参数是必须有明确的返回值
形式参数是指函数各后括号中的变量,形式参数只有在调用的时候,形式参数开辟空间,函数结束自动销毁(形式参数只有在函数中有效)
形参实例化相当于实参临时改变
2.1、函数调用
1;传值调用 Swap(a,b) 传的是值本身 形参实参占用不同的内存块,相互不影响
2;传址调用 Swap(&a,&b) 传的是地址 形参和实参建立某种联系
3、下列函数判断是否为素数
if m = a*b
so a和b一定有一个数字==sqrt(m);
偶数不能为素数
#include
#include
int is_prime(int n)
{
for (int i = 2; i < sqrt(n); i++)
{
if (n%i == 0)
{
return 0;
}
}
return 1;
}
int main()
{
int count = 0;
for (int i = 1; i < 200; i+=2)
{
if (is_prime(i))
{
printf("%d ", i);
count++;
}
}
printf("\n count = %d\n", count);
return 0;
}
4、函数判断是否为闰年
#include
int main()
{
for (int year = 1000; year <= 2000; year++)
{
//判断year是不是闰年
if (year % 4 == 0)
{
if (year%100 != 0)
{
printf("%d ", year);
}
}if (year%400 == 0)
{
printf("%d ", year);
}
}
return 0;
}
5、函数有序数组二分法查找
#include
int binary_search(int arr[],int find,int size)
{
int left = 0;
int right = size - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] > find)
{
right = mid - 1;
}if (arr[mid] < find)
{
left = mid + 1;
}
else if(arr[mid] == find)
{
return mid;
}
}
return -1;//自定义函数可以返回-1
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,11 };
int find = 7;
int size = sizeof(arr) / sizeof(arr[0]);
int ret = binary_search(arr, find, size);
if (ret == -1)
{
printf("找不到\n");
}
else
{
printf("找到了,下标是%d\n",ret);
}
return 0;
}
数组传参只是把数组首元素指针传过去,所以在函数内部计算函数部分的数组的元素个数不靠谱的,arr看上去是数组,本质上是指针
6、函数调用num加1
#include
void Add(int *p)
{
(*p)++;
}
int main()
{
int num = 0;
Add(&num);
printf("%d\n", num);
return 0;
}
7、函数嵌套调用
函数可以互相调用,但是不能嵌套定义
//链式访问,以来函数返回值
#include
#include
int main()
{
int len = strlen("asdfg");//5
printf("%d\n", len);//返回打印符号
printf("%d", printf("%d", printf("%d", 43)));
// 1 -< 2 <- 43
return 0;
}
函数不写返回值时,默认返回int,不写返回值,默认最后一条的返回值
void test(void) 表示函数不接受参数
int main(void) //明确的说明,main函数不需要参数
//本质上是有3个参数
int main(int argc,char* argv[],char *envp[])