2020.2.23周报

一.图的遍历(深度优先搜索和广度优先搜索)

1.邻接矩阵表示法

(1)深度优先搜索

在这里插入图片描述上面的图片为基本思路
上面的图片为基本思路。

////////////////////////////////////////////////////////

下面是正是代码:

#include <stdio.h>

#include <stdlib.h>
int book[100],n,sum,map[100][100];
void dfs(int apex)
{
    int i;
    printf("%d  ",apex);//将当前顶点打印出来,同时也表示搜索的顺序
    sum++;//sum表示已经搜索过的顶点的个数,每搜索一个,sun++
    if(sum==n)//当搜索过的顶点和总顶点数相同时,返回
    {
        return;
    }
    for(i=1;i<=n;i++)//从1开始,遍历所有点
    {
        if(map[apex][i]==1&&book[i]==0)//判断该点与当前顶点apex是否右边,该点是否搜索过
        {
            book[i]=1;
            dfs(i);
        }
    }
    return;
}
int main()
{
    int i,j,m,a,b;
    scanf("%d %d",&n,&m);
    for(i=1;i<=n;i++)//初始化二维数组
    {
        for(j=1;j<=m;j++)
        {
            if(i==j)
            {
                map[i][j]=0;//对角线
            }
            else
            {
                map[i][j]=999999;//其他的先定义为无边状态
            }
        }
    }
    for(i=1;i<=n;i++)//读取边
    {
        scanf("%d %d",&a,&b);
        map[a][b]=map[b][a]=1;//右边则赋值为1
    }
    book[1]=1;//从1开始,则1已经搜索过
    dfs(1);//从1开始搜索
}

(3)广度优先搜索

在这里插入图片描述
在这里插入图片描述
上面是基本思路。
广度优先搜索,这里用了队列。

////////////////////////////////////////////////////////////

下面是正是代码:

#include <stdio.h>
int main()
{
    int book[100]={0},n,m,sum,map[100][100],i,j,a,b,apex;
    int queue[100],head,tail;
    scanf("%d %d",&n,&m);
    for(i=1;i<=n;i++)//初始化二维数组
    {
        for(j=1;j<=m;j++)
        {
            if(i==j)
            {
                map[i][j]=0;//对角线
            }
            else
            {
                map[i][j]=999999;//其他的先定义为无边状态
            }
        }
    }
    for(i=1;i<=n;i++)//读取边
    {
        scanf("%d %d",&a,&b);
        map[a][b]=map[b][a]=1;//右边则赋值为1
    }
    head=1,tail=1;
    queue[1]=1;
    tail++;
    book[1]=1;
    while(head<tail)
    {
        apex=queue[head];
        for(i=1;i<=n;i++)
        {
            if(map[apex][i]==1&&book[i]==0)
            {
                queue[tail]=i;
                tail++;
                book[i]=i;
            }
            if(tail>n)
            {
                break;
            }
        }
        head++;

    }
    for(i=1;i<=n;i++)
    {
        printf("%d  ",queue[i]);
    }
}

2.邻接表表示法

在这里插入图片描述
邻接表数据结构类型如下:

#define  MaxVertices 100
typedef struct node{   //边表 
   int adjvex;
   node* next;  
}EdgeNode;  
  
typedef struct{     //顶点表  
   int vertex;  
   EdgeNode* edgenext;  
}VertexNode;  
  
typedef VertexNode AdjList[MaxVertices];//顶点表数组  
  
typedef struct{   
    AdjList adjlist;  
    int n,e;  
}AdjMatrix; 

注:边表为链表结构,插入元素有头插法和尾插法两种,这里以头插法为例。

对应的,我们得到如下的结构:

在这里插入图片描述

拿无向图举例:
在这里插入图片描述

在这里插入图片描述
具体代码:

#include <stdio.h>  
#include <stdlib.h>  
#define  MaxVertices 100
typedef struct node{   //边表 
   int adjvex;
   node* next;  
}EdgeNode;  
  
