查看: 103|回复: 1

语言教程

[复制链接]

2

主题

4

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2022-9-21 10:34:02 | 显示全部楼层 |阅读模式
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);

    • %d说明后面有一个整数要输出在这个位置上

  • 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("请输入金额(元)");
8    scanf("%d",&price);
9
10    int change = 100 - price;
11    printf("找您%d元\n",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("请输入金额(元)");
7    scanf("%d",&price);
8    int change = AMOUNT- price;
9    printf("找您%d元。\n",change);
10    return 0;
11}2.1.6浮点数


  • 美国人固执的使用英制单位,他们习惯几尺几寸来报自己的身高。
1#include <stdio.h>
2int main()
3{
4printf("请分别输入身高的英尺和英寸""如输入\"5 7\"表示5英尺7英寸");   
5int foot;
6int inch;
7
8scanf("%d %d",&foot,&inch);
9
10printf("身高是%f米。\n",
11((foot+inch/12.0)*0.3048));
12return 0;
13}改进



image-20220228215339734

浮点数
带小数点的数值。浮点这个词的本意是指小数点是浮动的,是计算机内部表达非整数的一种方式。
double

  • inch是定义为int类型的变量,如果把int换成double,我们就把它改成double类型的浮点数变量了。
  • double的意思是双,他本来是双精度浮点数的第一个单词,人们来表示浮点数类型。除了double还有float表示单精度浮点数。
数据类型

  • 整数
  • int
  • printf("%d",…)
  • scanf("%d",…)
  • 带小数点的数
  • double
  • printf("%f",…)
  • scanf("%lf",…)
2.2.1表达式

运算符

  • 运算符是指进行运算的动作,比如运算符加
  • 算子是指参与运算的值,这个值可能是常数,也可能是变量,还可能是一个方法的返回值。



image-20220228220643400


  • image-
2.2.2运算符优先级

求平均值

  • 写一个程序,输入两个整数,输出他们的平均值
