项目介绍:simpletex-webapi

一个借用SimpleTex解决在线Tex文档识别的方案

This is default featured slide 3 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 3 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 4 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

This is default featured slide 5 title

Go to Blogger edit html and find these sentences.Now replace these sentences with your own descriptions.

2022年6月18日星期六

2022年6月18日-4

 2022年6月18日

c语言是一门 结构化 的程序设计语言

生活中的结构

1.顺序结构:顺序,从上到下,没有插叙补叙

2.选择结构:中途有分叉,可A可B可C等选择

3.循坏结构:一直循环,或某一刻出去

本节课着重介绍后二者

分支语句 ~ if与switch

什么是语句:

c语言中由一个分号;隔开的就是一个语句

;//也是语句,空语句

 

if语句 

if(表达式)

语句;

 

 

if(表达式)

语句1;

else

语句2;

 

 

//多分句

 

if(表达式1)

语句1;

else if(表达式2)

语句2;

else

语句3;

 注意:

①else只与最近的未匹配的if匹配,所以若不想让某else与最近的if匹配,可以用{ }

②if(condition)

{return x ;}

return y ;

//符合条件,输出x,不符合条件输出y

③判断常量与变量关系时,为避免出bug,一般讲常量放在变量前,如5 == num,避免赋值操作