typedef struct{     //顶点表  
   int vertex;  
   EdgeNode* edgenext;  
}VertexNode;  
  
typedef VertexNode AdjList[MaxVertices];  
  
typedef struct{   
    AdjList adjlist;  
    int n,e;  
}AdjMatrix;  

void CreateGraph(AdjMatrix* G)  
{  
    int i,j,k,w,v;  
    EdgeNode *s;  
    printf("输入顶点数和边数(中间以空格分开):");  
    scanf("%d%d",&G->n,&G->e);  
  
    printf("建立顶点表\n"); 
    for (i=0;i<G->n;i++)  
    {  
		//fflush(stdin);  
		//如果 stream 指向输入流(如 stdin),那么 fflush 函数的行为是不确定的。
		//故而使用 fflush(stdin) 是不正确的。
		getchar(); 
		printf("请输入第%d个顶点的信息:",i+1);
		G->adjlist[i].vertex=getchar();
		G->adjlist[i].edgenext=NULL;  
    }  
	//前插法 
    printf("建立边表\n");  
    for (k=0;k<G->e;k++)  
    {  
       printf("输入有连接的顶点序号:");  
       scanf("%d%d",&i,&j);  
       i-=1;j-=1;//①
       //对于直接相连的进行编入(即对输入“0 1”时,在0对应的边表中编入1) 
       s=(EdgeNode*)malloc(sizeof(EdgeNode));  
       s->adjvex=j;//边表赋值 
       s->next=G->adjlist[i].edgenext;  
       G->adjlist[i].edgenext=s;  
       //对于间接相连的进行编入(即对输入“0 1”时,在1对应的边表中编入0)
       s=(EdgeNode*)malloc(sizeof(EdgeNode));  
       s->adjvex=i;  
       s->next=G->adjlist[j].edgenext;  
       G->adjlist[j].edgenext=s;  
    }  
}   
void DispGraph(AdjMatrix *G)
{
	int i;
	for (i=0;i<G->n;i++)  
    {  
        printf("%d->",i+1);  
        while(1)  
        {             
			if(G->adjlist[i].edgenext==NULL)
            {
            	printf("^");
				break;	
			}
            printf("%d->",G->adjlist[i].edgenext->adjvex+1); 
            //② 
            G->adjlist[i].edgenext=G->adjlist[i].edgenext->next;  
 
        }  
        printf("\n");  
    }  
} 
int main()  
{  
   AdjMatrix* G= (AdjMatrix*)malloc(sizeof(AdjMatrix));  
   CreateGraph(G);  
   DispGraph(G); 
}

二.动态规划

1.动态规划和递归的关系

递归到动规的一般转化方法

递归函数有n个参数,就定义一个n维的数组,数组的下标是递归函数参数的取值范围,数组元素的值是递归函数的返回值,这样就可以从边界值开始, 逐步填充数组,相当于计算递归函数值的逆过程。

2.解题思路

动规解题的一般思路

1. 将原问题分解为子问题

把原问题分解为若干个子问题,子问题和原问题形式相同或类似,只不过规模变小了。子问题都解决,原问题即解决(数字三角形例)。
子问题的解一旦求出就会被保存,所以每个子问题只需求 解一次。
2.确定状态

在用动态规划解题时,我们往往将和子问题相关的各个变量的一组取值,称之为一个“状 态”。一个“状态”对应于一个或多个子问题, 所谓某个“状态”下的“值”,就是这个“状 态”所对应的子问题的解。
所有“状态”的集合,构成问题的“状态空间”。“状态空间”的大小,与用动态规划解决问题的时间复杂度直接相关。 在数字三角形的例子里,一共有N×(N+1)/2个数字,所以这个问题的状态空间里一共就有N×(N+1)/2个状态。
整个问题的时间复杂度是状态数目乘以计算每个状态所需时间。在数字三角形里每个“状态”只需要经过一次,且在每个状态上作计算所花的时间都是和N无关的常数。

3.确定一些初始状态(边界状态)的值

