词法分析(编译原理不用慌)

news2024/11/26 12:36:13

目录

一.简单版

二.简单版(文本保存)

c++版

运行结果:

 Java版

运行结果:

三.第三版(文本保存)

c++版

运行结果:


一.简单版

#include<stdio.h>
#include<iostream>
using namespace std;
#include<string.h>

//char  prog[80]="begin if x>=24 then s:=0 end #"
char prog[80];
char token[8];    //prog存放输入符号串;token存放识别出的单词
int   syn, p, sum,m;
char ch;            //syn-种别码;p-prog数组的下标;sum-识别出的整数
char *rwtab[6] = {"begin", "if", "then", "while", "do", "end"};     //关键字表置初值

//扫描子程序
void scaner( )
{   
     m=0;
    for (int n=0; n<8; n++ ) token[n]=NULL;     //将token清空
     ch=prog[p++] ;         //根据全局变量p读取下一个字符,分析下一个单词    
     while (ch==' '|| ch == '\n')  ch=prog[p++] ;         
                            //1.首字符为字母的情况,可能为标识符或关键字
      if(ch<='z'&& ch>='a')
	  {    m=0;  
		while (ch<='z'&& ch>='a'||ch<='9'&& ch>='0') 
		{ 
		 token[m++]=ch;//将ch保存至token[m++]中
         ch=prog[p++] ;//读取下一个字符
		}
        token[m++]='\0'; 
		p--;//...... 
		syn=10 ; //标识符,置syn=10         
        for (int n=0; n<6; n++ )    //判断当前标识符是否为关键字
            if (strcmp( token, rwtab[n])==0)
			{  
				syn=n+1;//关键字,置关键字syn  
                break ;
			} 
	  } 
      //2.首字符为数字的情况,为整数
	else if (ch<='9'&& ch>='0')
	{   
		while (ch<='9'&& ch>='0')
		{ 
			 sum=sum*10+ch-'0';  //将ch数字字符转换成整数送入sum,进位故sum*10,
             ch=prog[p++] ;//读取下一个字符 
		}
        p--;//....... 
	    syn=11;      //整数,置syn=11   
	}
      //3.其他算符或界符等情况	
    else             	
         switch(ch)
	{
			case '<': 
				token[m++]=ch;	//ch存入token ;
	            ch=prog[p++] ;// 读下一个字符 ;
                //三种情况,<=或<>或<	
				if (ch=='>')
				{  
                    syn=21;//将<>的种别码赋给syn;	    
                	token[p++]=ch;	//ch存入token ;
				}
				else if (ch=='=')
				{  
                    syn=22;//将<=的种别码赋给syn;		                
                    token[p++]=ch; // ch存入token ;
                 }
				else { 
                  syn=20;//将<的种别码赋给syn;		            
                     	p--;
	      		}
         	break;
           case '>': 
                token[m++]=ch;	ch=prog[p++] ;// 读下一个字符 ;
				 if (ch=='=')
				{  
                    syn=24;//将<=的种别码赋给syn;		                
                    token[m++]=ch; // ch存入token ;
                 }
				else { 
                    syn=23;//将<的种别码赋给syn;		            
                	p--;
				}
            	break;
		  case ':':
                token[m++]=ch;	//ch存入token ;
	            ch=prog[p++] ;// 读下一个字符 ;
				 if (ch=='=')
				{  
                    syn=18;//将<=的种别码赋给syn;		                
                    token[m++]=ch; // ch存入token ;
                 }
				else { 
                  syn=17;//将<的种别码赋给syn;		            
                	p--;
				}
            	break;
         case '+': 
               token[m++]=ch;syn=13;break;
         case '-': 
               token[m++]=ch;syn=14;break;
        case '*': 
               token[m++]=ch;syn=15;break;
        case '/': 
               token[m++]=ch;syn=16;break;
        case '=': 
               token[m++]=ch;syn=25;break;
        case ';': 
               token[m++]=ch;syn=26;break;
       case '(': 
               token[m++]=ch;syn=27;break;
       case ')': 
               token[m++]=ch;syn=28;break;
       case '#': 
               token[m++]=ch;syn=0;break;

       default: syn= -1; 
		}
 token[m++]='\0';
}

