//day 1!!!!!

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h> //意思是包含stdio.h里面的头文件 包含输入 输出里面的函数

int main(){
printf("hellow wold.\n");//printf是C语言里本身就有的 库函数
return 0;
}
//键盘 fn+f10 可以在VS 里逐条运行程序


//day2!!!!!

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//int main()
//{
//字符类型
//char ch = 'a'; //整形 !!! 计算机内存申请一个空间来存储 a

//int age = 20;

//short num = 10; ////短整形
//long 长整形

//float weight = 55.5; //单精度浮点型 浮点数 -小数
//double d = 0.0; //双精度浮点型 小数点后面位数多一些
//}

//int main()
//{
//printf("打印一个整数\n");
//printf("%d\n" , 100); //打印一个整数


//sizeof-关键字-操作符-计算类型或变量所占空间的大小
//bit-比特位-计算机(通电 -正电 1;负电 -0) 最小单位 !!!, 一个bit存放一个二进制
//byte-字节=8bit
//kb-1024byte
//mb-102kb
//gd-1024mb
//tb-1024gd
//pd-1024tb

//sizeof() --。。的大小,其变量可以向计算机申请多少空间

// printf("%d\n", sizeof(char)); //1 字节
//printf("%d\n", sizeof(short));
//printf("%d\n", sizeof(int));
//printf("%d\n", sizeof(long));
//printf("%d\n", sizeof(long long));
//printf("%d\n", sizeof(float));
//printf("%d\n", sizeof(double));
//}

//int main()
//{
// //创建一个变量
// //类型 变量的名字=0;
// int age = 20;
/*
short age =10; //向内存申请两个字节=16bit,用来存储10
*/
// double weight = 75.3;
//
// age = age + 1;
// weight = weight - 10;
// printf("%d\n", age);//%d- 整形
// printf("%1f\n", weight);//浮点型用1f-double
// //%f-float
// return 0;
//}
int main()
{
int a = 0;
int b = 0;
int sum = 0;
scanf("%d %d", &a, &b);// scanf 函数应该把“#define_CRT_SECURE_NO_WARNINGS 1”放在第一行
//这个函数是VS编译语言的,不是标准C语言程序的
sum =a + b;
printf("sum = %d\n", sum);
return 0;
}
// %c打印字符格式的数据
//%d打印整形十进制数据
//%f打印小数(浮点型)
//%lf 打印double
//%p以地址的形式打印
//%x打印十六进制

//定义在代码块{}之外的变量 --全局变量
//定义为{}内的变量 --局部变量 局部变量与全部变量可以同时存在,但是变量的值局部变量优先!!!

//scanf这个函数是C语言提供的 scanf_s是VS这个编译软件单独提供的,在VS之外的编译软件是没有办法识别的
//在VS软件里面使用scanf函数应该在.c文件第一行添加“#define_CRT_SECURE_NO_WARNINGS 1”!!! (scanf 、strocpy、strlen、stract。。。这些函数都应该在VS里的.c文件开头添加这一句语句,表示调用库函数)
//#define_CRT_SECURE_NO_WARNINGS 1 一定要加在源文件第一行


//day3!!!!!

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//作用区域,所在其作用范围就是其作用区域
//局部变量作用域就是局部变量作用范围
//变量定义可以放在大括号{}外头,函数必须放在{}内。
//全局变量整个工程

//常量
//1字变常量 1 2 a b ...
//1,2,3,4,5,6。。字变常量--一个直接的值

//const-常属性 , 修饰的常变量 “const int a=1;”之后变量a的值只能等于1,不能再被赋值!!! 但是其本质还是一个变量
//int main()
//{
// int num = 10;//变量
// num = 20;
// printf("num = %d/n", num);//
// return 0;
//}
//int main()
//{
// const int num = 10;//加上const 后变量变为不能改变属性的常变量。
// //num = 20;
// printf("num = %d/n", num);//
// return 0;
//}

#define 定义的标识符常量

//#define MAX 10000 //标识常量在项目里不能更改
//
//int main()

//{
// int n = MAX;
// //define 定义的标识符常量
// printf("n=%d\n", n);
// return 0;
//}

//枚举变量 可以一一列举的变量
// enum __ { _,_,_,..}; 枚举函数!!!
enum SEX //性别
{
//z\这些未来可能取值
// man woman 这些变量就是枚举常量 {}内的枚举常量是不能修改的!
man,
woman,
};
int main()
{
enum SEX s = man;
printf ("%d\n",man);//默认从0开始
printf("%d\n",woman);//默认为1 。。。
return 0;
}
//但是枚举变量是能够修改的
//“缺少分号“;”在类型的前面”--C语言语法规定变量应该定义在当前代码块的最起面 !!!!!


//day4!!!!!

#include<stdio.h>
int main()
{/*
变量 一个保存数据的地方。
变量定义一般形式:
<类型名称><变量名称>;
int a;
int prince;
int change , among ;(其中","表示同类型的多个变量同时定义。
所有变量都需要名字,变量的名字是一种'标识符',用来识别不同的名字,标识符基本原则:字母、数字、下划线组成,并且数字不可以出现在第一个位置
一些关键字不能出现在标识符当中(int ;for ;return;auto;break;case;char;const;continue;default;do;double;else;enum;extent;float;goto;if;long;...
*/
/*
变量赋值:
int a = 1;(int 是类型;a 是变量名字;1是初始值;
a = 1 是一个式子,这里“=”是一个赋值运算符,把右边的值付给左边的变量。“=”是赋值符合,不是等号。定义变量时赋的值叫初始化。
如果没有初始化则会导致程序出错。
*/
/*
scanf("%d",&a);
要求scanf这个函数读入下一个整数,读到的结果赋给变量a.注意“&”这个符号!!!
*/
int prince = 0;
int change = 0;
printf("请输入金融(元)");
scanf_s ("%d", &prince);//VS scanf函数要改成 scanf_s .
change = 100 - prince;
printf("找%d元给你\n", change);
return 0;
}