以“数字三角形”为例,初始状态就是底边数字,值就是底边数字值。

4. 确定状态转移方程

 定义出什么是“状态”,以及在该“状态”下的“值”后,就要找出不同的状态之间如何迁移――即如何从一个或多个“值”已知的 “状态”,求出另一个“状态”的“值”(递推型)。状态的迁移可以用递推公式表示,此递推公式也可被称作“状态转移方程”。

3.解题特点

能用动规解决的问题的特点

1) 问题具有最优子结构性质。如果问题的最优解所包含的 子问题的解也是最优的,我们就称该问题具有最优子结 构性质。

2) 无后效性。当前的若干个状态值一旦确定,则此后过程的演变就只和这若干个状态的值有关,和之前是采取哪种手段或经过哪条路径演变到当前的这若干个状态,没有关系。

4.一个简单例题

在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。 三角形的行数大于1小于等于100,数字为 0 - 99
7

3   8

8   1   0

2   7   4   4

4   5   2   6   5

具体代码:

#include <stdio.h>


#define MAX 101


int max(a,b)
{
    if(a>b)
        return a;
    else
        return b;



}
int main(){
	int i,j;
	int D[MAX][MAX];
    int n;
    int maxSum[MAX][MAX];
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		for(j=1;j<=i;j++)
			scanf("%d",&D[i][j]);
	for(  i = 1;i <= n; ++ i )
		maxSum[n][i] = D[n][i];
	for(  i = n-1; i>= 1;  --i )
		for(  j = 1; j <= i; ++j )
			maxSum[i][j] = max(maxSum[i+1][j],maxSum[i+1][j+1]) + D[i][j];
}

三.图书管理系统

1.图书的入库,查询,删除,全部概览,及基本页面完成

具体代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <math.h>
#define Len_L sizeof(struct library)
#define Len_R sizeof(struct reader)

struct library  //图书馆结构体
{
    char name[20];     //图书的名字
    char author[20];   //作者
    char publisher[20];//出版商
    char kind[20];     //种类
    char number[20];   //书号
    int stock;         //库存
    float price;       //单价
    struct library *next;
};