int main( ){ 
   	//......
   	printf( "\n please input  string : \n" ) ;
   	do{   
	        ch=getchar( );
	        prog[p++]=ch ;	
	} while(ch!='#');
   	
    
	p=0;//......
	do{   //循环调用scanner()函数分析prog中的字符串,直到syn为0(即#)分析结束
		scaner();
		switch(syn){
		case 11:  //根据syn的值输出(syn,sum或者token)二元组
			printf("%-6d     %-5d\n",sum,syn);break;
		default: printf("%-6s     %-5d\n",token,syn);
		}
	}while(syn!=0);
}

二.简单版(文本保存)

c++版

此处是自己先创建一个1.txt文件

如:

const    a=10;
var    b,c;
procedure    p;
      begin
    c:=b+a
      end;
begin#
 

#include<stdio.h>
#include<string.h>
//"begin if x>24 then s:=0 end #"
char  prog[80], token[10];    //prog存放输入符号串;token存放识别出的单词
int   syn, p, sum=0,m;
char ch;            //syn-种别码;p-prog数组的下标;sum-识别出的整数
char str; 
char *rwtab[13] = {"begin", "if", "then", "while", "do", "end","const","var","procedure","odd","call","read","write"};//关键字表置初值
FILE* pf = fopen("2.txt", "w+");

//扫描子程序
void scaner( )
{
     m=0;sum=0;
    for (int n=0; n<8; n++ ) token[n]=NULL;     //将token清空
     ch=prog[p++] ;         //根据全局变量p读取下一个字符,分析下一个单词    
     while (ch==' '|| ch == '\n')  ch=prog[p++] ;         
      //1.首字符为字母的情况,可能为标识符或关键字
      if(ch<='z'&& ch>='a')
	  {    m=0;  
		while (ch<='z'&& ch>='a'||ch<='9'&& ch>='0') 
		{ 
		 token[m++]=ch;//将ch保存至token[m++]中
         ch=prog[p++] ;//读取下一个字符
		}
        token[m++]='\0'; 
		p--;//...... 
		syn=30 ; //标识符,置syn=30         
        for (int n=0; n<13; n++ )    //判断当前标识符是否为关键字
            if (strcmp( token, rwtab[n])==0)
			{  
				syn=n+1;//关键字,置关键字syn  
                break ;
			} 
	  } 
      //2.首字符为数字的情况,为整数
	else if (ch<='9'&& ch>='0')
	{   
		while (ch<='9'&& ch>='0')
		{ 
			 sum=sum*10+ch-'0';  //将ch数字字符转换成整数送入sum
             ch=prog[p++] ;//读取下一个字符 
		}
        p--;//....... 
	    syn=31;      //整数,置syn=31   
	}
      //3.其他算符或界符等情况	
    else             	
         switch(ch)
	{
			case '<': 
				token[m++]=ch;	//ch存入token ;
	            ch=prog[p++] ;// 读下一个字符 ;
                //三种情况,<=或<>或<	
				if (ch=='>')
				{  
                    syn=21;//将<>的种别码赋给syn;	    
                	token[m++]=ch;	//ch存入token ;
				}
				else if (ch=='=')
				{  
                    syn=22;//将<=的种别码赋给syn;		                
                    token[p++]=ch; // ch存入token ;
                 }
				else { 
                  syn=20;//将<的种别码赋给syn;		            
                     	p--;
	      		}
         	break;
           case '>': 
                token[m++]=ch;	ch=prog[p++] ;// 读下一个字符 ;
				 if (ch=='=')
				{  
                    syn=24;//将<=的种别码赋给syn;		                
                    token[p++]=ch; // ch存入token ;
                 }
				else { 
                    syn=23;//将<的种别码赋给syn;		            
                	p--;
				}
            	break;
		  case ':':
                token[m++]=ch;	//ch存入token ;
	            ch=prog[p++] ;// 读下一个字符 ;
				 if (ch=='=')
				{  
                    syn=18;//将:=的种别码赋给syn;		                
                    token[m++]=ch; // ch存入token ;
                 }
				else { 
                  syn=17;//将:的种别码赋给syn;		            
                	p--;
				}
            	break;
         case '+': 
               token[m++]=ch;syn=32;break;
         case '-': 
               token[m++]=ch;syn=14;break;
        case '*': 
               token[m++]=ch;syn=15;break;
        case '/': 
               token[m++]=ch;syn=16;break;
        case '=': 
               token[m++]=ch;syn=25;break;
        case ';': 
               token[m++]=ch;syn=26;break;
       case '(': 
               token[m++]=ch;syn=27;break;
       case ')': 
               token[m++]=ch;syn=28;break;
       case '#': 
               token[m++]=ch;syn=0;break;

       default: syn= -1; 
		}
 token[m++]='\0';
}
int f(int syn){
	if(syn==26||syn==27||syn==28){
		printf("界符");
		fprintf(pf,"     界符\n");
	}else if((syn>=20&&syn<=25)||(syn>=14&&syn<=16)||syn==18||syn==32){
		printf("运算符");
		fprintf(pf,"     运算符\n");
	}else if(syn>=1&&syn<=13){
		printf("关键字");
		fprintf(pf,"     关键字\n");
	}else if(syn==30){
		printf("标识符");
		fprintf(pf,"     标识符\n");
	}else if(syn==17){
		printf("非法");
		fprintf(pf,"     非法\n");
	}
} 