//day5!!!!!

#include<stdio.h>
int main()
{
/*
int a = 0;
int b = 0;
scanf_s("%d %d", &a, &b);//如果%d与%d之间程序有加“,”则运行输入时也应该加“,”,否则程序背后的值会输出原来定义的值。
//出现在scanf_s 后""里的东西都是要输入的,包括空格号占了一个符号位
//例如:("prince %d , %d",&a, &b);中输出时应该输入【 prince _ , _】才正确。
printf("%d %d\n", a, b);

*/
//在程序当中固定不变的量(如数字。。)是--直接量
//如:int change = 100 - price;(100就是直接量)
//更好的方式是定义一个常量:
//const int AMONT = 100; 这样可以方便理解程序,与日后程序的修改。
//const 是一个修饰符,加在int 前面用来给变量加上一个不变的属性。这个const 的属性表示的这个变量的值一但初始化就不能修改。
//如后期对其属性进行赋值程序会显示错误。
/*
const int AMONT = 100;//constr变量一般要大写
int prince = 0;
int change = 0;

printf("请输入金融(元)");
scanf_s("%d", &prince);//VS scanf函数要改成 scanf_s .

change = AMONT - prince;

printf("找%d元给你\n", change);
*//*
//上个程序如要让用户输入 "amont"这个值,使得它可以修改则可以
int amount = 100;//开头定义初始值
int prince = 0;

int change = 0;

printf("请输入金额(元)");
scanf_s("%d", &prince);//VS scanf函数要改成 scanf_s

printf("请输入面额(票面)");
scanf_s("%d", &amount);

change = amount - prince;

printf("找%d元给你\n", change);
*/
/*
//可以用多个scanf_s表示读取多个变量,也可以用一个scanf_s读取多个变量
int a;
int b;
printf("请输入两个整数:");
scanf_s("%d %d", &a, &b);//两个%d之间用空格隔开,记得输入时与应该加上空格
printf("%d + %d =%d\n", a, b, a + b);
*/

//浮点型(10.9...)

//在C语言当中带小数点的数和不带小数点的数是两个不一样的数
//在运算过程中如果运算符号两边出现整数和浮点数,则计算机会先把整数变成浮点数,但输出结果变为浮点数
//printf中的"%d" 应该变为"%f"

//或者在定义变量时不要用"int"定义,改用“double" 或”float"
//与在scanf_s 函数当中把“%d"改成”%lf"
return 0;
}


//day6!!!!!

#include<stdio.h>
int main()
{
/*
运算符-动作,比如+,-,*。。。。
算子:参与运算的值 可以是常数、变量、一个方法的返回值。。。
*/
/*
//计算时间差
int hour1, minute1;
int hour2, minute2;

scanf_s("%d %d", &hour1, &minute1);//转化为分钟单位
scanf_s("%d %d", &hour2, &minute2);

int t1 = hour1 * 60 + minute1;
int t2 = hour2 * 60 + minute2;

int t = t2 - t1;
printf("时间差是%d小时%d分钟。", t / 60, t % 60);//t / 60-小时部分, t % 60-分钟部分
*/
/*
//求平均数
int a, b;
scanf_s("%d %d", &a, &b);
double c = (a + b) / 2.0;//double(浮点型) ;2.0为了计算小数位
printf("%d和%d的平均值=%f\n", a, b, c);//浮点型用%f
//优先级(单目 + - 取正 取负 自右向左) * / % + - 自左向右 =(赋值也是运算 自右向左)
//int c = e +(b=a)--嵌入式赋值 这样容易产生错误
*/
/*
//交换两个变量
int a = 1;
int b = 2;
int t ;
t = a;
a = b;
b = t;
printf("a=%d,b=%d\n",a,b);
*/
/*
//复合运算符”+=“;-=;*=;、=;%=
//total +=5; 表示的是:total = total +5; total*=15+8----total = total *(15+80);
//注意运算符中间不能有空格

//++;-- 特殊运算符 (单目运算符)让变量加或减 1 (可以放在变量的前面或后面)
int a;
a = 10;
printf("a++=%d\n", a++);//表达式的值是原来的值(先用后加)
printf("a=%d\n", a);

printf("++a=%d\n", ++a);//是a+1 以后的值(先加后用)
printf("a=%d\n", a);
*/

return 0;
}
//字符串 由双引号“”引起的一串字符
//可以把一串字符串放到一个数组当中

/*
int main(){
char arrl[]="abc";//数组里面包含字符串 1
char arr2[]={‘a’,'b','c'};//数组里面包含3个字符a,b,c 2
printf("%s\n",arrl);//打印数组用%s!!!
}
//在VS里面上面项目栏当中 fn+f10再 调试-窗口-监视-1/2/3/4都可以查找项目当前代码的值
//字符串当中不仅仅有abc还有一个在末尾的"\0"其值是0,表示的是字符串的 结束标准 不算结束字符串的内容 !!!

//ASCII码值 代表字符的对应的计算机的值!!!

//strlen() --是计算字符串长度的!!!
//应该在头文件处加上“#include<string.h>”!!!
//转义字符-转变原来的意思 \ "\+一个字母 或 \数字-8进制,\x数字-16进制之类的 ”算一个字符位
// "\n"换行
//
// 注释当中以"/*"开始,只要捕获到“*/”就结束了!!! 所以不太支持/* */这种注释方法


//day8!!!!!

#include<stdio.h>