void mainmenu()   //主菜单
{
    system("cls");
    printf("\n\n\n\t\t\t                          图书管理系统\n");
	printf("\n\n\n			        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ");
	printf("\n\n\n						1.__图书馆图书信息__\n\n");
	printf("\n\n 						2.__借阅图书系统__\n\n");
	printf("\n\n 						3.__退出管理系统__\n\n");
	printf(" 				~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \n");
}
void sub_menu1()   //图书馆图书信息菜单
{
    system("cls");
    printf("\n\n\n\t\t\t                       图书馆图书信息操作\n");
    printf("\n\n\n			        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ");
	printf("\n\n\n						1.__图书进库__\n\n");
	printf("\n\n 						2.__图书删除__\n\n");
	printf("\n\n 						3.__图书查询__\n\n");
	printf("\n\n\t\t                                4.__库存信息__\n\n");
    printf("\n\n\t\t                                5__返回上一层__\n\n");
	printf(" 				~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \n");


}
void main1()   //主菜单选择函数
{
    void lbi();   //声明图书馆图书信息函数
    void bls();   //声明借阅图书系统
    char choose;
    mainmenu();   //显示主菜单

    scanf("%c",&choose);//用户做出选择

    switch(choose)
    {
        case '1':   lbi();   //Liarary Book Information图书馆图书信息函数
                    break;
        case '2':   //bls();   //Book Lending System借阅图书系统
                    break;
        case '3':   system("cls");
                    printf("\n感谢本次使用,更改内容已经保存,按任意键退出\n");
                    exit(0);
                    break;
    }
}
void lbi()   //Liarary Book Information图书馆图书信息函数
{
    void putbook();//声明入库函数
    void deletebook();//声明删除函数
    void search();//声明查询函数
    void information();//声明库存信息函数
    char choose;
    sub_menu1();
    getchar();
    scanf("%c",&choose);

    for (;;)//在返回上一级前循环输入

        switch(choose)
        {
			case '1':   putbook();
						break;
			case '2':	deletebook();
						break;
			case '3':	search();
						break;
			case '4':	information();
						break;
			case '5':	main1();//返回上一级
						break;
		}

}
int sum()//查看当前图书总量的函数
{
    FILE *fp;
    char tname[20]={'\0'};      //图书的名字
    char tauthor[20]={'\0'};     //作者
    char tpublisher[20]={'\0'};  //出版商
    char tkind[20]={'\0'};       //种类
    char tnumber[20]={'\0'};    //书号
    int tstock=0;         //库存
    float tprice=0;
    int n=0;
    fp=fopen("library.txt","r");
    for(n=0;!feof(fp);n++)//feof函数,文件结尾返回1,否则为0
    {
        fscanf(fp,"%s%s%s%s%s%d%lf",tnumber,tname,tauthor,tpublisher,tkind,&tstock,&tprice);//让文件向下运行
    }
    n--;
    fclose(fp);
    return (n);

}
void putbook()//图书入库函数
{
    FILE *fp;
    char name[20]={'\0'};      //图书的名字
    char author[20]={'\0'};     //作者
    char publisher[20]={'\0'};  //出版商
    char kind[20]={'\0'};       //种类
    char number[20]={'\0'};    //书号
    int stock=0;         //库存
    float price=0;
    int n=0;
    char hit;

    system("cls");

    if((fp=fopen("library.txt","a"))==NULL)
    {
        fp=fopen("library.txt","w");
        fclose(fp);
    }
    fp=fopen("library.txt","a");
    printf("\n	请您输入需要添加的图书信息:\n\n	书号	书名	作者	出版社	类别	进库量	单价");
	printf("\n\n	(类别:哲学,文学,教育,艺术,科学,教材,小说,其它)\n	(书号:(XXX) )\n");

    for(;hit!=27;)//图书入库的过程
    {
        if(n!=0)
        {
            printf("请再次输入\n");
        }
        scanf("%s%s%s%s%s%d%f",number,name,author,publisher,kind,&stock,&price);
        fprintf(fp,"%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",number,name,author,publisher,kind,stock,price);

        printf("输入回车再次输入或按Esc结束\n");
        n++;
        hit=getch();
        for(;hit!=27&&hit!=13;)
        {
            hit=getch();
        }

    }

    fclose(fp);
    printf("\n图书信息已保存,按任意键返回上一层........");
    getch();
    lbi();
}
void deletebook()//删除图书的函数
{
    FILE *fp;
    char tname[20]={'\0'};      //图书的名字
    char target[20]={'\0'};     //需要删除的名字
    char tauthor[20]={'\0'};     //作者
    char tpublisher[20]={'\0'};  //出版商
    char tkind[20]={'\0'};       //种类
    char tnumber[20]={'\0'};     //书号
    int tstock=0;         //库存
    float tprice=0;
    int n=0,i,j;
    char hit;
    struct library *head=NULL,*p1,*p2,*q;
    if((fp=fopen("library.txt","r"))==NULL)
    {
        system("cls");
        printf("库存无任何图书,无法删除\n按任意键返回........\n");
        getch();
        lbi();
    }
    else
    {
        system("cls");
        printf("请输入要删除的图书的名字");
        scanf("%s",&target);
        printf("\n确认删除请按回车,取消删除请按Esc\n");
        hit=getch();
        for(;hit!=13&&hit!=27;)//27是Esc,13是回车
        {
            hit=getch();
        }
        if(hit==27)
        {
            lbi();
        }
        fp=fopen("library.txt","r");
        for(j=0;!feof(fp);)//统计当前图书个数
        {
            j++;
            fscanf(fp,"%s%s%s%s%s%d%f",tnumber,tname,tauthor,tpublisher,tkind,&tstock,&tprice);

        }
        fclose(fp);
        fp=fopen("library.txt","r");
        for(i=1;i<j;i++)
        {
            fscanf(fp,"%s%s%s%s%s%d%f",tnumber,tname,tauthor,tpublisher,tkind,&tstock,&tprice);

            if(strcmp(target,tname))//把不需要删除的图书放入链表,等下清空文件,再存入文件
            {
                n++;
                if(n==1)
                {
                    p1=p2=(struct library*)malloc(Len_L);//建立新的链表
                    head=p1;
                }
                else
                {
                    p2->next=p1;
                    p2=p1;
                    p1=(struct library *)malloc(Len_L);//建立新的链表

                }
                strcpy(p1->number,tnumber);
                strcpy(p1->name,tname);
                strcpy(p1->author,tauthor);
                strcpy(p1->publisher,tpublisher);
                strcpy(p1->kind,tkind);
                p1->stock=tstock;
                p1->price=tprice;
            }
        }
        if (n==0)//如果图书只有一项且这一项刚好和要删除的相同
		{
			head=NULL;
		}
		else//建立链表的最后剩余一个储存空间,所以封底
		{
			p2->next=p1;
			p1->next=NULL;
			fclose(fp);
		}
    }
    fp=fopen("library.txt","w");//打开再关闭就清空文件了
    fclose(fp);
    fp=fopen("library.txt","a");//打开文件进行追加append

    q=head;
    for(;q!=NULL;)//将链表中数据录入文件
    {
        fprintf(fp,"%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",q->number,q->name,q->author,q->publisher,q->kind,q->stock,q->price);
        q=q->next;
    }
    fclose(fp);
    system("cls");
    printf("删除成功,图书内容已更新。\n按任意键返回上一层......\n");
    getch();//吸收任意键的那个字符
    lbi();
}
void search()//查询图书的函数
{
    FILE *fp;
    char tname[20]={'\0'};       //图书的名字
    char target[20]={'\0'};     //需要查询的名字
    char tauthor[20]={'\0'};     //作者
    char tpublisher[20]={'\0'};  //出版商
    char tkind[20]={'\0'};       //种类
    char tnumber[20]={'\0'};     //书号
    int tstock=0;          //库存
    float tprice=0;
    int n=0,i,k=0,m=0;
    char hit;


    if((fp=fopen("library.txt","r"))==NULL)//判断是否为空文件
    {
        system("cls");
        printf("文件不存在,按任意键返回\n");
        fclose(fp);
        getch();
        lbi();
    }
    m=sum();
    system("cls");
    printf("请输入您要查询的图书的信息:\n(名字,作者,出版商,种类,书号选其中一种信息进行查询)\n");
    scanf("%s",target);
    fp=fopen("library.txt","r");

    for(i=0;i<m;i++)//以及查询目标图书
    {
        fscanf(fp,"%s%s%s%s%s%d%f",tnumber,tname,tauthor,tpublisher,tkind,&tstock,&tprice);
        if(!strcmp(tname,target)||!strcmp(tnumber,target)||!strcmp(tauthor,target)||!strcmp(tpublisher,target)||!strcmp(tkind,target))//判断条件
        {
            if(k==0)
            {
                printf("查询结果:\n\n");
				printf("书号\t书名\t作者\t\t出版社\t\t类别\t\t现存量\t单价\n");

            }
            printf("%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",tnumber,tname,tauthor,tpublisher,tkind,tstock,tprice);
			k++;
        }

    }
    if(k==0)//无此图书的情况
    {
        system("cls");
        printf("抱歉,查无此书。按任意键返回\n");
        getch();
        lbi();
    }
    fclose(fp);
    printf("按任意键返回");
    getch();
    lbi();
}