int main( ){ 

	p=0;
	FILE* pf1 = fopen("1.txt", "r");

	while((str=fgetc(pf1))!=EOF)
	{    //如果没有读到末尾,则继续读取信息
	        
		   	prog[p++]=str;
		   	if(str=='#'){
			   	break;
			   }
	}
	prog[p++]='\0';
		
	p=0;
	do{   //循环调用scanner()函数分析prog中的字符串,直到syn为0(即#)分析结束
		scaner();
		switch(syn){
		case 31:  //根据syn的值输出(syn,sum或者token)二元组
			fprintf(pf,"%-6d ",sum);
			fprintf(pf,"     数字\n");
			printf("%-6d     数字\n",sum); 
			break;
		default: {
			fprintf(pf,"%-6s ",token);
			printf("%-6s     ",token);f(syn);printf("\n");
		}
		}
	}while(syn!=0);
	fclose(pf);//关闭文件
	pf=NULL;
//	fclose(pf1);
//	pf1=NULL;
	
}

运行结果:

 

 Java版

 

 1.txt放你要读的文法

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
/*
*   保留字13个syn赋值1-13const ,var,procedure,begin,end,odd,if,then,call, while,do, read,write
*   标识符syn赋值14
*   常数syn赋值
*   运算符+,-,*,/,= syn赋值16-20 #syn赋值为0 <,<=,>,>=,:= syn赋值21-25
*   界符( ) , ; . syn赋值26-30
* */
public class PL0 {
    static String  prog="";
    //static String prog="begin if x>=24 then s:=0 end #";
    static String  token1;   //做保留识别出的值
    static int   syn;       //种别码
    static int p=0;         //做索引
    static int sum;         //做常数

    static char ch;         //做字符串索引下取值
    static String str=" ";  //做写入txt中分隔

    //13个关键字
    static String[] rwtab = {"const" ,"var","procedure","begin","end","odd",
                             "if","then","call", "while","do", "read","write"};