//错误例
int main()
{
int age = 10;
if(18<=age<28)//else if(18<=age<28)有问题,这是因为代码的顺序问题,先判断18<=age,为假,输出0,而0<28为真,故输出青年
printf("青年");

 

int main()
{
int age =20
if(age<18)
printf("未成年");
else if(age>=18 && age<28)
printf("青年");
else if(age>=28 && age<60)
printf("壮年");
else
printf("老年");
return 0 ;
}

也可以

int main()
{
int age =20
if(age<18)
printf("未成年");
else 
{
if(age>=18 && age<28) printf("青年") else if(age>=28 && age<60) printf("壮年"); else printf("老年"); } return 0 ; }

 

0 表示假,非0 表示真

如果条件成立,要执行多条语句,怎么利用代码块?

if(age<18)

{

printf("未成年");

printf("不能谈恋爱");

}

示例,输出1~100之间的奇数

int main()
{
    int i = 1;
        while(i <= 100)
        {
            if (i % 2 == 1)
            {
                printf("%d\n", i);
            }
            i ++;

        }
    return 0;
}

 

switch语句

若想输入1~7的一个数字,输出一个“星期N”,若用if语句要用if,else if*5 , else。

switch专门实现多分句

switch(整型表达式)//不能float、char等浮点

{

语句项;

}

那么语句项是什么呢?答:是一些case语句。如

case 整型常量表达式://条件

      语句;  //执行

      break;//跳出语句

示例:

 

int main()
{
    int day = 0;
        scanf_s("%d", &day);
    switch (day)
    {
    case 1:
        printf("星期一");
        break;
    case 2:
        printf("星期二");
        break;
    case 3:
        printf("星期三");
        break; 
    case 4:
        printf("星期四");
        break;
    case 5:
        printf("星期五");
        break;
    case 6:
        printf("星期六");
        break;
    case 7:
        printf("星期天");
        break;

    }
    return 0;
}

多个条件一个结果

int main()
{
    int day = 0;
        scanf_s("%d", &day);
    switch (day)
    {
    case 1:
    case 2:
    case 3: 
    case 4:
    case 5:
        printf("工作");
        break;
    case 6:
    case 7:
        printf("休息日");
        break;
        //多个条件一个结果

    }
    return 0;
}
int main()
{
    int day = 0;
        scanf_s("%d", &day);
    switch (day)
    {
    case 1:
    case 2:
    case 3: 
    case 4:
    case 5:
        printf("工作");
        break;
    case 6:
    case 7:
        printf("休息日");
        break;
        //多个条件一个结果
        //若前面case不能匹配(如8/9),则用户输入非法 ,可用default提示
    default:
        printf("你输错了,1~7谢谢");
        break;

    }
    return 0;
}

 

当然case语句中也能夹if之类的语句

注:if(1)表示真

循环语句

示例


打印1~10

int main()
{
int i = 1 ;
while(i <= 10)
  {printf("%d\n",i);
i ++ ;

   }
return 0 ;
}

 break

循环里碰到break直接终止循环,会不会与switch里的break混淆呢?

用例,打印1~4

int main()
{
    int i = 1;
    while (i <= 10)
    {
        if (i == 5)
        {
            break;
        };
        printf("%d\n", i);
i ++; }
return 0; }

 

continue介绍

while中遇到continue,终止本次后面代码,回到while重新判断(是否进入进入下一次循环的入口判断)。

如死循环例

int main()
{
    int i = 0;
    while(i <=10)
    {
        if(i == 5)
        {
            continue;
        }
        printf("%d\n", i);
        i++;
    }
    return 0;
}

 

 

正确的正确的打印1~10&&跳过5

int main()
{
    int i = 0;
    while(i <10)
    {
        i++;
        if(i == 5)
        {
            continue;
        }

        printf("%d\n", i);
        
    }
    return 0;
}

 

 

函数getchar和putchar

int main()
{
    char ch = 0;
        while ((ch = getchar()) != EOF)
        {
            putchar(ch);
        };
return 0;
}

getchar()--可接受键盘字符

如int ch = getchar()

之后打印字符可以用 putchar(ch)或printf("%c",ch),二者效果相同(不过printf的“”里还能带一些其他东西。。)

这里的EOF意为end of file(文件结束标志),一个字符,ctrl+z打出

2022年6月16日星期四

2022年6月16日-3

 2022年6月16日

*解引用操作符、间接访问操作符

#include<stdio.h>
int main()
{
    int a = 114; //先申请一个4字节空间
    printf("我要打印%p\n", &a);
    int* pb = &a; //int*是一种新的类型,告诉我们p是一个变量——指针变量,用来存放地址。
    printf("我要打印%p\n", pb);
    *pb = 20;//*解引用操作符、间接访问操作符
    printf("%d\n", a);//

    return 0;
}

%p

int*存放int类型变量的地址,double*用来存放double类型变量的地址

 

 结构体

之前的int, double, char等等只能表示一种类型,但为了表示诸如人物信息、书的基本信息这种复杂对象,需要引入结构体

如商品-名字-价格

//结构体初始化
struct item//创建一个名叫item的结构(自定义类型)
{
    char name[20];//这个结构体,第一个类型为名叫name的字符组[最多20个字]
    short int price;//第二个类型是名叫price的短整型

};//这里的;千万别忘了,与代码块不同
int main()
{
    struct item num1 = {"钻石剑" , 60};
    printf("商品:%s\n", num1.name);
    printf("价格%d\n", num1.price);
    num1.price = 0.2*("%d",num1.price);//修改price这个变量
    printf("打骨折后价格:%d\n",num1.price);
    return 0;
}

 

注意这里的num1.name和num1.price:            .   点操作符:应用到结构体的变量,  此时 . 可以找到成员

price是一个变量,可以很简单的修改。那么如何修改name这个数组

用到strcpy(string copy)字符串拷贝,是一个库函数<string.h>

strcpy(目的地..., 数据来自于...)

如strcpy(num1.name, "下届合金剑");

 

 

如果想用“取地址”来表示,需要注意以下

//结构体试做
struct item//创建一个名叫item的结构(自定义类型)
{
    char name[20];//这个结构体,第一个类型为名叫name的字符组[最多20个字]
    short int price;//第二个类型是名叫price的短整型

};//这里的;千万别忘了,与代码块不同
int main()
{
    struct item num1 = {"钻石剑" , 60};//此时num1的指针的类型是struct item* pb = &num1
    struct item* pb = &num1;//找到变量num1的地址,并储存在pb里
    //利用pb打印名字和价格
    printf("名字 = %s\n", (*pb).name);
    printf("价格 = %d\n", (*pb).price);
    return 0;
}

-> 箭头操作符,结构体指针指向成员   ->成员

//结构体试做
struct item//创建一个名叫item的结构(自定义类型)
{
    char name[20];//这个结构体,第一个类型为名叫name的字符组[最多20个字]
    short int price;//第二个类型是名叫price的短整型

};//这里的;千万别忘了,与代码块不同
int main()
{
    struct item num1 = {"钻石剑" , 60};//此时num1的指针的类型是struct item* pb = &num1
    struct item* pb = &num1;
    //利用pb打印名字和价格
    printf("名称%s\n", pb ->name);
    printf("价格%d\n", pb->price);//指向关系,容易理解
    return 0;
}

整个流程以及scanf函数的应用

错误应用

struct item
{
    char name[20];//命名
    int price;//价格
};

int main()
{
    struct item num1 = { "钻石",20 };
    struct item* pb = &num1;
    scanf_s("%d", &num1.name, &num1.price);
    printf("名称%s\n", pb->name);
    printf("价格%d\n", pb->price);
        return 0;
}

在scanf输入name(如黄金)时出错

scanf_s("%s%d", &num1.name, &num1.price);

这句有问题,因为name是一个数组,不是变量

//错误例2,
struct item
{
    char name[20];//命名
    int price;//价格
};

int main()
{
    struct item num1 = { "钻石",20 };
    struct item* pb = &num1;
    char rename[] = { scanf_s("%s") };
    
    strcpy_s(num1.name,("%s",rename));//本想先新建一个字符串,赋值,再替代原先的name,但好像学费了
    scanf_s("%d", &num1.price);
    printf("名称%s\n", pb->name);
    printf("价格%d\n", pb->price);
        return 0;
}

 

2022年6月15日星期三

2022年6月15日-2

 2022年6月15日

转义字符,(让某个字符不再是之前的意义)

数数"c:\test\32\test.c"字符串中有多少个字符

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
printf("%d \n",strlen("c:\test\32\test.c"))
return 0 ;
}

