一.第一部分:初始c语言
1.基本框架
最少的组成,写出程序最大框架
2.数据的表现形式
1>变量应该先进行声明时候在进行使用
#include <stdio.h>
int a = 3;
int b = 8;
int c;
int main()
{
c = a + b;
}
上面的代码就是在主函数之前定义变量a和变量b,同时赋值。
2>标识符与变量名
1)变量名的命名由字母与下划线组成,不可以以数字开头。
错误命名:int 3Mark;(数字开头命名错误!)
2)变量名的命名区分大小写,比如
int Mark;int mark;(两个不是同一个变量名!)
3)驼峰命名法:是指混合使用大小写字母来构成变量和函数的名字
3>数据类型
1)整形数据
int datas = 10
2)字符型
3)浮点数据
float data2 = 3.25;
4)常数
在运行过程中不可以改变的数据
#define PI 3.14(将PI设定取值为3.14,在以后可以用“PI”代替3.14)
3.输入输出
1>printf-打印函数
1)原样输出:直接输出需要打印的字符串
2)条件输出
格式字符 | 说明 |
d | 用于打印输出十进制数 |
c | 用于打印单个字符--输出一个字母 |
s | 用于输出多个字符 |
f | 用于输出小数 |
x | 以16进制的格式进行输出 |
p | 一般打印内存地址,16进制格式输出——输出地址:取变量地址运算符号:“&” |
语句格式:printf(格式控制,输出列表);
例如printf("%d\n",a);
格式控制部分分为两部分:
格式声明 | 以%开头的组成,作用是将输出的数据转换为指定的格式然后输出, |
普通字符 | 用于进行原样输出的部分 |
输出列表:程序需要输出的一些数据,可以是变量,可以是常亮,也可以是表达式。
案例:将函数定义的数据进行输出打印
#include <stdio.h>
int a = 300
float b = 201.21
int main()
{
printf("将定义的整形%d数据打印输出",a);
printf("将定义的小数%f数据进行打印输出",b);
return 0;
}
2>scanf-扫描键盘函数
1)一般格式:scanf(格式控制,地址列表)
格式控制:与printf中的含义相同。
地址列表:由若干个地址组成的表列,可以是变量的地址,或者是字符串的首地址。
注意
第一:格式控制后面的应该是变量地址,不是变量名,例如
scanf("%f%f%f",a,b,c);(这时错误的写法,没有取地址)
scanf("%f%f%f",&a,&b,&c);(正确写法)
第二:在格式控制字符串中除了格式声明之外还有其他字符,则应该在输入时在对应位置上输入一直相同的字符串
案例:
#include <stdio.h>
int main()
{
int a;
printf("请输入一个整数 \n");
scanf("%d",&a);
printf(“你输入的数据是: %d\n”,a);
}
输出结果:
如果改变一下
#include <stdio.h>
int main()
{
int a;
printf("请输入一个整数 \n");
scanf("data=%d",&a);
printf(“你输入的数据是: %d\n”,a);
}
输出结果为,不是想要的结果
再次进行输入
由此可以看出,如果在“格式控制”中发现除了“地址表列”之外的字符。上面的例子就是“data=”是之外的字符,因此,我们在输入的时候需要将data=输入进去,然后输出就可以。
第三:对于连续输入的几组数据时,在格式控制中对于连续的几个数据不要再中间添加任何字符,直接连续书写。
#include <stdio.h>
int data1 = a;
int data2 = b;
int data3 = c;
float data4 = d;
int main()
{
printf("输入四个整形数据\n");
scanf("%d%d%d%f",&data1,&data2,&data3,&data4);
printf("按照输入顺序,你的输入结果是: data1 = %d,data2 = %d,data3 = %d,data4 = %f ,"data1,data2,data3,data4);
}
结果
小结
1.对于printf函数而言,控制语句部分将需要打印的部分用“%+数据表示方法”代替,地址列表中写入需要打印的变量名
2.对于scanf函数而言,地址表列部分需要对变量名进行取地址,否则不会成功。
二:流程控制语句
1.选择结构与判断语句
1>if……else……
(1)6种运算关系符
< | 小于 | 优先级相同(高) |
> | 大于 | |
<= | 小于等于 | |
>= | 大于等于 | |
== | 等于 | 优先级相同(低) |
!= | 不等于 |
(2)逻辑运算符
&& | 逻辑与 | a&&b | 如果a与b都为真,则结果为真,否则为假 |
|| | 逻辑或 | a||b | 如果a与b只有一个为真,则全部为真;两个都是假,则全部为假 |
! | 逻辑非 | !a | 如果a为真,则!a为假;如果a为假,则!a为真 |
(3)语句结构:
if(表达式)
语句1;
else
语句2;
执行结果:如果表达式为真,则执行语句1,否则就执行语句2.
案例:
#include <stdio.h>
int main()
{
int a;
int b;
int c;
printf("请分别对a和b进行赋值输入\n");
scanf("%d%d",&a,&b);
if(a>10 && b<30)
{
c = 60;
}
else
{
c = 70;
}
printf("当前输出的c的值是: %d\n",c);
}
执行结果如下
if……else……嵌套案例
#include <stdio.h>
int main()
{
int a;
int b;
int c;
int d;
int f;
int g;
printf("请输入5组数据进行赋值输入\n");
scanf("%d%d%d%d%d",&a,&b,&c,&d,&f);
if(a>10 && b<30)
{
if(c<100 && d>300)
{
if(f>210)
{
g = 65;
}
else
{
g = 365;
}
}
else
{
g = 55;
}
}
else
{
g = 70;
}
printf("当前输出的c的值是: %d\n",g);
}
执行结果如下
2>switch……case……
(1)语句结构
switch(表达式)
case1:语句1;
case2:语句2;
…………
执行结果:通过判断表达式中的值,来进行语句执行的选择,执行与表达式的值相同的case值后面的语句。
(2)存在意义:对于多层语句结构可以使用if语句进行处理,但是由于层数较多,因此程序可读性减低,因此可以使用Switch语句对于多分支结构进行处理。
(3)编程案例:通过分数进行等级划分。
#include <stdio.h>
int main()
{
int datas;
printf("请输入你的成绩\n");
scanf("%d",&datas);
switch(datas/10)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
printf("您的成绩不合格,请重新考试,等级是D");
break;
case 6:
case 7:
printf("您的成绩已经及格,等级是C");
break;
case 8:
case 9:
printf("您的成绩成绩较为优秀,等级是B");
break;
case 10:
printf("您的成绩属于优秀,等级为A");
break;
default:
printf("成绩输入非法,请重新输入");
return 0;
}
}
执行结果:
3>while与for循环语句
1)while循环语句
语句结构:
while(表达式)
{语句;}
执行过程:当while后面的表达式一直为真,那么就会反复执行后面的语句。
存在意义:在程序中,只有选择结构与顺序结构是不够的,因为还需要经常处理一些循环问题,比如,对前30个整数进行加和,又比如,求出全班50学生的数学成绩等。
应用:对前100整数求和
#include <stdio.h>
int main()
{
int sum_data = 0; //声明求和之后的数值
int data = 1; //从1到100的数据
while(data<=100)
{
sum_data = sum_data + data;
data = data + 1;
}
printf("0到100数据加和为:%d\n",sum_data);
return 0;
}
2)for循环
语句结构:for(表达式1;表达式2;表达式3)
表达式1 | 设置初始条件,执行一次,可以为一个或多个变量赋予初值 |
表达式2 | 循环条件表达式,用于是否继续进行循环。每次循环之前需要对其进行检查,看是否满足条件 |
表达式3 | 作为循环调整,循环变量增值,执行完循环体之后进行的 |
其他形式:对于其他形式的for循环,可能会出现分别省略表达式1、表达式2或表达式3.
应用:对前100整数求和
形式1:表达式全部完整,符合for循环传统结构
#include <stdio.h>
int main()
{
int sum_data = 0;
int datas;
for(datas=1;datas<=100;datas++)
{
sum_data = sum_data + datas;
}
printf("0到100数据加和为:%d\n",sum_data);
return 0 ;
}
形式2:表达式1缺失,缺少初值---在整个程序前面加上初值即可。
#include <stdio.h>
int main()
{
int sum_data = 0;
int datas = 1;
for(;datas<=100;datas++)
{
sum_data = sum_data + datas;
}
printf("0到100数据加和为:%d\n",sum_data);
return 0 ;
}
形式3:表达式3缺失,缺少循环执行内容---在for循环中加上循环执行内容。
#include <stdio.h>
int main()
{
int sum_data = 0;
int datas;
for(datas=1;datas<=100;)
{
sum_data = sum_data + datas;
datas = datas + 1;
}
printf("0到100数据加和为:%d\n",sum_data);
}
注意:如果需要在for循环后面缺少表达式,那么对应位置的分号不可以丢失不写,否则就会出问题。
4>通过break提前结束循环
案例:在全校1000学生中,进行慈善募捐,当捐款总数达到10万元时就结束,统计此时的捐款人数以及每个人平均捐款数目
#include <stdio.h>
int main()
{
int people_num = 1; //捐款人数
int people_total = 0; //捐款总金额
int money; //每个人捐款人数
while(people_num<1000)
{
printf("请输入捐款金额:\n");
scanf("%d",&money);
people_total = people_total + money;
printf("当前捐款总金额是:%d\n",people_total);
if(people_total>=10000)
{
printf("捐款金额已经达到目标");
break;
}
people_num = people_num + 1;
}
printf("当前捐款总金额是:%d\n",people_total);
printf("当前捐款人数:%d\n",people_num);
printf("每个人平均捐款金额:%f\n",(float)people_total/people_num);
return 0;
}
5>contine提前结束本次循环
案例:找出在指定范围中可以被整除的所有整数,比如请找出在范围A-B之间可以被C整除的数
#include <stdio.h>
int main()
{
int datas_min; //设定查找范围最小值
int datas_max; //设定查找范围最大值
int num; //设定需要查找的倍数
int datas;
printf("请分别输入查找范围最小值、最大值以及查找倍数");
scanf("%d%d%d",&datas_min,&datas_max,&num);
for(datas=datas_min;datas<=datas_max;datas++)
{
if(datas %num != 0)
{
continue;
}
printf("%d ",datas);
}
}
练习:输入两个正整数m与n,求其最大公约数和最小公倍数
#include <stdio.h>
int main()
{ int m; //第一个正整数
int n; //第二个正整数
int max; //最大公因数
int min; //最小公倍数
int w; //临时变量1
int q; //临时变量2
printf("请输入两个正整数\n");
scanf("%d%d",&m,&n);
w = m;
q = n;
printf("临时变量1:%d\n",w);
printf("临时变量2:%d\n",q);
while(w != q)
{
if(w>q)
{
w = w - q;
}
if(q>w)
{
q = q - w;
}
}
if(w == q)
{
max = q;
}
min = (m*n)/max;
printf("最大公因数是:%d\n",max);
printf("最小公倍数是:%d\n",min);
return 0;
}
执行结果