    static void scaner()
    {

        token1="";     //将token1清空
        sum=0;        //sum清空

        ch=prog.charAt(p++) ;         //读字符串p索引下
        while (ch==' '|| ch == '\n')  ch=prog.charAt(p++) ;
        //1.首字符为字母的情况,可能为标识符或关键字
        if(ch<='z'&& ch>='a')
        {
            while (ch<='z'&& ch>='a'||ch<='9'&& ch>='0')
            {
                token1+=ch;
                ch=prog.charAt(p++) ;//读取下一个字符
            }

            p--;
            syn=14 ; //标识符,置syn=14
            for (int n=0; n<13; n++ )    //判断当前标识符是否为关键字
                if (token1.equals(rwtab[n]) )
                {
                    syn=n+1;
                    break ;
                }
        }
        //2.首字符为数字的情况,为整数
        else if (ch<='9'&& ch>='0')
        {
            while (ch<='9'&& ch>='0')
            {
                sum=sum*10+ch-'0';  //将ch数字字符转换成整数送入sum,进位故sum*10,
                ch=prog.charAt(p++) ;//读取下一个字符
            }
            p--;
            syn=15;      //常数,置syn=15
        }
        //3.其他算符或界符等情况
        else
            switch(ch)
            {
                case '+':
                    token1+=ch;syn=16;break;
                case '-':
                    token1+=ch;syn=17;break;
                case '*':
                    token1+=ch;syn=18;break;
                case '/':
                    token1+=ch;syn=19;break;
                case '=':
                    token1+=ch;syn=20;break;
                case '#':
                    token1+=ch;syn=0;break;
                //<与<=
                case '<':
                    token1+=ch;
                    ch=prog.charAt(p++) ;
                    if (ch=='=')
                    {
                        syn=22;
                        token1+=ch;
                    }else{
                        syn=21;
                        p--;
                    }
                    break;
                //>与>=
                case '>':
                    token1+=ch;	ch=prog.charAt(p++) ;// 读下一个字符 ;
                    if (ch=='=')
                    {
                        syn=24;
                        token1+=ch;
                    }
                    else {
                        syn=23;
                        p--;
                    }
                    break;
                case ':':
                    token1+=ch;
                    ch=prog.charAt(p++) ;
                    if (ch=='=')
                    {
                        syn=25;
                        token1+=ch;
                    }
                    break;

                case '(':
                    token1+=ch;syn=26;break;
                case ')':
                    token1+=ch;syn=27;break;
                case ',':
                    token1+=ch;syn=28;break;
                case ';':
                    token1+=ch;syn=29;break;
                case '.':
                    token1+=ch;syn=30;break;
                default: syn= -1;
            }
    }

    public static void main(String[] args) throws IOException {
        //System.out.print("please input  string :");
        //Scanner input = new Scanner(System.in);
        //prog=input.nextLine();

        FileInputStream fos0;
        FileOutputStream fos1;
        FileOutputStream fos2;
        FileOutputStream fos3;
        FileOutputStream fos4;
        FileOutputStream fos5;

        try {
            fos0=new FileInputStream("src/1.txt");
            int ch=0;
            while ((ch=fos0.read())!=-1){
                prog+=(char)ch;
            }

            System.out.println(prog);
            fos0.close();
            fos1=new FileOutputStream("src/关键字.txt",true);
            fos2=new FileOutputStream("src/标识符.txt",true);
            fos3=new FileOutputStream("src/运算符.txt",true);
            fos4=new FileOutputStream("src/常数.txt",true);
            fos5=new FileOutputStream("src/界符.txt",true);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }

        do{   //循环调用scanner()函数分析prog中的字符串,直到syn为0(即#)分析结束
            scaner();

            if(token1!="") {
                //System.out.println(token1+" "+syn);
                System.out.printf("%-8s",token1+" ");
            }
            //关键字1-13
            if(syn>=1&&syn<=13){
                fos1.write((token1+str+"\n").getBytes(StandardCharsets.UTF_8));
                System.out.println("基本字");
            }
            //标识符14
            else if(syn==14){
                fos2.write((token1+str+"\n").getBytes(StandardCharsets.UTF_8));
                System.out.println("标识符");
            }
            //运算符16-25和#0
            else if(syn>=16&&syn<=25||syn==0){
                fos3.write((token1+str+"\n").getBytes(StandardCharsets.UTF_8));
                System.out.println("运算符");
            }
            //常数15
            else if(syn==15){
                fos4.write((String.valueOf(sum)+str+"\n").getBytes(StandardCharsets.UTF_8));
                //System.out.println(sum+" "+syn);
                System.out.printf("%-8d",sum);
                System.out.println("数字");
            } else {
                fos5.write((token1+str+"\n").getBytes(StandardCharsets.UTF_8));
                System.out.println("界符");
            }

        }while(syn!=0);
        fos0.close();
        fos1.close();
        fos2.close();
        fos3.close();
        fos4.close();
        fos5.close();
    }
}

运行结果:

 

三.第三版(文本保存)

c++版

