#define _CRT_SECURE_NO_WARNINGS
//一个工程中可以有多个 .c,但是只能有一个库函数
//------------------------------------------------------------------------------------------------------------3. 函数的参数
// 实际参数(实参)和 形式参数(形参)
#include <stdio.h>
#include <math.h>
//--------------------------------------------写一个函数可以交换两个整型变量的内容 (错版)
/*
void Swap(int x, int y) //函数定义
{
int z = 0;
z = x;
x = y;
y = z;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("交换前: a=%d b=%d\n", a, b); //10 20
//调用函数来交换
Swap(a, b); // 只需要交换,不需要返回,所以不用 int
// a 和 b 叫实参,函数里的 x y 叫形参(形式参数)
// 实参ab传给形参xy时,形参只不过是实参的一份临时拷贝,只拷贝过去了数据,但是实参的独立空间还在
// 所以修改形参,不会影响实参
printf("交换后: a=%d b=%d\n", a, b);//10 20 ---------------------------(交换失败)
return 0;
}
*/
//--------------------------------------------写一个函数可以交换两个整型变量的内容 (对版)
//void Swap(int* px, int* py) // 交换数值-----传地址实现
//{
// int z = *px; //z=a
// *px = *py; //a=b
// *py = z; //b=a
//}
//
//int ADD(int x, int y) // 求和函数-----为什么不用传地址?
//{
// int s = 0;
// s = x + y;
// return s;
//}
//
//int main()
//{
// int a = 0;
// int b = 0;
// scanf("%d %d", &a, &b);
// printf("交换前: a=%d b=%d\n", a, b); //10 20
//
//
// Swap(&a, &b); //把地址所指向的内容的值交换
// //&a, &b 是实参
// printf("交换后: a=%d b=%d\n", a, b);// 20 10----------------------交换成功
//
// int add=ADD(a, b); // a 和 b 的值不需要改变时,就必须要取地址
// // a,b是实参
// printf("%d\n", add);
//
// return 0;
//}
//--------------------------------------------------------------------------------------------------3.1 实际参数(实参)
/*
真实传给函数的参数,叫实参
实参可以是:常量,变量,表达式,函数等
无论实参是何种类型的变量,在进行函数调用时,他们必须有确定的值,以便把这些值传送给形参
*/
//--------------------------------------------------------------------------------------------------3.2 形式参数(形参)
/*
形式参数是指函数名后括号中的变量,因为形参只有在函数被调用的过程中才实例化(分配内存单元)
所以叫形参。形式参数当函数调用完之后就彻底销毁了。因为形参只有在函数中才有效。
*/
//形参实例化之后相当于实参的一份临时拷贝,对形参的修改不会影响实参
//-----------------------------------------------------------------------------------------------------------4. 函数的调用
//--------------------------------------------------------------------------------------------------4.1 传值调用
//函数的实参和形参分别占有不同的内存块,对形参的修改不会影响实参
//--------------------------------------------------------------------------------------------------4.2 传址调用
/*
传址调用 是把函数外部创建变量的 地址 传递给函数参数 的一种调用函数的方式
这种传参方式可以让 函数 和 函数外边 的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量
*/
/*
void Swap1(int x, int y)
{
int z = 0;
z = x;
x = y;
y = z;
}
void Swap2(int* px, int* py) //形参的指针变量 px py 存的是实参的地址
{
int z = *px;
*px = *py;
*py = z;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("交换前: a=%d b=%d\n", a, b);
Swap1(a, b); //传值调用
Swap2(&a, &b); //传址调用
printf("交换后: a=%d b=%d\n", a, b);
return 0;
}
*/
//--------------------------------------------------------------------------------------------------4.3 练习
//--------------------------------0. 打印100-200之间的素数(版本1:没有函数)------------------------------
// 素数是只能被 1和它本身 整除的数
/*
int main()
{
int i = 0;
int count = 0;
// for (i = 100; i <= 200; i++)
//---------可优化--------------------------------------------------
for (i = 101; i <= 200; i+=2) //排除偶数
{
//判断 i 是否是素数
//是素数就打印
//拿 2-----i-1之间的数字,去试除
int flag = 1;// flag是1 表示他是素数
int j = 0;
//for (j = 2; j <= i - 1; j++)
//---------可优化--------------------------------------------------
for (j = 2; j <=sqrt(i); j++) // sqrt()数学库函数,开平方使用,需要引用头文件 <math.h>
{
if (i% j == 0)
{
flag = 0;
//break;
}
}
if (flag == 1)
{
count++;
printf("%d ", i);
}
}
printf("\ncount=%d\n", count);
return 0;
}
*/
//------------------------------------1.写一个函数,判断一个数是不是素数---------------------------------
//是素数,返回1
//不是素数,返回0
int is_prime(int n)
{
int j = 0;
for (j = 2; j <= sqrt(n); j++)
{
if (n % j == 0)
{
return 0;
}
}
return 1;
}
int main()
{
int i = 0;
int count = 0;
for (i = 101; i <= 200; i += 2) //排除偶数
{
if (is_prime(i)) //调用函数 如果 is_prime(i) 为真,打印
{
count++;
printf("%d ", i);
}
}
printf("\ncount=%d\n", count);
return 0;
}