答案是13

因为 \t 被记为一个转义字符, \32 也被记为一个转义字符,

这时候要查一下ASCII表看看 \32 表示什么





因为 \ddd //ddd表示1~3个8进制数字,如\32和\032一样

        \xdd //dd表示1~2个十六进制数字(:A~F表示10~15)

\32 对应→,也被记为一个转义字符,因此答案是13

另外,若不想让\t表示转义字符,需将\t写为\\t

条件,

进入驾校你要学习,认真(1)即可通过,摆烂(0)就会挂科,最后判断是否通过。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int judge = 0;
printf("您进入了驾校,请问考前是否复习(1/0)? >: \n");
scanf("%d" , &judge );
if(judge = 1)
printf("通过\n");
else
printf("挂科\n");

return 0 ;
}

 但是一个代码块内,if只能用一次吗?

这里又犯了判断等于的错误

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
    int judge = 0;
    printf("您进入了驾校,请问考前是否复习(1/0)? >: \n");
    scanf("%d", &judge);
    if (judge = 1)
        printf("通过\n");
    else
        printf("挂科\n");
    printf("\n此时judge=%d\n", judge);
    return 0;
}

输入0,输出judge = 1

所以,应该是

if(judge == 1)

    printf("ao");

循环中的while语句,

为了通过科目一,你需要在考前刷题,驾校一点通一共有2186道摸呢题,你需要刷完才能过。

刷题(n/2186),循环,每一次经过让knowledge +1

→判断是否刷完

→通过

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
printf("您进入了驾校一点通\n开始刷题\n");
int knowledge = 0 ;
while(knowledge<2186)
{
printf("您刷了一道题目,知识+1\n");
knowledge++;
printf("您已经刷了%d道题目\n" , knowledge);

}
if(knowledge>=2186)
printf("您通过了科目一考试");
return 0 ;
}

替换knowledge++的方法,如一次性+10

printf("您刷了一道题目,知识+10\n");
        knowledge = ("%d",knowledge) + 10 ;

 

自定义函数,

用新建的自定义函数,如取名add(两数相加)和addpro(三数相加)

需要在主要代码块前先定义一下之后要用到的函数。

想一想这里为什么是add(int x , int y);而之后都是直接用已经有了的变量add(num1 , num2);

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int add(int x, int y)//定义add为两数相加
{
    int z = x + y;//这里等效于int z = 0;并且z = x + y;
    return z;
}

int addpro(int x, int y, int z)//定义addpro为三数相加
{
    int w = x + y + z;
    return w;
}