int main()
{
/*
//级连的if else语句
// if(条件){}else if(条件2){}
//分段函数f(x)={-1;x<0 0;x=0 2x;x>0 }
int x;
int f;
printf("请输入f(x)的值");
scanf_s("%d", &x);
if (x > 0){
f = -1;
}
else if (x == 0){ //注意这里是==号表示等于 不是一个等号
f = 0;
}
else{
f = 2*x;
}
printf("f(x)的值等于%d\n", f);
*/
//switch case 语句
/*
switch(判断条件){
case 1://这里是分号":" 不是结束符号; //cases是语句开始符
printf("...");
break; //是break分割了case语句
case 2:
printf("...");
break;
case 3:
printf("...");
break;
case 4:
printf("...");
break;

case n:
printf("...");
break;

default;
printf(".."); //如果判断条件无相应对应的case则输出这个表达式
//case后面跟着的为常量 可以是常数或常数表达式
}
根据判断条件(可以是变量或表达式)结果来决定说下面那个case与它匹配。无相应对应的case则输出这个表达式
*/
/*
int type;
printf("输入type的值\n");
scanf_s("%d", &type);
switch (type){ //括号要一对一对打!!!
case 1:
printf("你好");
break;
case 2:
printf("中午好");
break;
case 3:
printf("下午好");
break;
case 4:
printf("晚上好");
break;
default:
printf("你要做什么?");
break;

}//切记检查反括号是否完整
*/
/*
//分数转换
//printf(“请输入成绩”)
int grade;
scanf_s("%d", &grade);
grade /= 10;
switch(grade){
case 9:
printf("A\n");
break;
case 8:
printf("B\n");
break;
case 7:
printf("C\n");
break;
case 6:
printf("D\n");
break;
default:
printf("F\n");
break;
}
*/
return 0;
}


//day7!!!!!

#include<stdio.h>
int main()
{
/*
//if 条件判断 判断条件做不做(例子P6 时间)

在if语句当中()-- 要么跟着{} ---要么跟着一个语句!!!
--千万不能在()跟着“;”
//if(条件){} 条件成立,执行大括号内地所有内容 如不成立则跳过,不执行大括号里的内容

int hour1, minute1;
int hour2, minute2;

scanf_s("%d %d", &hour1, &minute1);//转化为分钟单位
scanf_s("%d %d", &hour2, &minute2);

int ih = hour2 - hour1;
int im = minute2 - minute1;

if (im < 0){ //im<0证明在刚刚减法里发生了借位
//如果不满足if 则跳过{}内所有内容
im = 60 + im;
ih--;//小时的差额减一
}
printf("时间差是%d小时%d分钟。\n", ih ,im );//t / 60-小时部分, t % 60-分钟部分
*/

//关系运算符 (或 比较运算符) 习惯上来做比较
/*
= = 相等 != 不相等 >大于 >=大于或者等于 <小于 <= 小于或者等于
*/

//关系运算只有两个结果 0 --(关系不成立); 1 --(关系成立)
/*
printf("%d\n", 5 == 3);
printf("%d\n", 5 <= 3);
printf("%d\n", 5 > 3);
*/

//关系运算符优先级比算数的低,但比赋值运算符高
//其中==和!= 比其他关系运算符来的 低。
/*
printf("%d\n", 7 > 3+1);
*/
/*
//找零计算器 if {...}else{ ..} 语句(如果。。。否则。。)

//
在if..else语句当中else 和if 一样 后面
-- 要么跟着{} ---要么跟着一个语句
--千万不能在()跟着“;”

int price = 0;
int bill = 0; //这两行是初始化

printf("请输入金额");
scanf_s("%d", &price);
printf("请输入票面");
scanf_s("%d", &bill);

if (bill >= price){ //判断票面够不够

printf("应该找您%d\n", bill - price);//计算找零

}
else{
printf("您的金额不够.\n");
}
*/

//计算薪资
const double RATE = 28.5;
const int STANDARD = 8;
double pay = 0.0;
int hours = 0;

printf("请输入工作的小时数: ");
scanf_s("%d", &hours);
printf("\n");
if (hours > STANDARD)
pay = STANDARD*RATE + (hours - STANDARD)*(RATE*1.5);
else
pay = hours*RATE;
printf("应付工资:%f\n", pay);
return 0;
}


//day9!!!!!