void information()//全图图书的信息函数
{
    FILE *fp;
    char name[20]={'\0'};    //图书的名字
    char author[20]={'\0'};   //作者
    char publisher[20]={'\0'};  //出版商
    char kind[20]={'\0'};       //种类
    char number[20]={'\0'};     //书号
    int stock=0;         //库存
    float price;
    int i,m=0;
    char hit;
    system("cls");
    if((fp=fopen("library.txt","r"))==NULL)
    {
        system("cls");
        printf("\n抱歉,文档为空,输入任意键返回");

    }
    m=sum();
    if(m==0)
    {
        system("cls");
        printf("\n抱歉,图书馆暂无任何存书");
    }
    fp=fopen("library.txt","r");
    system ("cls");
    printf("书号\t书名\t作者\t\t出版社\t\t类别\t\t库存量\t单价\n");
    for(i=0;i<m;i++)
    {
        fscanf(fp,"%s%s%s%s%s%d%f",number,name,author,publisher,kind,&stock,&price);
        printf("%-8s%-9s%-14s%-16s%-18s%-7d%-8.2f\n",number,name,author,publisher,kind,stock,price);
    }
    fclose(fp);
    printf("查询完毕,按任意键返回\n");
    getch();
    lbi();

}




int main()
{
    system("color 3F");
    main1();
    return 0;
}