int main()
{
    int sum = 0;
    int num1 = 2;
    int num2 = 4;
    int num3 = 8;
    int num4 = 16;//我找了三个数哦


    sum = add(num1, num2);
    printf("%d \n", sum);

    sum = addpro(sum, num3, num4);
    printf("%d \n", sum);
    return 0;
}

若不定义addpro,就会报错,并提示“函数不接受三个参数”。

思考一下如何只定义一个函数,就能满足任意数相加,而不啻于定义多个add(pro,plus,extra,evolved)函数

那么,自定义函数有什么用呢,sum = x + y他不香吗?

遇到复杂的运算,一次要好多步,那么可以首先定义一波,之后就能像用快捷键一样“一键就叫”。

 数组,

定义:一组相同类型元素的集合。

如--int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个存放10个整数数字的数组,其中每个数都有一个序号与之对应0,1,2,3,4,5,6,7,8,9

这里想简单的创建一个数组,并打印其中的一个数。

#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};//创建数组
printf("%d \n" , arr[4]);//打印序号为4的数,也即5
return 0 ;
}

如果想把数组中的每一个数都打印一遍,可使用循环语句。

//错误例,笑
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0 ;
int m = 0 ; 
while(i<10)
{
printf("数值i从%d升级为%d \n",i , m ) ;
i++;
}
return 0;
}
//真实例
#include <stdio.h>
int main()
{
    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    int i = 0;
    while (i <10)
    {
        printf("%d \n ", arr[i]);
        i++;
    }
    return 0;
}

操作符简单介绍,

算术计算符:+ - * / %(取mod)

取mod介绍

如果用 / 除,结果为2

#include <stdio.h>
int main()
{
int a = 5/2;
printf("%d \n",a );    
return 0;
}

如果用 % ,取mod,结果为1

#include <stdio.h>
int main()
{
int a = 5%2;
printf("%d \n",a );    
return 0;
}

 移位操作符

左移<<和>>右移

整型1占4个字节--32bit

1的二进制表达为00000000000000000000000000000001

左移2后,左边丢弃,右边补0

00000000000000000000000000000100结果为1*2^2=4

#include <stdio.h>
int main()
{
int a = 1;
int b = a<<2;
printf("%d \n" , b);
return 0 ;
}

而a本身不变。

位操作符(二进制位)

&按位与

#include <stdio.h>
int main()
{
    int a = 3;
    int b = 5;
    int c = a & b;//c来接收值
    printf("%d\n", c);
    return 0;
}

结果为1,

3的二进制011,5的二进制101

 3=011

 5=101→001→1 找交集

tips:

如何将10进制转化为二进制

展开

 

|按位或

3=011

5=101→111→7 找并集

^按位异或

对应的二进制位相同,则为0;对应的二进制位相异,则为1。 

#include <stdio.h>
int main()
{
int a = 3;
int b = 5;
int c = a^b;
  printf("%d \n",c);
return 0 ;
}

结果为6

赋值操作符

int a = 10 ;//一个=叫赋值 ==两个叫判断相等
a = a + 10;//给a+10再赋给a
a += 10;//a在自己本身+10
a = a - 10;//
a -= 10;//&= |= ^= /= *= <<= >>=复合操作符
return 0;

单目操作符,双目操作符,三目操作符

a + b 左右各1个(共两个操作数),所以叫双目操作符

单目操作符

!逻辑反操作

c语言中,0表示假,其他一切表示真

int a = 10;

printf("%d",!a);//→0

但若!0得到的答案默认为1

-和+负值与正值

int a = -2

-a→2      +a→-2

故与数学相同,+无实际价值,通常省略

sizeof计算变量或类型所占空间大小

单位字节,

变量

int a = 4;
printf("%d \n",sizeof (a));

结果为4,因为一个基本整型占4个字节的空间

同时对变量来说,也可用sizeof a 直接计算

但对于类型如(int)、(long int)来说则不行,必须加上(括号)

数组

int main()
{
    int arr[10] = { 0 };//10个整型元素的数组
    printf(" % d \n", sizeof (arr));
        //计算一下数组的元素个数
                //数组总大小/每个元素的大小=个数
        printf("%d \n", sizeof(arr) / sizeof(arr[0]));
    return 0;
}

↑元素个数的计算方法↑