#include<stdio.h>
int main()
{
//写程序要一步一步作,要按步骤操作
//判断一个数范围
/*
//一定范围内可以
int x;
int n = 0;
scanf_s("%d", &x);
if (x>999){
printf("它是四位数");
n = 1;
}
else if(x>99){
printf("它是三位数");
n = 2;
}
else if(x>9){
printf("它是两位数");
n = 3;
}
else{
printf("它是一位数");
n = 4;
}
printf(" n=%d\n",n);
//这个程序找您判断 正整数
*/
/*
//判断多位(一定位数的整数)
//while 循环语句
int x;
int n = 0;
scanf_s("%d", &x);
n++;
x /= 10;//把最右边的数丢去
while (x > 0){ //循环一次以后重新回到该处判断条件,如果条件满足则继续循环
n++;
x /= 10;

}
printf("%d\n", n);
*/

//while 就是把if 语句当中的if换成while就是while循环了
/*
如:if (x>0){ x/=10; n++;} 一次性的判断
while (x>0){ x/=10; n++;} 反复不断的进行的
*/
//while 语句-当 当条件满足时不断重复条件里的内容
// 执行循环之前没有判断循环 可能循环一次也没有执行 条件成立循环继续执行

while(循环条件){

}//完成条件跳出循环,如果不满足循环条件则不跳出循环

/*
int x;
int n = 0;
//scanf_s("%d", &x);
x = 352;
//n++;
//x /= 10;//把最右边的数丢去
while (x > 0){ //循环一次以后重新回到该处判断条件,如果条件满足则继续循环
n++;
x /= 10;
printf("x=%d,n=%d\n", x, n);

}
printf("%d\n", n);
*/

//do while 循环 在进入程序时不进行检查 在完成一轮循环后来检查条件是否满足 如果满足进行下一次循环 不满足结束循环
/*
do
{
<循环语句> }
while(<循环条件>);

*///无论条件是否满足 do while 一定做一遍循环语句 while 是一遍都不做
/*
int x;
scanf_s("%d", &x);
int n = 0;
do{
x /= 10;
n++;
} while (x > 0);
printf("%d", n);
*/


//猜数游戏
/*
1 计算机随机立一个数 number
2 负责记次数的变量 count初始值为0
3让用户输入一个数a
4count+1
5 判断a和number的大小 如果a大 则输出“大” 反之“小”
6如果a与number不一样无论如何回到步骤3
7否则程序输出“猜中”与次数 后结束

*///循环条件a与number 一不一样

/* //if else 语句实行
srand(time(0));//目的 让随机数真的向随机数的样子(目前不涉及)
int number = rand() % 100 + 1;// 召唤rand ()就得到一个随机数
int count = 0;
int a = 0;
printf("我已经想好一个数1-100之间的数了。");
do{
printf("猜这个数是多少:");
scanf_s("%d", &a);
count++;
if (a > number){
printf("你猜的数太大了");

}
else if (a < number){
printf("你猜的数太小了");

}
} while (a != number);//不相同
printf("太好了,你用了%d次猜对了答案。\n", count);

*/
//召唤rand ()就得到一个随机数
/*
srand(time(0));
int a = rand();
printf("%d\n", a%100);//a%100对a取余 留下10位和个位的数 相当于每次得到一个100以内的数
*/

//平均数
/*
1一个记录读到数是变量 sum count =0;
2 读入number 平均数这么算?
3 如果number不等于-1则把number 加入sum,并且把count+1,回到2 ; 只要每读到一个数,就把它累加到变量里 到全部数据读完 再拿它去读到这个数就可以了
4 如果number是-1,则计算和打印sum/count(注 换成浮点型计算) 一个变量记录累加的结果 一个变量 记录读到的数


*/
/*
int sum = 0;
int number ;
int count = 0;

do {
scanf_s("%d", &number);

if (number != -1){
sum += number;//做累积的和
++count;
}
}while (number != -1);
*/

//while 循环 相比于if 省去了一次循环
//scanf_s("%d", &number);

int sum = 0;
int number = 0;//在该循环当中应该定义number的初始值
int count = 0;

while (number != -1){
sum += number;//做累积的和
count ++;//或 count++;
scanf_s("%d", &number);
}
printf("%f\n",1.0* sum / count);//1.0*sum是为了让其变成浮点型

//输入数据时最后要=-1 才会截止程序

return 0;
}


//day10!!!!!


#include<stdio.h>
int main(){
//整数的分解
/*
1.对一个整数做%10 得到它的个位数;
2.对一个整数做/10 去掉它的个位数;
3.再对2的结果做%10,得到原来整数的十位数;
4.对这个整数做/10 去掉原来数的十位数;
5.。。。逐次进行
*/
//输入一个整数 输出其逆序数
/*
int x;
scanf_s("%d", &x);
int digit;//表示它的每一位的
int ret = 0;//有一个结果一开始对于0
while (x>0) {

digit = x % 10;//它的那一位
printf("%d", digit);//调试输出
ret = ret * 10 + digit;//原来的结果*10在加上digit;
// printf("x=%d,digit=%d,ret=%d\n", x, digit,ret);//当中 \n 表示换行输出 //调试输出
x /= 10;//最右边那一位丢掉了
}
//printf("%d", ret);//正式输出
*/

//for循环
//n!=1*2*3*4.....*n

int a;
scanf_s("%d",& a);
int fact = 1;//因为要做一个 乘积 所以初始值不能为0;如果=0则*任何数都为0;// 累加 时应该初始值为0;

//while 语句循环
/*
int i = 1;
while (i <= a){
fact *= i;
i++;
printf("%d\n", i);
}
*/
//for 语句循环 像一个计数器 设计一个计数器初始化 然后计数器到达某一个值前 重复执行循环 每进行一轮循环 计数器值以一定步骤进行调整(如加1或减一)
/* //递加相乘
int i = 1;
for (i = 1; i <= a; i++){ //for( 初始条件; 循环继续条件;循环每一轮要进行的事情)
//上面这个循环中for 也可以读成对于“对于一开始i=1,当i<=a时,重复循环每一轮循环后i加1;
fact *= i;
}
*/
/*
//递减相乘
int i=1;
for ( i = a; i > 1; i--){
fact *= i;
}
*/
printf("%d!=%d\n", a, fact);

return 0;
}
//循环选择:表达有固定次数 用for ;必须执行一次 do_while ;其他情况while


//day11!!!!!