#include <stdio.h>
#include <string.h>


enum symbol {
	nul, ident, number, plus, minus,
	times, slash, oddsym, eql, neq,
	lss, leq, gtr, geq, lparen,
	rparen, comma, semicolon, period, becomes,
	beginsym, endsym, ifsym, thensym, whilesym,
	writesym, readsym, dosym, callsym, constsym,
	varsym, procsym,
};

int cc, ll;
FILE * fa1;
int err; /*错误计数器*/ 
FILE* fin;
int cx; 
char ch;
char line[81];
#define getchdo if(-1==getch())return -1
# define al 10 
char a[al + 1];
char id[al + 1];
# define norw 13 
char word[norw][al];
enum symbol sym;
enum symbol wsym[norw];
# define nmax 14 
int num;
enum symbol ssym[256];
char fname[al];



void init();
void error(int n);
int getch();
int getsym();




int main()
{
    printf("Input pl/0 file?");
	scanf("%s", fname);					/* 输入PL/0源程序文件名 */
    fin = fopen(fname, "r");
    if(fin)
    {
        printf("Output pl/0 file?");
        scanf("%s", fname);
        fa1 = fopen(fname, "w");

        init();
        
//        err = 0;
//        cc = cx = ll = 0;
//        ch = ' ';
        
        while(getsym() != -1);
 
    }
    else
    {
        printf("找不到文件\n");
    }
    printf("\n");
    
    return 0;
}

void init()
{
	int i;
	
	/* 设置单字符符号 */
	for(i=0; i<=255; i++)
	{
		ssym[i] = nul;
	}
	ssym['+'] = plus;
	ssym['-'] = minus;
	ssym['*'] = times;
	ssym['/'] = slash;
	ssym['('] = lparen;
	ssym[')'] = rparen;
	ssym['='] = eql;
	ssym[','] = comma;
	ssym['.'] = period;
	ssym['#'] = neq;
	ssym[';'] = semicolon;

	/* 设置保留字名字,按照字母顺序,便于折半查找 */
	strcpy(word[0], "begin");
	strcpy(word[1], "call");
	strcpy(word[2], "const");
	strcpy(word[3], "do");
	strcpy(word[4], "end");
	strcpy(word[5], "if");
	strcpy(word[6], "odd");
	strcpy(word[7], "procedure");
	strcpy(word[8], "read");
	strcpy(word[9], "then");
	strcpy(word[10], "var");
	strcpy(word[11], "while");
	strcpy(word[12], "write");

	/* 设置保留字符号 */
	wsym[0] = beginsym;
	wsym[1] = callsym;
	wsym[2] = constsym;
	wsym[3] = dosym;
	wsym[4] = endsym;
	wsym[5] = ifsym;
	wsym[6] = oddsym;
	wsym[7] = procsym;
	wsym[8] = readsym;
	wsym[9] = thensym;
	wsym[10] = varsym;
	wsym[11] = whilesym;
	wsym[12] = writesym;
}

 
/*
 * 出错处理,打印出错位置和错误编码
 */
void error(int n)
{
	char space[81];
	memset(space,32,81);
	space[cc-1] = 0;	//出错时当前符号已经读完,所以cc-1
	printf("****%s!%d\n",space,n);
	fprintf(fa1,"****%s!%d\n",space,n);
	err++;
}

/*
 * 漏掉空格,读取一个字符。
 *
 * 每次读一行,存入line缓冲区,line被getsym取空后再读一行
 *
 * 被函数getsym调用。
 */
int getch()
{
	if(cc==ll)
	{
		if(feof(fin))
		{
			printf("program incomplete");
			return -1;
		}
		ll=0;
		cc=0;
		ch = ' ';
		while(ch != 10)
		{
			if(EOF == fscanf(fin,"%c",&ch))
			{
				line[ll]=0;
				break;
			}
			//fprintf(fa1,"%c", ch);
			line[ll]=ch;
			ll++;
		}
	
	}
	ch = line[cc];
	cc++;
	return 0;
}

/*
 * 词法分析,获取一个符号
 */