四.完成图书管理系统时的学到的知识点

1.system函数

函数功能
执行 dos(windows系统) 或 shell(Linux/Unix系统) 命令,参数字符串command为命令名。另,在windows系统下参数字符串不区分大小写。

说明:在windows系统中,system函数直接在控制台调用一个command命令。
在Linux/Unix系统中,system函数会调用fork函数产生子进程,由子进程来执行command命令,命令执行完后随即返回原调用的进程。

函数返回值
命令执行成功返回0,执行失败返回-1。

函数名: system
功 能: 发出一个DOS命令
用 法: int system(char *command);

ASSOC 显示或修改文件扩展名关联
ATTRIB 显示或更改文件属性
BREAK 设置或清除扩展式 CTRL+C 检查
BCDEDIT 设置启动数据库中的属性以控制启动加载
CACLS 显示或修改文件的访问控制列表(ACL)
CALL 从另一个批处理程序调用这一个
CD 显示当前目录的名称或将其更改
CHCP 显示或设置活动代码页数
CHDIR 显示当前目录的名称或将其更改
CHKDSK 检查磁盘并显示状态报告
CHKNTFS 显示或修改启动时间磁盘检查
CLS 清除屏幕 *
CMD 打开另一个 Windows 命令解释程序窗口 *
COLOR 设置默认控制台前景和背景颜色 *
COMP 比较两个或两套文件的内容
COMPACT 显示或更改 NTFS 分区上文件的压缩
CONVERT 将 FAT 卷转换成 NTFS 你不能转换当前驱动器
COPY 将至少一个文件复制到另一个位置
DATE 显示或设置日期 后面加 /t 表示显示日期
DEL 删除至少一个文件
DIR 显示一个目录中的文件和子目录
DISKPART 显示或配置磁盘分区属性
DOSKEY 编辑命令行、撤回 Windows 命令并创建宏
DRIVERQUERY 显示当前设备驱动程序状态和属性
ECHO 显示消息,或将命令回显打开或关闭
ENDLOCAL 结束批文件中环境更改的本地化
ERASE 删除一个或多个文件 *
EXIT 退出 CMD.EXE 程序(命令解释程序) *
FC 比较两个文件或两个文件集并显示它们之间的不同 *
FIND 在一个或多个文件中搜索一个文本字符串 *
FINDSTR 在多个文件中搜索字符串 *
FOR 为一组文件中的每个文件运行一个指定的命令
FORMAT 格式化磁盘,以便用于 Windows
FSUTIL 显示或配置文件系统属性
FTYPE 显示或修改在文件扩展名关联中使用的文件类型
GOTO 将 Windows 命令解释程序定向到批处理程序中某个带标签的行
GPRESULT 显示计算机或用户的组策略信息
GRAFTABL 使 Windows 在图形模式下显示扩展字符集 *
HELP 提供 Windows 命令的帮助信息
ICACLS 显示、修改、备份或还原文件和目录的 ACL
IF 在批处理程序中执行有条件的处理操作
LABEL 创建、更改或删除磁盘的卷标
MD 创建一个目录
MKDIR 创建一个目录
MKLINK 创建符号链接和硬链接
MODE 配置系统设备
MORE 逐屏显示输出 *
MOVE 将一个或多个文件从一个目录移动到另一个目录
OPENFILES 显示远程用户为了文件共享而打开的文件
PATH为 可执行文件显示或设置搜索路径
PAUSE 暂停批处理文件的处理并显示消息
POPD 还原通过 PUSHD 保存的当前目录的上一个值
PRINT 打印一个文本文件
PROMPT 更改 Windows 命令提示
PUSHD 保存当前目录,然后对其进行更改
RD 删除目录
RECOVER 从损坏的或有缺陷的磁盘中恢复可读信息 *
REM 记录批处理文件或 CONFIG.SYS 中的注释(批注)
REN 重命名文件
RENAME 重命名文件
REPLACE 替换文件 *
RMDIR 删除目录
ROBOCOPY 复制文件和目录树的高级实用工具
SET 显示、设置或删除 Windows 环境变量
SETLOCAL 开始本地化批处理文件中的环境更改
SC 显示或配置服务(后台进程)
SCHTASKS 安排在一台计算机上运行命令和程序
SHIFT 调整批处理文件中可替换参数的位置
SHUTDOWN 允许通过本地或远程方式正确关闭计算机
SORT 对输入排序
START 启动单独的窗口以运行指定的程序或命令
SUBST 将路径与驱动器号关联
SYSTEMINFO 显示计算机的特定属性和配置
TASKLIST 显示包括服务在内的所有当前运行的任务
TASKKILL 中止或停止正在运行的进程或应用程序
TIME 显示或设置系统时间 后面加 /t 表示显示时间
TITLE 设置 CMD.EXE 会话的窗口标题 “TITLE 你想改成啥”
TREE 以图形方式显示驱动程序或路径的目录结构 “TREE D:”
TYPE 显示文本文件的内容 “TYPE D:\文本.txt”
VER 显示 Windows 的版本
VERIFY 告诉 Windows 是否进行验证,以确保文件正确写入磁盘
VOL 显示磁盘卷标和序列号
XCOPY 复制文件和目录树
WMIC 在交互式命令 shell 中显示 WMI 信息