#include<stdio.h>
int main(){
//控制循环 break , continue

//素数 :只能被1和自己整除的数 如:2,3,5,7,11,13,17,19、、、

/*
//break来阻断循环 跳出了循环 不进行新一轮的循环
int x ;
scanf_s("%d", &x);

int i;
int isPrime = 1;//x是素数 =1是因为要证伪 要通过无法被证伪来证明其是真的 =0是要证明时设的变量
for (i = 2; i < x; i++){ //i从2开始 i<x表示 i<=x-1 i最大只能取到x-1
if (x % i == 0){ // x对i取余结果=0;表明x 不是一个素数
isPrime = 0;
break;//跳出循环
}
}
if (isPrime == 1){
printf("是素数\n");
}
else{
printf("不是素数\n");
}
*/ /*
//continue是跳过循环这一轮剩下的语句;进入新一轮循环 直到条件不符合循环结束
int x;
scanf_s("%d", &x);

int i;
int isPrime = 1;//x是素数 =1是因为要证伪 要通过无法被证伪来证明其是真的 =0是要证明时设的变量
for (i = 2; i < x; i++){ //i从2开始 i<x表示 i<=x-1 i最大只能取到x-1
if (x % i == 0){ // x对i取余结果=0;表明x 不是一个素数
isPrime = 0;
continue;
}
printf("%d\n", i);//输出当前测试的i的值
}
if (isPrime == 1){
printf("是素数\n");
}
else{
printf("不是素数\n");
}
*/ /*
//100以内的素数
int x;

for (x = 2; x < 100; x++)
{
int i;
int isPrime = 1;//x是素数 =1是因为要证伪 要通过无法被证伪来证明其是真的 =0是要证明时设的变量
for (i = 2; i < x; i++){ //i从2开始 i<x表示 i<=x-1 i最大只能取到x-1
if (x % i == 0){ // x对i取余结果=0;表明x 不是一个素数
isPrime = 0;
continue;
}

}
if (isPrime == 1){
printf("%d\n",x);
}

}
printf("\n");
*/ /*
//输出前50个素数
int x=2;
int cnt = 0;//计数器
while (cnt<50)
{
int i;
int isPrime = 1;//x是素数 =1是因为要证伪 要通过无法被证伪来证明其是真的 =0是要证明时设的变量
for (i = 2; i < x; i++){ //i从2开始 i<x表示 i<=x-1 i最大只能取到x-1
if (x % i == 0){ // x对i取余结果=0;表明x 不是一个素数
isPrime = 0;
continue;
}

}
if (isPrime == 1){
printf("%d\n", x);
cnt++;
}
x++;
}
printf("\n");
//break continue 只能对所在的那一层循环数
*/

//凑硬币 用1角 2角5角硬币凑出多少钱
/*
int x;
int one;
int two;
int five;
int exit = 0;
scanf_s("%d", &x);
for (one = 1; one < x * 10; one++){
for (two = 2; two < x * 10 / 2; two++){
for (five = 5; five < x * 10 / 5; five++){
if (one + two * 2 + five * 5 == x * 10){
printf("可以用%d1角和%d2角和%d个五角得到%d元\n", one, two, five, x);
exit = 1;
break;

}
}
if(exit==1) break;
}
if (exit==1)break;
}
*/
//goto 语句 goto __(标号,在程序当中自己定义的); 意思是这是一个地方 要跳到标号那个地方去
int x;
int one;
int two;
int five;
scanf_s("%d", &x);
for (one = 1; one < x * 10; one++){
for (two = 2; two < x * 10 / 2; two++){
for (five = 5; five < x * 10 / 5; five++){
if (one + two * 2 + five * 5 == x * 10){
printf("可以用%d1角和%d2角和%d个五角得到%d元\n", one, two, five, x);
goto out;
}
}

}

}
out;
return 0;
}
//goto程序有问题!!!!!!


//day12!!!!!

#include<stdio.h>
int main(){

//求前n项和
/*
//1+1/2+1/3+1/4+....+1/n
//因为起点的数字与终点的数字是明确的所以使用 for 循环
int n;
scanf_s("%d", &n);
int i;
double sum = 0.0; //因为1/n有带着小数点的 所以不能用int 应该用double;=0.0
for (i = 1; i <= n; i++){
sum += 1.0 / i;//在除号两边有一个是浮点数,会把另一个也改成浮点数
}
printf("f(%d)=%f\n", n, sum);
*/
//1+1/2-1/3+1/4-....+1/2n-1/(2n+1)
//1)
/*
int n;
scanf_s("%d", &n);
int i;
int sign = 1;
double sum = 0.0; //因为1/n有带着小数点的 所以不能用int 应该用double;=0.0
for (i = 1; i <= n; i++){
sum += sign*1.0 / i;//在除号两边有一个是浮点数,会把另一个也改成浮点数
sign = -sign;
}
printf("f(%d)=%f\n", n, sum);
*/
//2)
/*
int n;
scanf_s("%d", &n);
int i;
double sign = 1.0;
double sum = 0.0; //因为1/n有带着小数点的 所以不能用int 应该用double;=0.0
for (i = 1; i <= n; i++){
sum += sign / i;//相当于让分子在反复它的级性
sign = -sign;
}
printf("f(%d)=%f\n", n, sum);
*/


//逆序分解整数
//int x;
//scanf_s("%d", &x);
//do{
// int d = x % 10;//取最右边的一位数
// printf("%d", d);
// if (x > 9){
// printf(" ");//解决最后胜出有一个空格
// }
// x /= 10;//去了最右边的那位数

//} while (x > 0);
//printf("\n");

//正序分解整数
/*
//先逆序再正序 只适用于末尾不为0的数;
int x;
scanf_s("%d", &x);
int t = 0;
do{
int d = x % 10;
t = t * 10 + d;
x /= 10;
} while (x > 0);
printf("x=%d,t=%d\n",x, t);
x = t;

do{
int d = x % 10;//取最右边的一位数
printf("%d", d);
if (x > 9){
printf(" ");//解决最后胜出有一个空格
}
x /= 10;//去了最右边的那位数

} while (x > 0);
printf("\n");
*/

//最大公约数
//辗转相除法
/*
a b t =a%b
12 18 12 //如果还等于a 则a b 互换
18 12 6
12 6 0
6 0 0//b=0 循环结束
*/
int a;
int b;
int t;
scanf_s("%d %d", &a, &b);

while (b != 0){ //如果b不等于0 循环继续
t = a%b;
a = b;
b = t;
}
printf("gcd=%d\n", a);
return 0;
}


//day13!!!!!


#include<stdio.h>
int main(){
int a;
scanf_s("%d", &a);
int i, j, k;
int cnt = 0;

i = 1;
while (i <= a + 3){
j = a;
while (j <= a + 3){
k = a;
while (k <= a + 3){
if (i != j){
if (i != k){
if (j != k){
cnt++;
printf("%d%d%d", i, j, k);//或者
printf("%d", i*100+j*10+ k);//与上面那个输出一样
if (cnt == 0){
printf("\n");
cnt = 0;
}
else{
printf(" ");
}
}
}
}
k++;

}
j++;
}
i++;
}
return 0;
}//P47-52 没有看


//day14!!!!!