int getsym()
{
	int i,j,k;
	if(ch=='#'){
		return -1;
	}
	while(ch==' ' || ch==10 || ch==9)		/* 忽略空格、换行和TAB */
	{
		getchdo;
	}
	if(ch>='a' && ch<='z')
	{										/* 名字或保留字以a~z开头*/
		k = 0;
		do{
			if(k<al)
			{
				a[k]=ch;
				k++;
			}
			getchdo;
		}while(ch>='a'&&ch<='z' || ch>='0'&&ch<='9');
		a[k] = 0;
		strcpy(id,a);
		i=0;
		j=norw-1;
		do{									/* 搜索当前符号是否为保留字 */
			k=(i+j)/2;
			if(strcmp(id,word[k]) <= 0)
			{
				j=k-1;
			}
			if(strcmp(id,word[k]) >= 0)
			{
				i=k+1;
			}			
		}while(i<=j);
		if(i-1>j)
		{
			printf("%s  保留字\n", id);
			fprintf(fa1,"%s  保留字\n", id);
			sym=wsym[k];
		}
		else
		{
			printf("%s  标识符\n", id);
			fprintf(fa1,"%s  标识符\n", id);
			sym=ident;						/* 搜索失败,则是名字或数字 */
		}
	}
	else
	{
		if(ch>='0'&&ch<='9')
		{									/* 检测是否为数字:以0~9开头 */
			k=0;
			num=0;
			sym=number;
			do{
				//printf("%c\n",ch);
				num=10*num+ch-'0';
				k++;
				getchdo;
			}while(ch>='0'&&ch<='9');		/* 获取数字的值 */
			k--;
			if(k>nmax)
			{
				error(30);
			}
			printf("%d  整数\n",num);
			fprintf(fa1,"%d  整数\n", num);
		}
		else
		{
			if(ch==':')						/* 检测赋值符号 */
			{
				getchdo;
				if(ch=='=')
				{
					printf(":=  运算符\n");
					fprintf(fa1,":=  运算符\n", id);
					sym=becomes;
					getchdo;
				}
				else
				{
					printf(":  error\n");
					sym=nul;				/* 不能识别的符号 */
				}
			}
			else
			{
				if(ch=='<')					/* 检测小于或小于等于符号 */
				{
					getchdo;
					if(ch=='=')
					{
						printf("<=  运算符\n");
						fprintf(fa1,"<=  运算符\n", id);
						sym=leq;
						getchdo;
					}
					else
					{
						printf("<  运算符\n");
						fprintf(fa1,"<  运算符\n", id);
						sym=lss;
					}
				}
				else
				{
					if(ch=='>')					/* 检测大于或大于等于符号 */
					{
						getchdo;
						if(ch=='=')
						{
							printf(">=  运算符\n");
							fprintf(fa1,">=  运算符\n", id);
							sym=geq;
							getchdo;
						}
						else
						{
							printf(">  运算符\n");
							fprintf(fa1,">  运算符\n", id);
							sym=gtr;
						}
					}
					else
                    {
                        if(ch=='=')
                        {
                           printf("=  运算符\n");
                           fprintf(fa1,"=  运算符\n", id);
                            //getchdo;
                        }
                        if(ch=='+')
                        {
                           printf("+  运算符\n");
                           fprintf(fa1,"+  运算符\n", id);
                            getchdo;
                        }
                        else if(ch=='-')
                        {
                            printf("-  运算符\n");
                            fprintf(fa1,"-  运算符\n", id);
                            getchdo;
                        }
                        else if(ch=='*')
                        {
                            printf("*  运算符\n");
                            fprintf(fa1,"*  运算符\n", id);
                            getchdo;
                        }
                        else if(ch=='/')
                        {
                            printf("/  运算符\n");
                            fprintf(fa1,"/  运算符\n", id);
                            getchdo;
                        }
                        else if(ch=='(')
                        {
                            printf("(  运算符\n");
                            fprintf(fa1,"(  运算符\n", id);
                            getchdo;
                        }
                        else if(ch==')')
                        {
                            printf(")  运算符\n");
                            fprintf(fa1,")  运算符\n", id);
                            getchdo;
                        }
                        else if(ch==',')
                        {
                            printf(",  运算符\n");
                            fprintf(fa1,",  运算符\n", id);
                            getchdo;
                        }
                        else if(ch==';')
                        {
                           printf(";  运算符\n");
                           fprintf(fa1,";  运算符\n", id);
                            getchdo;
                        }
                        else if(ch=='.')
                        {
                            printf(".  运算符\n");
                            fprintf(fa1,".  运算符\n", id);
                            getchdo;
                        }
						else
						{							
							sym=ssym[ch];			/* 当符号不满足上述条件时,全部按照单字符符号处理 */							
							if(sym != period)
							{
								getchdo;
							}							
						}
				   }
		       }
			}
	   }
	}
	return 0;
}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/52014.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

