|
1.1算法
- 我们要让计算机做计算,就需要像这样找出计算的步骤,然后用编程语言写出来。
- 计算机做出的所有的事情都叫做计算
- 计算的步骤就是算法
1.1.2计算机的思维模式
程序的执行
- 解释:借助一个程序,那个程序能试图理解你的程序,然后按照你的要求执行
- 编译:借助一个程序,就像一个翻译,把你的程序翻译成计算机真正能懂的语言—机器语言--写的程序,然后,这个机器语言写的程序直接执行了。
1.1.3C语言的历史
- C语言是从B语言发展而来的,B语言是从BCPL发展而来的,BCPL是从FORTRAN发展而来的。
- BCPL和B都支持指针间接方式,所以C也支持
- C语言还受到了PL/I的影响,还和PDP-2的机器语言有很大的关系
- 1973年3月,第三版的Unix出现了C语言的编译器
- 1973年2月,第四版的Unix发不了,这个版本完全是用C语言重新写的

image-20220223223645347

image-20220223223836927

image-20220223224004884

image-20220224212547281
- image-20220224212547281 做计算
- printf("%d\n",23+43);
- printf("23+43=%d\n",23+43)

image-20220224213425845
- 如何输入c ¨K31K int main() { int price = 0; printf("请输入金额(元)"); scanf("%d",&price); int change = 100 - price; printf("找出您%d元\n",change); return 0; }
2.1变量常量
2.1.2变量定义
- int price = 0;
- 这一行,定义了一个新变量。变量的名字是price,类型是int,初始值是0.
- 变量是一个保存数据的地方,当我们需要在程序里保存数据时,比如上面的例子中要记录用户输入的价格,就需要一个变量来保存它。用一个变量保存了数据,它才能参加后面的计算中,比如计算找零。变量的名字=变量=需要一个名字,变量的名字是一种标识符,意思是它是用来识别这个和那个的不同的名字。
- 标识符有标识符的构造规则。基本的原则是:**标识符只能是由字母、数字、和下划线组成,数字不能出现在第一个位置上,C语言的关键字不可以用作标识符。
2.1.3变量赋值与初始化
- int price=0;
- 这一行,定义了一个变量。变量的名字是price,类型是int,初始值是0.
- price=0是一个式子,这里的=是一个赋值运算符,表示将=右边的值赋给左边的变量。
- a=b表示要求计算机做一个动作:将b的值赋给a。
初始化
2.1.4变量输入
- scanf("%d",&price);
- 要求scanf这个函数读入下一个整数,读到的结果赋值给变量price
- 小心price前面的&
1#include <stdio.h>
2
3int main()
4{
5 int price = 0;
6
7 printf(&#34;请输入金额(元)&#34;);
8 scanf(&#34;%d&#34;,&price);
9
10 int change = 100 - price;
11 printf(&#34;找您%d元\n&#34;,change);
12 return 0;
13 } 2.1.5变量vs常量
const
- const是一个修饰符,加在int前面,用来给这个变量加上一个const(不变的)的属性。这个const属性表示这个变量的值一旦初始化就不能再修改了。
- int change = AMOUNT - price
- 如果你试图对常量做修改,把它放在赋值运算符的左边,就会被编译器发现,指出为一个错误。
1#include <stdio.h>
2int main()
3{
4 const int AMOUNT = 100;
5 int price = 0;
6 printf(&#34;请输入金额(元)&#34;);
7 scanf(&#34;%d&#34;,&price);
8 int change = AMOUNT- price;
9 printf(&#34;找您%d元。\n&#34;,change);
10 return 0;
11}2.1.6浮点数
- 美国人固执的使用英制单位,他们习惯几尺几寸来报自己的身高。
1#include <stdio.h>
2int main()
3{
4printf(&#34;请分别输入身高的英尺和英寸&#34;&#34;如输入\&#34;5 7\&#34;表示5英尺7英寸&#34;);
5int foot;
6int inch;
7
8scanf(&#34;%d %d&#34;,&foot,&inch);
9
10printf(&#34;身高是%f米。\n&#34;,
11((foot+inch/12.0)*0.3048));
12return 0;
13}改进

image-20220228215339734
浮点数
带小数点的数值。浮点这个词的本意是指小数点是浮动的,是计算机内部表达非整数的一种方式。
double
- inch是定义为int类型的变量,如果把int换成double,我们就把它改成double类型的浮点数变量了。
- double的意思是双,他本来是双精度浮点数的第一个单词,人们来表示浮点数类型。除了double还有float表示单精度浮点数。
数据类型
- 整数
- int
- printf(&#34;%d&#34;,…)
- scanf(&#34;%d&#34;,…)
- 带小数点的数
- double
- printf(&#34;%f&#34;,…)
- scanf(&#34;%lf&#34;,…)
2.2.1表达式
运算符
- 运算符是指进行运算的动作,比如运算符加
- 算子是指参与运算的值,这个值可能是常数,也可能是变量,还可能是一个方法的返回值。

image-20220228220643400
2.2.2运算符优先级
求平均值
1#include <stdio.h>
2
3int main()
4{
5 int a,b;
6 scanf(&#34;%d %d&#34;,&a,&b);
7 double c = (a + b)/2.0;
8 printf(&#34;%d和%d的平均值=%f&#34;,a,b,c);
9}运算符优先级

image-20220301135848390
计算复利
- 在银行存定期的时候,可以选择到期后自动转存,并将到期的利息计入本金合并转存。如果一年期的定期利息是3.3%,那么连续自动转存3年后,最初存入的x元定期会得到多少本息余额?
- 本息合计= x(+3.3%)立方
1#include <stdio.h>
2int main()
3{
4 int x;
5 scanf(&#34;%d&#34;,&x);
6 double amount = x*(1+0.033)*(1+0.033)*(1+0.033);
7 printf(&#34;%f&#34;,amount);
8}2.2.3交换变量
int a = 6;
int b = 5;
如何交换a、b两个变量的值?
1#include <stdio.h>
2int main()
3{
4 int a = 5;
5 int b = 6;
6 int t;
7 t = a;
8 a = b;
9 b = t;
10 printf(&#34;a=%d,b=%d\n&#34;,a,b);
11 return 0;
12 }

image-20220301143708935
image-20220301143708935
**ps:**dev打开调试工具:工具-编译选项-代码生成/优化-连接器-产生调试信息-yes
工具-环境选项-浏览debug变量-查看鼠标指向的变量
2.2.4复合赋值和递增递减
复合赋值
- 5个算术运算符,可以和赋值运算符=结合起来,形成复合赋值运算符。

image-20220301145533407
- &#34;++&#34;,“--”是两个很特殊的运算符,他们是单目运算符
- 前置和后置是不一样的,++a说明a先加1再赋值。而a++是先赋值再加1
1#include <stdio.h>
2
3int main()
4{
5 int a;
6 a = 10;
7
8 printf(&#34;a++=%d\n&#34;,a++);
9 printf(&#34;a=%d\n&#34;,a);
10
11 printf(&#34;++a=%d\n&#34;,++a);
12 printf(&#34;a=%d\n&#34;,a);
13
14 return 0;
15}3.1
3.1.1 做判断
1#include <stdio.h>
2int main()
3{
4 int hour1,minute1;
5 int hour2,minute2;
6
7 scanf(&#34;%d %d&#34;,&hour1,&minute1);
8 scanf(&#34;%d %d&#34;,&hour2,&minute2);
9
10 int ih = hour2-hour1;
11 int im = minute2-minute1;
12 if(im<0){
13 im = 60 + im;
14 ih --;
15 }
16 printf (&#34;时间差是%d小时%d分\n&#34;,ih,im);
17}3.1.2判断条件

image-20220301195543269
关系运算的结果
- 当两个值关系符合运算符的预期时。关系运算的结果为整数1,否则为整数0
- 所有关系运算符的优先级比算术运算的低,但是比赋值运算的高(判断是否相等的==和!=的优先级比其他的低,而连续的关系运算时从左到右进行的)
2.1.3找零计算器

image-20220301200619198
#include <stdio.h>
int main()
{
//初始化
int price = 0;
int bill = 0;
//读入金额和票面
printf(&#34;请输入金额&#34;);
scanf(&#34;%d&#34;,&price);
printf(&#34;请输入票面&#34;);
scanf(&#34;%d&#34;,&bill);
//计算找零
if(bill>=price) {
printf(&#34;应该找您:%d\n&#34;,bill-price);
return 0;
}
}
#include <stdio.h>
int main(){
const int MINOR = 35;
int age = 0;
printf(&#34;请输入你的年龄:&#34;);
scanf(&#34;%d&#34;,&age);
printf(&#34;你的年龄是%d岁。\n&#34;,age);
if(age<MINOR){
printf(&#34;年轻还是美好的&#34;);
}
printf(&#34;年纪决定了你的精神世界,好好珍惜吧&#34;);
return 0;
} 3.1.4 否则的话
#include <stdio.h>
int main()
{
//初始化
int price = 0;
int bill = 0;
//读入金额和票面
printf(&#34;请输入金额&#34;);
scanf(&#34;%d&#34;,&price);
printf(&#34;请输入票面&#34;);
scanf(&#34;%d&#34;,&bill);
//计算找零
if(bill>=price) {
printf(&#34;应该找您:%d\n&#34;,bill-price);
}else{
printf(&#34;你的钱不够&#34;);
}
} 比较两个数的大小
int a,b;
printf(&#34;请输入两个整数:&#34;);
scanf(&#34;%d %d&#34;,&a,&b);
int max = b;
if(a>b){
max=a;
}
printf(&#34;大的那个是%d\n&#34;,max);3.1.4if语句

image-20220302154506457
计算薪水
#include <stdio.h>
int main()
{
const double RATE=8.25;
const int STANDARD=40;
double pay = 0.0;
int hours;
printf(&#34;请输入工作的小时数:&#34;);
scanf(&#34;%d&#34;,&hours);
printf(&#34;\n&#34;);
if(hours>STANDARD)
pay = STANDARD * RATE +(hours-STANDARD) * (RATE*1.5);
else
pay= hours * RATE;
printf(&#34;应付工资:%f\n&#34;,pay);
} 判断成绩
#include <stdio.h>
int main()
{
const int PASS = 60;
int score;
printf(&#34;请输入你的成绩:&#34;);
scanf(&#34;%d&#34;,&score);
printf(&#34;你输入的成绩是:%d\n&#34;,score);
if(score>=PASS)
printf(&#34;祝贺你,这个成绩及格了&#34;);
else
printf(&#34;很遗憾这个成绩没有及格\n&#34;);
printf(&#34;再见&#34;);
}3.2.1嵌套的if-else
判断三个数的大小

image-20220302170143241
#include <stdio.h>
int main()
{
int a,b,c;
int max = 0;
scanf(&#34;%d %d %d&#34;,&a,&b,&c);
if(a>b){
if(a>c){
max =a;
}else{
max=c;
}
}else{
if(b>c){
max=b;
}else{
max=c;
}
}
printf(&#34;The max is%d\n&#34;,max);
}else的匹配
3.2.3级联的if-else-if

image-20220303112723918
3.2.3 if-else的常见错误
if语句常见的错误
if(age>60)//忘记添加大括号,C语言是不认识缩进的
salary= salary*1.2;
printf(&#34;%f&#34;,salary);//养成好习惯,永远在if和else后面加上大括号,即使后面只有一条语句。
if(age>60)
;//if后面有一条语句,没有什么含义
salary= salary*1.2;
printf(&#34;%f&#34;,salary);
- 错误使用==和=
- 使人困惑的else
- 在if和else之后必须加上大括号形成语句块。
- 大括号内的语句缩进一个tab的位置
3.2.4多路分支
switch-case
include <stdio.h>
int main()
{
int type;
scanf(&#34;%d&#34;,&type);
switch(type){
case 1:
printf(&#34;你好&#34;);
break;
case 2:
printf(&#34;早上好&#34;);
break;
case 3:
printf(&#34;晚上好&#34;);
break;
case 4:
printf(&#34;再见&#34;);
break;
default:
printf(&#34;啊,什么啊?&#34;);
}
}
- 控制表达式只能是整数型的结果。
- 常数可以是常量,也可以是常数计算的表达式

image-20220303134928187
4.1.1循环
- 找出数字的位数
- 用户输入x;
- 初始化n为0;
- x=x/10,去掉个位;
- n++;
- 如果x>0,回到3;
- 否则n就是结果。
#include<stdio.h>
int main(){
int x;
int n=0;
scanf(&#34;%d&#34;,&x);
while(x>0){
n++;
x/=10;
}
printf(&#34;%d\n&#34;,n);
} 4.1.2while循环
do-while循环
- 在进入循环的时候不做检查,而是在执行完一轮循环体的代码之后再来检查循环的条件是否满足,如果满足则继续下一轮循环,不满足则结束循环。=特别注意:while语句后面的分号不要忘记=
do
{
<循环体语句>
}while(<循环条件>);

image-20220304173829932
4.1.3do-while循环
4.2.1循环计算
#include <stdio.h>
int main()
{
int x;
int ret = 0;
scanf(&#34;%d&#34;,&x);
int t=x;
while(x>1){
x/=2;
ret ++;
}
printf(&#34;log2 of %d is %d.&#34;,t,ret);
return 0 ;
}
#include<stdio.h>
int main(){
int count=100;
while(count>=0){
printf(&#34;%d\n&#34;,count);
--count;
}
printf(&#34;发射!&#34;);
}4.2.2猜数游戏
随机数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
srand(time(0));
int a = rand();
printf(&#34;%d\n&#34;,a);
return 0;
} %100
=实现猜数游戏=
- 让计算机想一个数,然后让用户来猜,用户每输入一个数,就告诉他是大了还是小了,知道用户猜中为止,最后还要告诉它猜了多少次。
- 因为需要不断重复让用户猜,所以需要用到循环
思路:
- 计算机随即想一个数,记住变量number里;
- 一个负责记次数的变量count初始化为0;
- 让用户输入一个数字a;
- count递增
- 判断a与number的大小关系,如果a大,就输出“大”,如果a小就输出“小”;
- 如果a与number是不相等的,程序转回第三步
- 否则,程序输出猜中和次数,然后结束。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
srand(time(0));
int number = rand()%100+1//随机取 1-100之间的数
int count = 0;
int a = 0;
printf(&#34;我已经想好了一个1到100之间的数。&#34;);
do{
printf(&#34;请猜这个1到100之间的数:&#34;);
scanf(&#34;%d&#34;,&a);
count ++;
if(a>number){
printf(&#34;你猜的岁数大了。&#34;); ;
} else if(a<number){
printf(&#34;你猜的岁数小了&#34;);
}
} while(a!=number);//回到12行
printf(&#34;太好了,你用了%d次就猜到了答案。\n&#34;,count); 4.2.3算平均数
- 让用户输入一系列的正整数,最后输入-1表示输入结束,然后程序计算出这些数字的平均值,输出输入的数字的个数和平均数
- 变量->算法->流程图->程序
1)变量
- 一个记录读到的整数的变量
- x平均数怎么算
- 只需要每读到一个数,就把它加到一个累加的变量里,到全部数据读完,再拿他去除读到的数的个数就可以了
- 一个变量记录累加的结果,一个变量记录读到的数的个数
2)算法
- 初始化变量sum和count为0;
- 读入number;
- 如果number不是-1,则将number加入sum,并将count加1,回到2;
- 如果number是-1,则计算和打印出sum/count(换算成浮点数来计算)

image-20220305192220627
#include <stdio.h>
int main()
{
int number;
int sum = 0;
int count =0;
scanf(&#34;%d&#34;,&number);
while(number !=-1) {
sum+=number;
count ++;
scanf(&#34;%d&#34;,&number);
}
printf(&#34;%f\n&#34;,1.0*sum/count);//使结果变成小数
return 0;
}

image-20220305195259626
4.2.4整数逆序
整数分解
- 一个整数是由意味至多位数字组成,如何分解出整数的各个位上的数字,然后加以计算
- 对一个整数坐%10的操作,就得到它的各位数;
- 对一个整数做/10的操作,就去掉了它的个位数;
- 然后再对2的结果做%10,就得到原来数的十位数了;
- 以此类推
#include<stdio.h>
int main()
{
int x;
//scanf(&#34;%d&#34;,&x);
x=12345;
int digit;
int ret = 0;
while(x>0) {
digit = x%10;//取出个位数
//printf(&#34;%d\n&#34;,digit);
ret = ret*10 + digit;//将最右边的数移动左边
printf(&#34;x=%d,digit=%d,ret=%d\n&#34;,x,digit,ret);
x/=10;//将个位数去掉
}
printf(&#34;%d,ret&#34;);
return 0;
}结果

image-20220305203346526
5.1.1for循环
阶乘
- n! = 1x2x3x4x5..xn
- 写一个程序,让用户输入n,然后计算输出n!
- 变量
- 显然读用户的输入需要一个int的n,然后计算的结果需要用一个变量保存,可以是int的factor,在计算中需要有一个变量不断地从1递增到n,那可以是int的1
#include<stdio.h>
int main()
{
int n;
scanf(&#34;%d&#34;,&n);
int fact = 1;
int i =1;
for(i=1;i<=n;i++){//i++是每轮结束才会加
fact*=i;
}
printf(&#34;%d!=%d\n&#34;,n,fact);//明确了循环次数可以使用for循环
} for循环就像一个计数器:设定一个计算器,初始化,然后在计数器到达某指之前,重复执行循环体,而每执行一轮循环,计数器一一定步进进行调整
for =对于
- for(count =10;count>0;count--)
- 就读成:对于一开始的count=10,当count>0时,重复做循环体,每一轮循环体在做完循环体内语句后,使得count--。
<hr/>循环次数
- for(i =0;i<n;i++)//循环的次数为n
- for(i=1;i<=n;i++)//循环的次数也为n

image-20220306185432531
<hr/>Tips for loops
- 如果有固定的次数,用for
- 如果必须执行一次,用do_while
- 其他情况用while
5.2.1循环控制
素数
#include <stdio.h>
int main()
{
int x;
scanf(&#34;%d&#34;,&x);
int i;
int isPrime = 1;//x是素数
for(i=2;i<x;i++) {//i小于n可以循环到n-1
if(x%i==0){
isPrime=0;
break;
}
}
if(isPrime==1){
printf(&#34;是素数\n&#34;);2
}else{
printf(&#34;不是素数\n&#34;);
}
return 0;
} <hr/>break vs continue
✌️break:跳出循环
continue:跳出循环这一轮剩下的语句进入下一轮

image-20220306192635602
<hr/>5.2.2循环的嵌套
- 循环里面还是循环
- 每一层变量尽量用不同的(对于初学者来说)
用c语言输出1到100之间的素数
#include <stdio.h>
int main()
{
int x;
for(x=1; x<=100; x++) {//计数器
int i;
int isPrime = 1;
for(i=2; i<x; i++) { //i小于n可以循环到n-1
if(x%i==0) {
isPrime=0;
break;
}
}
if(isPrime==1) {
printf(&#34;%d\n&#34;, x);
}
}
return 0;
}输出前50个素数
#include <stdio.h>
int main() {
int x;
int cnt = 0;
for(x=1; cnt<50; x++) {
int i;
int isPrime = 1;
for(i=2; i<x; i++) { //i小于n可以循环到n-1
if(x%i==0) {
isPrime=0;
break;
}
}
if(isPrime==1) {
cnt++;
printf(&#34;%d\t&#34;,x );
if(cnt %5==0){
printf(&#34;\n&#34;);
}
}
}
return 0;
}5.2.3从嵌套的循环中跳出来
从sh
本文使用 WPL/s 发布 @GitHub |
|