2.缓存区,输入时遇到的问题

缓冲区(Buffer)又称为缓存(Cache),是内存空间的一部分。也就是说,在内存中
预留了一定的存储空间,用来暂时保存输入或输出的数据,这部分预留的空间就叫做缓冲
区。 缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
为什么要引入缓冲区
比如从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数
据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算
机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。
又比如,我们使用打印机打印文档,由于打印机的打印速度相对较慢,我们先把文档输
出到打印机相应的缓冲区,打印机再自行逐步打印,这时我们的CPU可以处理别的事情。
现在你基本明白了吧,缓冲区就是一块内存区,它用在输入输出设备和CPU之间,用
来缓存数据。它使得低速的输入输出设备和高速的CPU能够协调工作,避免低速的输入输
出设备占用 CPU,解放出 CPU,使其能够高效率工作。
缓冲区的类型
缓冲区分为三种类型:全缓冲、行缓冲和不带缓冲。

  1. 全缓冲
    在这种情况下,当填满缓冲区后才进行实际 I/O操作。全缓冲的典型代表是对磁盘文件
    的读写。
  2. 行缓冲
    在这种情况下,当在输入和输出中遇到换行符时,执行真正的 I/O操作。这时,我们输
    入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。典型代表是标准输
    入(stdin)和标准输出(stdout)。
  3. 不带缓冲
    也就是不进行缓冲,标准错误文件 stderr 是典型代表,这使得出错信息可以直接尽快
    地显示出来。
    在这里插入图片描述
发布了5 篇原创文章 · 获赞 0 · 访问量 146

猜你喜欢

转载自blog.csdn.net/qq_45336632/article/details/104454476