独立站SaaS系统站群模式怎么玩

做独立站的人都知道“站群”这个游戏&#xff0c;意思是通过建站工具一次性建好几百个或者几千个独立站。各个独立站卖的品类比较垂直&#xff0c;不会有太多SKU。销量好的站会留着精细化运营&#xff0c;没流量的就放弃。 使用脸书或谷歌和其他广告渠道来测试产品。每个产品…

Unity3d bounds包围盒 和collider碰撞器区别

Bounds 外包围盒 Bounds 叫作外包围盒、边界框、外扩矩形.是struct 结构体。而我们获得Bounds的主要途径有三种&#xff1a;Render,Collider,Mesh。 Render.bounds 世界坐标 Collider.bounds 世界坐标 Mesh.bounds 本地坐标 var m GetComponent<MeshFilter>().bound…

抖音用户浏览行为数据分析与挖掘

下文部分代码省略&#xff0c;完整项目代码及数据集链接&#xff1a;抖音用户浏览行为数据分析与挖掘 目录1.特征指标构建0. 项目介绍与说明**数据集说明**浏览行为1. 数据简单处理2. 特征指标构建用户指标分析&#xff1a;作者指标分析&#xff1a;作品指标分析&#xff1a;3.…

5分钟快速上手Nmap指令(基于Kali系统)

前言正文1、修改Kali系统中网络配置2、Nmap简介2.1 用途2.2优势2.3 相关知识3、Nmap中最常用的命令3.1 单主机扫描3.2 多目标扫描3.3 检测目标主机漏洞3.3 时序选择3.4 保存4、kali系统中常见报错参考文献前言 本篇为理论篇&#xff0c;主要为CTF攻防做铺垫&#xff0c;围绕 基…

[附源码]SSM计算机毕业设计影院售票系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

mac m1 mysqlworkbench8 Unknown table ‘COLUMN_STATISTICS‘

原因&#xff1a;本地mysql版本是8&#xff0c;远程是mariaDb-10&#xff0c;版本不匹配导致报错。 仔细看mysqlworkbench8.0导出时的错误信息&#xff0c;有mysqldump的具体路径。 mac os (m1, ventura系统)&#xff0c;具体位置是这里&#xff1a; /Applications/MySQLWor…

【树莓派开发日记1】1.3k预算的树莓派+显示屏+键鼠的选型与拆箱物理安装

树莓派开发日记1 经过了漫长的上课与考试周期&#xff0c;终于有时间闲下来进行技术栈的开发与学习 作为立志成为优秀机器人开发者的青年工程师&#xff08;青春版&#xff09;&#xff0c;不可能不去了解微机处理系统和Ubuntu系统&#xff0c;所以在此又给自己开了一个大坑 …

OpManager 帮助排查网络延迟问题

什么是网络延迟 网络中的延迟是指数据通过网络传输到其预期目的地所需的时间。它通常表示为往返延迟&#xff0c;即数据从一个位置传输到另一个位置所需的时间。 什么原因导致网络延迟 有四个主要原因会影响网络延迟。其中包括&#xff1a; 传输介质&#xff0c;例如 WAN 或…

JUC并发编程第六篇,带你了解Java内存模型JMM

JUC并发编程第六篇&#xff0c;带你了解Java内存模型JMM一、Java Memory Model&#xff08;Java内存模型&#xff09;是什么&#xff1f;二、JMM规范三大特性1. 可见性2. 原子性3. 有序性三、JMM规范下多线程对变量的读写过程四、JMM规范下多线程先行发生原则&#xff08;happe…