#include<stdio.h>
int main(){

/*
//九九乘法表(等号右边的数字占四位,左对齐)
int n;
scanf_s("%d", &n);
int i, j;
i = 1;
while (i <= n){
j = 1;
while (j <= i){
printf("%d*%d=%d", j, i, i*j);//要按乘法口诀表 小的数在前面
if (i*j<10){
printf(" ");

}
else{
printf(" ");
}
j++;
}
printf("\n");
i++;
}
*/
/*
//做[M,N]之间的素数求和
int m, n;
scanf_s("%d%d", &m, &n);
if (m == 1)//1不是素数
m = 2;
int i;
int cnt = 0;
int sum = 0;
int isprime = 1;
for (i = m; i <= n; i++){
//判断i是不是素数
int k;
for (k = 2; k < i - 1; k++){
if (i%k == 0){
isprime = 0;
break;
}
}
if (isprime){
cnt++;
sum += i;
}
}
printf("%d %d\n", cnt, sum);
*/
return 0;


//day15!!!!!

#include<stdio.h>
int main(){
//表达范围char<short<int<float<double
//sizeof一个运算符,给出某个变量或类型在内存里所占据的字节数 sizeof(i) 、sizeof(int)
//sizeof是静态的

/*
int a;
a = 9;
printf("sizeof(int)=%ld\n", sizeof(int));//int占据的字节是多少
printf("sizeof(a)=%ld\n", sizeof(a));
*/
/*
printf("sizeof(int)=%ld\n", sizeof(int));//int表达的是一个寄存器的大小
printf("sizeof(char)=%ld\n", sizeof(char));
printf("sizeof(short)=%ld\n", sizeof(short));
printf("sizeof(long)=%ld\n", sizeof(long));
printf("sizeof(long long)=%ld\n", sizeof(long long));
*/
//计算机内部是二进制表达 ,是以什么方式看待它而不是内部怎么表达
//P55
return 0;
}


//day16!!!!!


#include<stdio.h>
int main(){
//11111111~100000000-->-1~-128
char c = 255;//11111111
int i = 255;//00000000 00000000 00000000 11111111(二进制)
//char 1字节:-128 - 127; (因为含有0这个数)
//short 2 字节:-32768 - 32767
//int 取决于编译器(CPU),通常的意义是“1个字”
//long 4个字节
//long long 8个字节

//11111111被当做二进制时是 255 ;被当做补码时是 -1
//unsigned 表示变量是二进制表示,而不是以补码表示,副作用是所表达的数在正数范围会扩大一倍
//unsigned 是在变量背后加上一个U
//long 是在变量背后加上一个L

//整数输出形式 int 和 long long
//%d:int
//%u:unsigned
//%ld long long
//%lu unsigned long long
//0开头--8进制
//0x开头--16进制

//整型类型 没有特别需要可以用int

//浮点类型float 32 字节 有效数字 7 ;doube 64 字节 有效数字 15 -- 都可以表达 nan (不是一个有效数字)
double ff = 1234.5678;
printf("%e\n,%f\n,%E\n", ff, ff,ff);//E科学记数法 前面可以有正负号 可以有小数点或没有+-a (符号可以是正的可以省略,中间不能有任何客观)
printf("%.15f\n,", ff);//在百分号与f中间加“.数字”表示输出小数点后多少位数字
//超过范围的浮点数inf表示无穷大;nan表示不存在的浮点数
//fabs 求绝对值
//选择浮点类型 无特殊需要用double
return 0;
}


//day17!!!!!


#include<stdio.h>
int main(){
//‘1’表示字符1,与数字1是不相同的
char c;
char d;
c = 1;
d = '1';
if (c == d){
printf("相同\n");

}
else{
printf("不相同\n");
}
printf("c=%d\n",c);
printf("d=%d\n", d);//在计算机内部'1'的值就是49; 以百分号“%c"来输出的话就是1;
//scanf_s只能读取 int
//字母在ASCII当中是顺序排列,大写字母和小写字母分开排列

// “\" \"” --叫逃逸字符。两个符号连接起来算一个字符
// \b 回退字符(回去但不删除) \t 到下一个表格位(不代表固定位置,\t才能使得上下两行对齐) \n换行 \r回车 \" 双引号 \'单引号 \\反斜杠本身
//当运算符两边不一样的时会自动转化为较大或较宽的类型 char>short>int>long>long long int>float>double

//对于printf来说 任何小于int类型会被转化成int;float会被转化成double
//scanf_s要输入%hd;

//强制类型转换 (类型)值--C语言是这样的例如 (int)10.2 --把10.2这个double转换成int了;(short)55--把55这个int转换成short;
//但是存在安全性,小的量不能转换成大的量
//强制类型改变不会把变量改变数值

//#include<stdbool.h> 之后就可以使用bool 和true false 类似于整数
//理解运算:逻辑非 ! ;逻辑与 && ;逻辑或 || ;
//区间表示例子:[a,b]应该表示于x>=a&&x<=b;
// !a<0应该表示成"!a"a非小于0;
//逻辑运算符优先级:!>&&>||" 赋值运算符永远等级是最低的
//逻辑运算是自左向右进行,如果左边的结果可以决定结果了就不会进行右边的计算
int a = -1;
if (a > 0 && a++ > 1){
printf("OK\n");
}
printf("%d\n", a);

//条件运算符:。。(判断式子)?..(条件成立):..(条件不成立)--由右向左
return 0;
}


//day18!!!!!


#include<stdio.h>
int main(){
//‘1’表示字符1,与数字1是不相同的
char c;
char d;
c = 1;
d = '1';
if (c == d){
printf("相同\n");
}
else{
printf("不相同\n");
}
printf("c=%d\n",c);
printf("d=%d\n", d);//在计算机内部'1'的值就是49; 以百分号“%c"来输出的话就是1;
//scanf_s只能读取 int
//字母在ASCII当中是顺序排列,大写字母和小写字母分开排列

// “\" \"” --叫逃逸字符。两个符号连接起来算一个字符
// \b 回退字符(回去但不删除) \t 到下一个表格位(不代表固定位置,\t才能使得上下两行对齐) \n换行 \r回车 \" 双引号 \'单引号 \\反斜杠本身
//当运算符两边不一样的时会自动转化为较大或较宽的类型 char>short>int>long>long long int>float>double

//对于printf来说 任何小于int类型会被转化成int;float会被转化成double
//scanf_s要输入%hd;

//强制类型转换 (类型)值--C语言是这样的例如 (int)10.2 --把10.2这个double转换成int了;(short)55--把55这个int转换成short;
//但是存在安全性,小的量不能转换成大的量
//强制类型改变不会把变量改变数值

//#include<stdbool.h> 之后就可以使用bool 和true false 类似于整数

//理解运算:逻辑非 ! ;逻辑与 && ;逻辑或 || ;
//区间表示例子:[a,b]应该表示于x>=a&&x<=b;
// !a<0应该表示成"!a"a非小于0;
//逻辑运算符优先级:!>&&>||" 赋值运算符永远等级是最低的
//逻辑运算是自左向右进行,如果左边的结果可以决定结果了就不会进行右边的计算
int a = -1;
if (a > 0 && a++ > 1){
printf("OK\n");
}
printf("%d\n", a);
//条件运算符:。。(判断式子)?..(条件成立):..(条件不成立)--由右向左
return 0;
}


//day19!!!!!


#include<stdio.h>
/*
int main(){
//数组 一组相同类型元素的集合!!!!!
//数组求平均数 (在之前求平均数的代码基础上改进)
int x;
double sum = 0;
int cnt = 0;

int number[100];//定义了number为数组,这个数组里每一个单元都是int 这个数组大小为100!!!!!
//char ch[] 字符类型数组!!!!!
//float arr[] 小数类型数组

scanf_s("%d", &x);
while (x != -1){

number[cnt] = x;//number里cnt那个单元为x 在while当中随着x的不断读入会不断放进数组当中cnt(一开始=0)对应的位置(前提x!=-1)//对数组当中的元素进行赋值!!!!!

//调试代码 显示数组里的数
//
{
int i;
printf("%d\t", cnt);
for (i = 0; i <= cnt; i++){
printf("%d\t", number[i]);
}
printf("\n");
}
//

sum += x;
cnt++;
scanf_s("%d", &x);
}
if (cnt > 0){
printf("%f\n", sum / cnt);
//输出其中大于平均数的数 使用数组当中的元素
int i;
for (i = 0; i < cnt; i++){//从0开始走到cnt
if (number[i]>sum / cnt){//cnt表达的是在这个数组里有多少个数
printf("%d\n", number[i]);
}
}
}
return 0;
}
*/
/*
数组的定义: "数组当中每一个单元的类型 变量名称[元素数量];" --元素数量 必须为整数
(数组是一个容器:其中类型相同;大小一但确定不能改变) 数组可以放在赋值号“=”的左边(读取它的值)--”左值“与右边 (赋值)--“右值”
数组[]里的元素从0开始编号
出现segmentation fault 有可能是数组下标越界了 有效下标[0~n-1]
*/

/*
//写一个程序,输入数量不确定的[0,9]范围内的整数,统计每一种数字出现的次数,输入-1表示结束
int main(){
const int number = 9;//数组大小
int x;
int i;
int count[9];//count[0]代表0这个数字出现了多少次。。以此类推 定义数组

//初始化数组
//
for (i = 0; i < 9; i ++ ){
count[i] = 0;
}
//
scanf_s("%d", &x);
while (x != -1){
if (x >= 0 && x <= 9){ //并且
count[x] ++;//计算 数组参与运算
}
scanf_s("%d", &x);
}
for (i = 0; i < 9; i++){
printf("%d:%d\n", i, count[i]);//这个数字出现了多少次
}
return 0;
}
*/

/*
int main(){
//数组初始化 int a[]={1,2,3,4,5,6,7,8,..}或int a[100] 后再输入数组里的数
//初始化数组值都为0:int a[x]={0}
//给数组当中元素赋值int a[x]={[0]=1,...}//表示数组当中第一个元素被赋值为1

//--查看数组大小用”sizeof(a)/sizeof(a[0])“:
// printf("lu\n",sizeof(a));
// printf("lu\n", sizeof(a[0]));
// for(i=0;i<sizeof(a)/sizeof(a[0]);i++){
// printf("%d\t",a[i]);
// }

return 0;
}
*/

int main(){
//二维数组:int a[行][列]
//int a[i][j]
//二维数组的遍历:
/*
fro(i=0;i<m;i++){
fro(j=0;j<n;j++){
a[i][j]=i*j;
}
}
*/
//二维数组定义时其行数可以省略,但是列数不可以!!!
/*
int a[][5]{
{0,1,2,3,4}//也可以不带大括号,但是不建议
{2,3,4,5,6}
};
*/

return 0;
}

//P22天

#include<stdio.h>
int main(){
/*
//sizeof 是一个运算符 ,给出某个类型或变量所占据的字节数 1字节=8bit
int a;
a = 6;
printf("sizeof(int)=%ld\n", sizeof(int));
printf("sizeof(a)=%ld\n", sizeof(a));
*/

//运算符& 它是取得变量的 !地址! ,它操作数必须是变量
//地址类东西用”0x“十六进制表达比较方便
//p=(int)&i 强制类型转换成int
//输出一个地址
/*
int i;
printf("%p",&i);
*/
//取地址必须是对一个!!!明确变量!!!取地址

//数组的取地址
int a[10];
printf("%p\n", &a);//对数组a取地址
printf("%p\n", a);//直接把a这个数组变量名字取地址
printf("%p\n", &a[0]);//取出a[10]当中第一个元素的地址
printf("%p\n", &a[1]);
//相邻当中数组元素永远是 4 !!!

return 0;
}
p80 9.1.1

/* 打印数组里所以的元素:
int a[10]={1,2,3,4,5,6,7,8,9,10};
int i=0;
while(i<10){
printf("%d\n",a[i]);
i++;
}
*/


//day20!!!!!


#include<stdio.h>
int main(){
//b=a++ 先使用(赋值) 后++
//b=+=a 先++ 后使用
//"[]"下标引用操作符
//“()”也是函数调用操作符
//有符号数:符号归到最高位的位置1 负数;0 正数;
//只要是整数,存储的都是补码!!!
//自己定义的符号名,不能和C语言自带的符号名冲突
//typedef:类型定义、类型重定义
//unsigned无符号定义
//局部变量一但出了{}范围就自动停止 并且销毁了
//static int a ; a是一个“静态局部变量”。会保存上一次留下的值!!!!! 作用:修饰局部变量 其生命周期延长了
//static 修饰全局变量改变了变量的作用域,让其只能在自己所在的.c文件里面使用

//声明外部函数!!!!!:extern int f(x)(int ,int );

//指针变量 专门用来存放地址的 int *p=&a;//地址用“%p”来输出
return 0;
}


//day21!!!!!


#include<stdio.h>
/*
void f(int *p);//定义一个函数f
void g(int k);

int main(){
//指针---j就是保存地址的变量

int i;
int* p=&i;// "*“表示的是p是一个指针,它指向的是一个int ,它把int i这个地址交给p--p指向了i
int* p,q;//p的意思是一样的(p是一个指针指向int ),q只是普通一个int变量 不是把*加给了int而是加了p --p是一个指针
int *p,q;//与上面表达意思是一样的

// void f(int *p);--f函数需要一个int变量的指针(把一个指针作为参数时)
//在被调用的时候得到了某个变量的地址 int i=0;f(&i);
//在函数里可以通过这个指针访问外面这个i;

int i = 6;
printf("&i=%p\n", &i);//i的地址是多少
f(&i);//把取地址i交给f函数
g(i);//把i传输给g函数

return 0;
}

void f(int *p){
printf("p=%p\n", p);
}

void g(int k){
printf("k=%d\n", k);
}
//意思是在main里有一个变量i是6,它的地址由输出查询得到为&i=0095F904;然后把其地址取出交个f函数里的变量p;使得p里的地址也为&i=0095F904
//----所以可以说p是一个指针指向了i这个变量 所以可以说在f函数里面有了外面的main函数里的i的地址了。
//另外有个g函数,把k这个整数作为输入 ,把i传给g函数后 在g里面得到的只是i这个变量的值,而不是其的地址
//通过指针使得f函数里面拥有了i的地址,使得其拥有了能够访问(读,写(改))外面i的能力。

* /


//访问那个地址上的变量 要使用一个运算符"*" (在乘法里*表示的是一个乘法符号)
/*
"*"是一个单目运算符,用来访问指针的值所表示的地址上的变量
“*a"后这个变量可以作左值也可以做右值
"int k=*p;-- 可以读其值
*p=k+1;"--可以写其值

*/
/*
void f(int *p);//定义一个函数f
void g(int k);

int main(){

int i = 6;
printf("&i=%p\n", &i);//i的地址是多少
f(&i);//把取地址i交给f函数
g(i);//把i传输给g函数

return 0;
}
void f(int *p){
printf("p=%p\n", p);//在f里得到了其的地址
printf("*p=%d\n", *p);//*p这个是一个整体,可以看成一个整数(int)
//会得到*p=6.所以表示通过*p这个指针我们访问到了p所指向的那个int i;里面的值
*p = 30;//让*p赋值 看看main里面的i的值是否会被改变???如果i改变了由g函数可查看i的值 看看是否发生了变化
}

void g(int k){
printf("k=%d\n", k);
}
//经历了f函数的变化使得main里面i的值发生了变化 反应在了g函数当中,使得g函数里面i的值变成了30;
//这个时候发生的不是简单的值的传递 可以通过main外部的函数修改main 里面的i的值

//也就是说指针可以对全局变量进行读取调用与修改!!!!!! ?


//为什么 "int i;scanf_s("%d",i)"函数不会报错???
//因为:整数与地址在计算机里是一样大的,使用不一定会报错 但是!!!运行一定会出错!!!

*/

//指针的作用

//应用场景一:交换两个变量的值

/*
//void swap(int *pa,int *pb) //swap函数 -交换两个函数的值 存入两个变量在swap函数里面可以交换两个变量的值(但是离开swap就失去作用;因为传入的是两个值!)
// { //但是存入两个地址之后即可发生不一样的变化
// int t=*pa;
// *pa=*pb;
// *pb=t;
// }

void swap(int *pa, int *pb);// 在头部要先定义一个函数,后方函数才能被调用!!

int main(){
int a = 5;
int b = 6;

swap(&a, &b);
printf("a=%d,b=%d\n", a, b);
return 0;

}
void swap(int *pa, int *pb)//在swap当中只能由指针完成变量交换的任务!!!
{
int t = *pa;
*pa = *pb;
*pb = t;
}

*/

//指针的应用场景二:函数返回多个值,某些值只能通过指针返回 。 传入的参数实际上是需要保存带回结果的变量

void minmax(int a[], int len, int *max, int *min);
int main(void){
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, };
int min, max;
minmax(a, sizeof(a) / sizeof(a[0]), &min, &max);//sizeof(a) / sizeof(a[0])得到了元素的个数 sizeof () 是一个判断数据类型或者表达式长度的运算符。
//把min max 去了地址并且交给了mainmax函数
printf("min=%d,max=%d\n", min, max);
return 0;
}

void minmax(int a[], int len, int *min, int *max){ //int len表达这个数组有多大 *min *max表达计算过程当中有两个,所以要使用2次指针
int i;
*min = *max = a[0];//让二者等于数组第一个元素
for (i = 1; i < len; i++){//开始编译整个数组
if (a[i] < *min){
*min = a[i];
}
if (a[i] > *max){
*max = a[i];
}
}
}
//把函数里需要的变量的值通过指针计算好在传回原函数