1#include <stdio.h>
2
3int main()
4{
5    int a,b;
6    scanf("%d %d",&a,&b);
7    double c = (a + b)/2.0;
8    printf("%d和%d的平均值=%f",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("%d",&x);
6    double amount = x*(1+0.033)*(1+0.033)*(1+0.033);
7    printf("%f",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("a=%d,b=%d\n",a,b);
11    return 0;
12 }


image-20220301143708935

image-20220301143708935
**ps:**dev打开调试工具:工具-编译选项-代码生成/优化-连接器-产生调试信息-yes
工具-环境选项-浏览debug变量-查看鼠标指向的变量
2.2.4复合赋值和递增递减

复合赋值

  • 5个算术运算符,可以和赋值运算符=结合起来,形成复合赋值运算符。



image-20220301145533407


  • "++",“--”是两个很特殊的运算符,他们是单目运算符
  • 前置和后置是不一样的,++a说明a先加1再赋值。而a++是先赋值再加1
1#include <stdio.h>
2
3int main()
4{
5    int a;
6    a = 10;
7
8    printf("a++=%d\n",a++);
9    printf("a=%d\n",a);
10
11    printf("++a=%d\n",++a);
12    printf("a=%d\n",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("%d %d",&hour1,&minute1);
8    scanf("%d %d",&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 ("时间差是%d小时%d分\n",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("请输入金额");
        scanf("%d",&price);
        printf("请输入票面");
        scanf("%d",&bill);
        //计算找零
        if(bill>=price) {
                printf("应该找您:%d\n",bill-price);
                return 0;
        }
}
#include <stdio.h>
int main(){
        const int MINOR = 35;
        int age = 0;
        printf("请输入你的年龄:");
        scanf("%d",&age);

        printf("你的年龄是%d岁。\n",age);
        if(age<MINOR){
                printf("年轻还是美好的");
        }
        printf("年纪决定了你的精神世界,好好珍惜吧");
        return 0;
} 3.1.4 否则的话

#include <stdio.h>
int main()
{
        //初始化
        int price = 0;
        int bill = 0;
        //读入金额和票面
        printf("请输入金额");
        scanf("%d",&price);
        printf("请输入票面");
        scanf("%d",&bill);
        //计算找零
        if(bill>=price) {
                printf("应该找您:%d\n",bill-price);
        }else{
                printf("你的钱不够");
        }

} 比较两个数的大小
int a,b;
printf("请输入两个整数:");
scanf("%d %d",&a,&b);

int max = b;
if(a>b){
    max=a;
}

printf("大的那个是%d\n",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("请输入工作的小时数:");
        scanf("%d",&hours);
        printf("\n");
        if(hours>STANDARD)
                pay = STANDARD * RATE +(hours-STANDARD) * (RATE*1.5);
        else
        pay= hours * RATE;
        printf("应付工资:%f\n",pay);
         
} 判断成绩
#include <stdio.h>
int main()
{
        const int PASS = 60;
        int score;

        printf("请输入你的成绩:");
        scanf("%d",&score);
        printf("你输入的成绩是:%d\n",score);
        if(score>=PASS)
                printf("祝贺你,这个成绩及格了");
        else
                printf("很遗憾这个成绩没有及格\n");
                printf("再见");
}3.2.1嵌套的if-else

判断三个数的大小



image-20220302170143241

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

  • else 总是和最近的那个if匹配
3.2.3级联的if-else-if




image-20220303112723918

3.2.3 if-else的常见错误

if语句常见的错误

  • 忘记添加大括号
if(age>60)//忘记添加大括号,C语言是不认识缩进的
    salary= salary*1.2;
printf("%f",salary);//养成好习惯,永远在if和else后面加上大括号,即使后面只有一条语句。

  • if后面的分号
if(age>60)
    ;//if后面有一条语句,没有什么含义
    salary= salary*1.2;
printf("%f",salary);

  • 错误使用==和=

    • 要区分=赋值和==相等的区别

  • 使人困惑的else

    • 在if和else之后必须加上大括号形成语句块。
    • 大括号内的语句缩进一个tab的位置

3.2.4多路分支

switch-case
include <stdio.h>
int main()
{
        int type;
        scanf("%d",&type);

        switch(type){
                case 1:
                        printf("你好");
                        break;
                case 2:
                        printf("早上好");
                        break;
                case 3:
                        printf("晚上好");
                        break;
                case 4:
                        printf("再见");
                        break;
                default:
                        printf("啊,什么啊?");
        }
}

  • 控制表达式只能是整数型的结果。
  • 常数可以是常量,也可以是常数计算的表达式



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("%d",&x);
while(x>0){
        n++;
        x/=10;
}
printf("%d\n",n);
} 4.1.2while循环

do-while循环

  • 在进入循环的时候不做检查,而是在执行完一轮循环体的代码之后再来检查循环的条件是否满足,如果满足则继续下一轮循环,不满足则结束循环。=特别注意:while语句后面的分号不要忘记=
do
{
    <循环体语句>
}while(<循环条件>);


image-20220304173829932

4.1.3do-while循环

4.2.1循环计算


  • log2x
#include <stdio.h>
int main()
{
        int x;
        int ret = 0;
        scanf("%d",&x);
                int t=x;
        while(x>1){
                x/=2;
                ret ++;
        }
        printf("log2 of %d is %d.",t,ret);
        return 0 ;
}

  • 计数循环
#include<stdio.h>
int main(){
        int count=100;
        while(count>=0){
                printf("%d\n",count);
                --count;
        }
        printf("发射!");
}4.2.2猜数游戏

随机数

  • 每次召唤rand()就会得到一个随机的整数
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(){
        srand(time(0));
        int a = rand();

        printf("%d\n",a);

        return 0;
} %100

  • x%n的结果是[0,n-1]的一个整数
=实现猜数游戏=

  • 让计算机想一个数,然后让用户来猜,用户每输入一个数,就告诉他是大了还是小了,知道用户猜中为止,最后还要告诉它猜了多少次。
  • 因为需要不断重复让用户猜,所以需要用到循环
思路

  • 计算机随即想一个数,记住变量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("我已经想好了一个1到100之间的数。");
        do{
                printf("请猜这个1到100之间的数:");
                scanf("%d",&a);
                count ++;
                if(a>number){
                printf("你猜的岁数大了。");        ;
                } else if(a<number){
                printf("你猜的岁数小了");
                }
        } while(a!=number);//回到12行
        printf("太好了,你用了%d次就猜到了答案。\n",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("%d",&number);
while(number !=-1) {
sum+=number;
count ++;
scanf("%d",&number);
}
printf("%f\n",1.0*sum/count);//使结果变成小数
return 0;

}

  • 结果:



image-20220305195259626

4.2.4整数逆序

整数分解


  • 一个整数是由意味至多位数字组成,如何分解出整数的各个位上的数字,然后加以计算

    • 对一个整数坐%10的操作,就得到它的各位数;
    • 对一个整数做/10的操作,就去掉了它的个位数;
    • 然后再对2的结果做%10,就得到原来数的十位数了;
    • 以此类推

#include<stdio.h>

int main()
{
int x;
//scanf("%d",&x);
x=12345;
int digit;
  int ret = 0;

while(x>0) {
digit = x%10;//取出个位数
//printf("%d\n",digit);
ret = ret*10 + digit;//将最右边的数移动左边
printf("x=%d,digit=%d,ret=%d\n",x,digit,ret);
x/=10;//将个位数去掉
}
printf("%d,ret");

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("%d",&n);

int fact = 1;
int i =1;
for(i=1;i<=n;i++){//i++是每轮结束才会加
fact*=i;
}
printf("%d!=%d\n",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循环控制

素数

  • 只能被i和自己整除的数

    • 1,2,3,5,7,13,19

#include <stdio.h>
int main()
{
int x;
scanf("%d",&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("是素数\n");2
}else{
printf("不是素数\n");
}
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("%d\n", 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("%d\t",x );
if(cnt %5==0){
printf("\n");
}
}
}
return 0;
}5.2.3从嵌套的循环中跳出来

从sh
本文使用 WPL/s 发布 @GitHub
回复

举报

2

主题

9

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2025-2-18 06:24:01 | 显示全部楼层
撸过
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表