Oracle面试题整理

目录 Oracle面试题整理 1.MySQL和Oracle的区别&#xff1a; 2.Oracle中function和procedure的区别&#xff1f; 3. 比较truncate和delete命令 &#xff1f; 4.oralce中 rowid, rownum的定义 5. 事务的特性&#xff08;ACID&#xff09;是指什么 6. 列举几种表连接方式…

[附源码]计算机毕业设计springboot天狗电子商城系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

plink2.0和plink1.9的忧伤笔记

虽然plink2.0已经存在好久了&#xff0c;但是一直用的都是plink1.9&#xff0c;因为语法熟悉。更主要是plink2.0语法变动太大&#xff0c;害怕步子迈得太大了…… 今天看一下plink2.0的读入和输出数据常用参数&#xff0c; plink2.0用是不会用的&#xff0c;2022年都不会用&am…

计算机网络基础

前言 计算机网络学习的核心内容就是网络协议的学习。网络协议是为计算机网络中进行数据交换而建立的规则、标准或者说是约定的集合。因为不同用户的数据终端可能采取的字符集是不同的&#xff0c;两者需要进行通信&#xff0c;必须要在一定的标准上进行。一个很形象地比喻就是…

平时健身买什么耳机好、分享五款最好的运动耳机推荐

不少人喜欢在健身房或者户外运动中使用手机或者MP3来听音乐&#xff0c;这种方式不仅可以减少运动中的枯燥感&#xff0c;而且那些节奏较强的音乐还能够进一步激发人们的运动潜能&#xff0c;达到事半功倍的效果。作为音乐传递的桥梁&#xff0c;一款佩戴舒适的运动耳机是必不可…

又撸了一个开源项目!!!

花了两周左右&#xff0c;写了一个客户关系管理系统&#xff0c;基于 Vue Go 实现&#xff0c;主要功能有仪表盘、客户管理、合同管理、产品管理&#xff0c;订阅等功能。 前几天已经在 Github 上开源了&#xff0c;今天也把项目部署到云服务器上了&#xff0c;很完美&#x…

负载均衡组件Ribbon核心-@LoadBalanced-上

引言 书接上篇 微服务负载均衡小能手-Ribbon 使用RIbion实现负载均衡远程调用 Bean LoadBalanced public RestTemplate restTemplate(){return new RestTemplate(); } 都知道没有LoadBalanced注解前&#xff0c;RestTemplate就是一个简单的http请求工具类&#xff0c;贴上该…

AI-多模态-2021:DALL-E模型【文本生成图像工具】【OpenAI】

Dall-e&#xff1a;从拟物文字到图片的创造 人类不断地从五种感官接收和整合信息&#xff0c;通过视觉、听觉、触觉、嗅觉和味觉等生物信息来理解文字和图片。然而文字和图片属于符号&#xff0c;Dall-e模型在理解符号的含义时并不能通过生物信息的传递。通过将对自然语言的理…

Ambari-yarn-timeline 内置 HBase数据表清理

HDP 集群 timeline 内置的 HBase 数据表持续增大&#xff0c;我们将默认TTL30改 为7 天。 ambari界面YARN 服务中 的 timeline v2.0 timeline 内置 HBase数据HDFS路径 &#xff1a; 表在HDFS上的大小 使用如下命令进入 Hbase shell [hdfswinner-backup-hdp root]$ hbase -…

网站变灰代码如何让网页变灰

1.网站变灰代码应用场景 一般在清明节&#xff0c;全国哀悼日&#xff0c;大地震的日子&#xff0c;以及一些影响力很大的伟人逝世或纪念日的时候&#xff0c;身为站长的我们都会让自己的网站的全部网页变成灰色&#xff08;黑白色&#xff09;&#xff0c;以表示我们对逝者的…

数据分析之人力资源管理驾驶舱

驾驶舱是数据分析报表中用于展示关键分析指标和综合展示数据情况的&#xff0c;因此需要展示的内容多&#xff0c;需要做的内容甄选也多。 一 前言 人力资源作为企业的关键生产力&#xff0c;是一个企业成长发展的根本。随着“知识经济”时代的到来、市场竞争的加剧&#xff…