版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
河南科技大学计算机系第1章
绪论计算机基础知识1教学目标了解计算机程序设计的一般过程了解常见语言掌握面向过程和面向对象程序设计思想2授课内容
程序设计的一般过程程序设计语言结构化程序设计与面向对象程序设计3问题的提出什么是程序设计?为什么要要程序设计?用什么工具进行程序设计?……4“程序设计是具有一种知识背景的人为具有另一种知识背景的人进行的创造性劳动”
。
程序设计是一种创造性的劳动5设计过程是把实用知识影射到计算知识。设计是一个影射功能用户操作约束例外器件组织结构算法资源数据实用知识计算知识6
“一个设计者能对着复杂的设计沉思几月。然后突然间简单、雅致而又漂亮的解决办法冒出。当这发生在你身上时,感觉好像是上帝正在说话!也许真的是这样。”
LeoFrankowskiinTheCross-TimeEngineer关于设计的论述一7
“好的设计者应具备深厚的应用领域知识。”
Curtis’law关于设计的论述二8“层次结构减少复杂度。”
Simon’slaw关于设计的论述三9模块化处理模块化就是把程序划分为若干个模块,而每个模块完成一个子功能,把这些模块汇总起来构成一个有机整体,即可完成指定的功能。模块化的目的是为了降低软件复杂度,使软件设计,调试和维护等操作变得简易。10层次结构、模块化举例这是一个销售管理信息系统。首先画出“树根”,接着画出第二层的“支干”,然后再画出第三层的“支干”,最后,画出“树叶”(实质性的数据结构)。销售MIS销售MIS经营库存财务1)2)3)销售MIS经营库存财务市场分析统计分析客户档案盘点结存订货管理工资核算采购计划工资核算成本核算11
“读一本魔术原理的书,如果你不经常看封面的话,你会以为在看的是软件设计的书。”
BruceTognazzini
关于软件设计的论述12“有两种方法来设计一个软件。第一种方法是设计非常简单的软件以至于没有明显的不足。另一种方法是设计非常复杂的软件也没有明显的不足。” C.A.R.Hoare
软件设计的妙语13程序设计的一般过程
为什么要进行程序设计什么时候需要程序设计怎样进行程序设计程序设计的一般过程14为什么要进行程序设计因为,在面临的应用领域中没有合适的、可使用的应用软件。种地(或加工零件、包饺子)与程序设计饺子的各种吃法评估:预期需求可得到的工具自身能力在计算机的各个技术应用中,应清楚自身所处的层次、所需的技能15用什么进行程序设计可用的工具通用应用软件(Office)文字处理:Word表格处理:EXCEL科学计算MATLAB…...程序设计语言microsoft:VisualC++、VisualBasicBorland:Delphi、C++BuilderSun:java没有合适的开发工具怎么办?……16一、程序设计的一般过程计算机可以做任何事情;只要能把实际问题抽象、制作为计算机可求解的程序。计算机求解问题的步骤:分析抽象模型求解命令编程调试程序实际问题求解编制问题问题模型算法程序实现17程序设计的一般过程问题定义
算法设计
程序编制
调试运行
文档
18问题定义问题一:给定两个正整数p和q,求其最大公因数。问题二:统计大学中一个班级的学生的考试成绩,并选出优秀学生。
多少科目的成绩?优秀的定义(总分?平均分?第一名?前五名?)数据如何录入?如何输出?这是初学者认为最简单而在实际工程中最难的工作。在软件工程中被称作“需求分析”。19算法设计
前因后果:问题定义确定了未来程序的输入、处理、输出(IPO,即Input,Process,Output);算法(Algorithm)是对解决问题步骤的描述;算法不能被计算机理解、执行。20算法示例(一)步骤1:输入全部学生姓名、学号、英语成绩、计算机基础成绩;步骤2:对各个学生成绩求合计;步骤3:按合计对学生进行排序;步骤4:取排序的学生列表中第一个学生;步骤5:该学生有不及格吗?没有,则打印姓名并结束;有不及格,则取下一个学生并重复步骤5
。21算法示例(二)步骤1:输入一个学生的姓名、学号、英语成绩、计算机基础成绩;步骤2:该学生有不及格吗?有则转步骤1步骤3:该合计大于以前学生的合计吗?大于则记录姓名、学号、合计成绩;步骤4:重复步骤1直到输入全部学生成绩步骤5:打印姓名、学号、合计成绩22算法的表示伪代码(Pseudocode)SUM=0FORI=1TON循环求累加和
SUM=SUM+I输出SUM流程图(Flowchat)23算法的流程图表示24π的计算问题计算方法:Machin公式(1)(2)(3)Ramanujan公式(4)Chudnovsky公式(5)25理论分析公式⑴计算量小,程序编制简单,收敛很慢;公式⑵计算量不大,收敛较快,程序编制较简单;Machin公式每计算一项可以得到1.4位的十进制精度,收敛较快,容易在计算机上编程实现;Ramanujan公式和Chudnovsky公式收敛更快,要使用FFT(FastFourierTransform)算法,将两个大数的乘除运算时间由O(n2)缩短为O(nlogn),程序实现比较复杂。26编程实现:计算方法(1)ints=1;doublen=1.0,t=1.0,pi=0.0;while(fabs(t)>=1e-10){pi=pi+t; n=n+2; s=-s; t=s/n;}27程序编制程序语言的基本语句sum1:=en1+com1这是Pascal的语句sum1=en1+com1;这是C++的语句程序的执行起始点
子程序(Subprogram)
模块化示例将一个大程序分成若干小程序块,每一个小程序块(子程序)完成相对单一的功能,由一个主程序调用别的子程序,最终形成一个树状结构,这样就将一个庞大的功能拆分成若干相对简单的功能了(像积木块搭房子一样)。
程序的执行顺序
28程序编制
C++程序代码
#include<iostream.h>voidmain(){charname1[20],name2[20];//姓名
intnum1,num2;//学号
doubleen1,en2,com1,com2;//英语和计算机基础成绩
intsum1,sum2;//合计
//======以上为变量定义========
cout<<“请输入学生1姓名、学号、英语成绩、计算机基础成绩”<<endl;
cin>>name1>>num1>>en1>>com1;sum1=en1+com1;//计算合计
cout<<“请输入学生2姓名、学号、英语成绩、计算机基础成绩”<<endl;
cin>>name2>>num2>>en2>>com2;sum2=en2+com2;//计算合计
if(sum1>sum2)if(en1>60&&com1>60)cout<<“第一名:”<<name1<<sum1;elseif(en2>60&&com2>60)cout<<“第一名:”<<name2<<sum2;}这是函数名,标准的C语言总是找到main函数并从它的第一条语句开始执行注释信息是为了增加程序可读性C语言是强类型语言,必须定义变量类型29INPUT“请输入学生1姓名”,name1$INPUT“学号”,num1INPUT“英语成绩”,en1INPUT“计算机基础成绩”,com1sum1=en1+com1REM输入第一个学生的信息INPUT“请输入学生2姓名”,name2$INPUT“学号”,num2INPUT“英语成绩”,en2INPUT“计算机基础成绩”,com2sum2=en2+com2REM以上为变量定义及输入IFsum1>sum2THENIFen1>60ANDcom1>60THEN
PRINTname1,sum1
ENDIFELSEIFen2>60ANDcom2>60THENPRINTname2,sum2ENDIFENDIFEND程序编制
Basic程序代码变量名后加$表示存储文本,不加$表示存储数值用REM开头表示注释信息THEN…ENDIF相当于C++的{}符号30程序编制
Subprogram
#include<iostream.h>int
MyMax(int
a,intb){
int
tmp;if(a>b)tmp=a;elsetmp=b;returntmp;}voidmain(){
inti,j;
cout<<“请输入两个整数:”<<endl;
cin>>i>>j;
cout<<“两数中较大者为:”<<MyMax(i,j)<<endl;}这是一个函数,找出两个数中较大者在main函数中调用MyMax函数31程序的执行顺序
voidmain(){
inti,j;
cout<<“请输入两个整数:”<<endl;
cin>>i>>j;
cout<<“两数中较大者为:”
<<MyMax(i,j)<<endl;}int
MyMax(int
a,intb){int
tmp;if(a>b)tmp=a;elsetmp=b;returntmp;}2.按书写顺序一条条执行语句1.程序从这里开始执行4.遇见return语句,结束子程序,回到原程序继续执行.3.遇见子程序,就转到子程序中执行32程序编制要点如何用语句表达思想(算法)?(初级)了解语句、语法(高级)熟悉语言提供的功能、你需要做的工作不同语言提供的功能、性能有较大差距如何组织程序代码开始点执行过程(子程序拆分、调用)结束点33调试运行
IDE环境语法错误逻辑错误34调试程序的烦恼……?
程序员约翰在调试程序过程中遇到了麻烦……35编译、调试程序的例子36调试运行逻辑错误求a和b中的最大数
if(a>=b)
max=a;
elsemax=a;
if(a>b)
max=a;
max=b;if(a>=b)
max=a;
elsemax=b;OK?37计算机语言问题的提出人识别高级语言,计算机识别机器语言,人和计算机之间如何交流?一个中国经理和一个德国商人谈生意,需要一个翻译,才能进行语言沟通。与不同国家的人进行交流需要不同的语言翻译。在不同的场合,即使是某种语言,也需要不同的翻译。例如,计算机、医学不同领域……计算机语言也面临类似问题……38二、程序设计语言语言的大类机器语言汇编语言高级语言程序的编译与解释常见语言介绍Prolog/LispC,C++,C#,JAVA,Delphi,VB,AdaScript语言39语言名称
适用范围
BASIC
教学和小型应用程序的开发
FORTRAN
科学与工程计算程序的开发
PASCAL
专业教学与应用程序的开发
PROLOG
人工智能程序的开发
COBOL
商业与管理应用程序的开发
C
中小型系统程序的开发
C++
面向对象程序的开发
LISP
人工智能程序的开发
JAVA
基于Web的应用程序开发
ATA
美国军方用的防御体系开发
VC、VB
可视化、面向对象编程语言常用高级语言40语言的大类机器语言是计算机能直接执行的二进制形式。对人来说既难理解又难掌握,只在早期高级语言还没出现时使用过。汇编语言用助记码与符号地址来代替机器指令中的操作码与操作数编译语言和解释语言412.编译器建立命令
字、数据、操作符
的缩写(标签)。3.编译器分析标签,将标签安排成机器语言的格式。4.编译器分析语法,产生机器语言指令。CountNum1=5num2=4VarTotal_integerbegin1.编译器扫描源代码中它理解的命令字、数据、操作符。放弃注释语句。Compiled编译42Interpreted解释1.解释器是一种计算机程序,是程序语言环境的一部分。解释器检查程序中每一个命令字。2.解释器在语言的有效命令表中查找该命令字。3.如果该命令在表中,解释器读取命令的其它部分,以确定该命令符合语法规定。4.如果语法正确,解释器将该命令转换成机器语言,并将指令送往处理器。43三、结构化程序设计与面向对象程序设计基本程序控制结构结构化程序设计思想面向对象程序设计44结构化程序设计方法
“软件危机”--->结构化程序设计基本观点:程序设计的目标不应再集中于如何充分发挥硬件的效率方面,新的程序设计方法应以能设计出结构清晰、可读性强、易于分工合作编写和调试的程序。结构化设计方法是以模块化设计为中心。45模块化程序结构
模块化模块化示例就是把程序划分为若干个部分,每个部分独立存放、完成一个特定的功能。其目的是降低程序的复杂度,使设计出来的程序便于阅读、调试和维护。一个模块可以是一条语句、一段程序、一个函数等。基本特征是其仅有一个入口和一个出口模块相互独立,内聚性很强,一个模块完成一个功能。46三种基本程序结构
按照结构化程序设计的观点,任何算法功能都可以通过由程序模块组成的三种基本程序结构的组合:顺序结构:程序是按程序语句或模块在执行流中的顺序逐个执行。选择结构:程序是按设定的条件实现程序执行流的多路分支。循环结构:程序是按给定的条件重复地执行指定的程序段或模块。结论:理论上已经证明,用三种基本程序结构可以实现任何复杂的算法。47顺序结构顺序结构语句包括:说明语句inta,b,c;赋值语句sum=a+b;I/O语句printf(“Sum=%d、n”,sum);子函数调用语句callmulti(a,b)返回语句return(a+b)48选择结构(之一)一路分支语句格式:
if(表达式)语句序列两路分支语句格式:
if(表达式)语句序列1else
语句序列2条件?成立不成立语句序列条件?语句序列1成立不成立语句序列2语句序列可以是一个语句,也可以是复合语句结构。示例示例49选择结构之二多路(开关)选择语句语句格式:
switch(整数表达式)
{case数值1:语句序列1;
…...case数值n:
语句序列n;
[default:
语句序列n+1;]}
计算整型表达式值=?语句序列1…….语句序列2语句序列n示例50循环结构(之一)当型循环语句格式:
while(表达式)
[{]
语句序列
[}]直到型循环语句格式:
do{
语句序列
}while(表达式);循环体循环体条件?语句序列成立不成立语句序列不成立成立条件?示例示例51举例:求1~100的累加和
inti=1,sum=0;
while(i<=100){sum=sum+i;i=i+1;}i<=100?sum=sum+i;i=i+1;Ysum=0,i=0;N52循环结构(之二)for循环结构语句格式:
for(e1;e2;e3)
语句序列
e1、e2、e3是三个表达式,分别表示循环变量的初值、终值和增量。1、循环从e1值开始2、判别e2是否为真3、若真,执行语句序列,并e1加e3,转2;4、若假,退出循环。
计算e1e2为真?执行语句序列计算e3e1=e1+e3是否53VC++语言的控制结构顺序选择(分支)if(…)else{…;}switch(){case……;default:…;}循环while(){…;}for(...){…;}do{...}while(...);出口break;continue;54结构化程序设计思想结构化程序设计支持“自顶向下,逐步求精”的程序设计方法。“自顶向下”是将复杂、大的问题划分为小问题,找出问题的关键、重点所在,然后用精确的思维定性、定量地去描述问题。“逐步求精”
是将现实世界的问题经抽象转化为逻辑空间或求解空间的问题。复杂问题经抽象化处理变为相对比较简单的问题。经若干步抽象(精化)处理,最后到求解域中只是比较简单的编程问题。55例7-3验证“哥德巴赫猜想”“哥德巴赫猜想”是数论中的一个著名难题,200多年来无数数学家为其呕心沥血,却始终无人能够证明或伪证这个猜想。“哥德巴赫猜想”表述为:任何一个大于等于4的偶数均可以表示为两个素数之和。1742年法国数学爱好者哥德巴赫在给著名数学家欧拉的信中提出“哥德巴赫猜想”问题。56问题的分解求解第一步提出问题:验证哥德巴赫猜想。验证哥德巴赫猜想57问题的分解(续一)第二步设一上限数M,验证从4到M的所有偶数是否能被分解为两个素数之和。1.定义一个变量X,初值为4。2.每次令其加2,并验证X能否被分解为两个素数之和,直到X不小于M为止。X=4X<M?验证x是否能被分解为两个素数之和X=X+2否是58问题的分解(续二)第三步
如何验证X是否能被分解为两个素数之和。1.从P=2开始;2.判别X-P是否仍为素数:3.若是,打印该偶数的分解式。4.否则,换更大的素数,再继续执行2.。如此循环,直到用于检测的素数大X/2且X与其之差仍不是素数,则打印“哥德巴赫猜想”不成立。
P=2P<X/2且X—P不是素数?生成下一个素数是否P>=x/2?处理哥德巴赫猜想不成立的情况打印出X的分解情况是否59问题的分解(续三)第四步生成下一个素数。⑴当前素数P加1
⑵判别P是否是素数;
⑶若是素数,返回P;
⑷否则,P加1,继续执行⑵。
P=P+1是素数?P=P+1否返回素数P60问题的分解(续四)经过四步分解精化,将“验证哥德巴赫猜想”这个命题已经分解为计算机可以求解的数学模型了。剩下的问题就是编程求解了。如何编程是程序设计课程要解决的问题。61哥德巴赫猜想算法分析1)用“筛选”法生成素数表PrimeList[M]。先在素数表中产生0到M-1的所有自然数,然后将已确定的所有素数的倍数置0(求模取余为0)。
2,3,5,7,11,13,17,19,23,29,31...2)这样一来,素数表中有许多0,为找下一个素数,要跳过这些0。3)分解0到M-1之间的所有偶数;①循环(x<M)[x初值取4]②先取素数P=2,判别若PrimeList[x-p]等于0,说明分解不成功,p取素数表中下一个素数;再执行②③若PrimeList[x-p]不等于0,分解成功,打印分解式④x=x+2,继续执行①,检查下一个偶数。62程序逻辑功能框图
建立素数表CreatPrimeList(PrimeList)X<M?P<M/2且PrimeList[x-p]=0?取下一个素数P=NextPrimeNumber(P,PrimeList)P>=M/2?P=2x=x+2是否是否是否x=4打印该偶数分解式显示“哥德巴赫猜想错“63程序模块结构
主函数main()子函数生成素数表CreatPrimeList()子函数求下一个素数NextPrimeNomber()子函数求下一个素数NextPrimeNomber()64程序(生成素数表子函数)#include<stdio.h>#defineM31/*定义验证范围*/voidCreatPrimeList(int
PrimeList[]){inti,j;for(i=0;i<M;i=i+1)/*生成素数表,置初值*/
PrimeList[i]=i;i=2;/*i取初值2*/while(i<M/2)/*A能分解为两个因子相乘的话,其中一个因子*/{/*必小于或等于INT(sqrt(A))。*/
for(j=i+1;j<M;j=j+1)/*将表中各素数的倍数置0*/
if(PrimeList[j]!=0&&PrimeList[j]%PrimeList[i]==0)
PrimeList[j]=0;i=NextPrimeNumber(i,PrimeList);/*取下一个素数*/}}65求下一个素数子函数/*----函数NextPrimeNumber:求下一个素数-----*/
int
NextPrimeNumber(intp,int
PrimeList[]){p=p+1;
while(PrimeList[p]==0)p=p+1;returnPrimeList[p];}66主函数
main(){int
PrimeList[M];intx,p;
CreatPrimeList(PrimeList);/*生成素数表*/x=4;/*从4到M开始验证*/while(x<=M){p=PrimeList[2];/*第1个素数是2*//*验证偶数减去一个素数后的余数是否仍为素数*/while(p<M/2&&PrimeList[x-p]==0)p=NextPrimeNumber(p,PrimeList);if(p>=M/2)/*找到一个不能分解为两个素数和的偶数*/
printf("Greatdiscovery:Goldbaheiswrong!\n");else/*PrimeList[x-p]≠0分解成功*/
printf("Theevennumber%d=%d+%d\n",x,p,x-p);/*验证下一个偶数*/x=x+2; }}源代码67面向对象程序设计基本思想基本过程主要特点68面向对象的基本概念“面向对象“简称为“OO”。这是目前计算机业界使用的高频词。“OO”代表着一种新的思维方式,代表着一种新的程序设计方法的潮流。什么是OO方法?什么是OOP?为什么要选择OO方法?69面向对象程序设计基本思想面向过程的程序设计(StructureProgramming)以功能为中心,采用函数来描述(动词)传统的程序设计方法,出发点是“怎样做(How)?”。面向对象程序设计(OOP)面向对象程序设计方法认为,客观世界是由各种各样的实体组成的,这些实体就是面向对象方法中的对象。消息是向某对象请求服务的一种表达方式对象之间的交互通过发送消息来实现。消息包括:目标对象,请求的方法,参数70什么是面向对象方法面向对象(OO)方法的出发点是:“是什么(What)?”。现实世界是由物质组成的,人认识事物的规律:首先是认识问题域(Domain),它“是什么?”,再去认识事物的本质。“对象”表现现实世界中的某个具体的事物。71
传统程序设计方法存在的问题生产率提高的幅度远不能满足需要软件重用程度很低软件维护困难软件不能真正满足用户的需要72
生产率提高幅度远不能满足需要生命周期方法学强调需求分析的重要性,强调每个阶段结束之前必须进行严格的评审和质量把关。这种“按部就班”式的开发方法效率不高。据统计资料表明:从上个世纪的30中,美国软件生产率翻了两翻但社会对软件需求每年以两位数字的百分比增长软件的开发,已成为影响计算机应用的巨大桎梏和瓶颈。73软件重用程度很低“重用”也称“再用”或“复用”。显然,软件重用是节约人力,提高软件生产率的重要途径。传统的程序设计方法没能很好地解决软件重用问题。例如,建立标准函数库和子程序库是一种低级的可重用的尝试。仅仅限于数学和统计学方面。对于传统程序设计技术而言,思维成果的可重用性很差。74软件维护困难按生命周期方法学开发出的软件,维护成本很高,据统计数据表明,软件维护的生产率比软件开发的生产率低几十倍。80年代,美国一年花费的软件维护费用高达300多亿美元。90年代,软件维护费用占系统研制、开发总费用的70%~80%。75软件不能真正满足用户的需要在美国,实践表明,开发出的系统中:符合用户需要并顺利投入使用的系统仅占总数的1/4;中途夭折的系统占1/4;将近1/2的系统,虽然完成了开发过程,但并未被用户采用或并未被长期使用。还表现在:开发出的软件系统与用户预期的系统不一致,不能满足用户的需要。所开发出的系统不能适应用户经常变化的情况,系统的稳定性和可扩充性不能满足要求。76设计方法主观随意性很大结构化方法采用“自顶向下,逐步求精”进行分解。但因开发人员的经验、知识背景对问题认识的不同,而造成分解的随意性。即使是对同一个系统,不同的人可能分解出不同的软件结构。77更加自然当系统不断地演化时,内部的功能会变化,但是对象本质不变面向对象的系统更容易维护面向对象分析法强调对象间定义良好的界面为什么选择面向对象分析法?78OO方法的主要优点与人类习惯的思维方法一致稳定性好可重用性好可维护性好79与人类习惯的思维方法一致人的认识过程是从一般到特殊的渐进思维过程,是从“是什么?”开始,认识事物及其本质规律,主观随意性受到限制。而传统方法是从“怎样做?”开始,到“做什么?”,反认识规律而动,主观随意性太多。80稳定性好传统方法以“过程为中心”,完全基于功能的分析和分解。当功能需求发生变化时,将引起对软件结构整体的修改,这样的系统是不稳定的。OO方法以“对象为中心”,它是以对象模拟问题领域中的实体,以对象间的联系描述实体间的联系。在分析、研究对象及其属性的过程中根据其内在的规律建立求解模型。基于这种方法
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年个人抵押车辆借款合同编制要点
- 2025版公寓水电维修合同范本(1000字系列)12篇
- 2025版关键信息基础设施保密协议合同3篇
- 二零二五年油茶林生态环境保护与修复合作协议3篇
- 2025年度个人信用保证反担保承诺书示例4篇
- 2025年汽车配件代购合同示范文本4篇
- 个性化2024版中介服务居间合同样本一
- 2025年度二零二五年度国际贸易保理业务合作协议4篇
- 个人货款定金担保合同2024年版3篇
- 二零二五版数据中心网络安全审计与整改服务协议3篇
- 医学脂质的构成功能及分析专题课件
- 高技能人才培养的策略创新与实践路径
- 人教版(2024新版)七年级上册英语期中+期末学业质量测试卷 2套(含答案)
- 2024年湖北省中考数学试卷(含答案)
- 油烟机清洗安全合同协议书
- 2024年云南省中考数学试题(原卷版)
- 污水土地处理系统中双酚A和雌激素的去除及微生物研究
- 气胸病人的护理幻灯片
- 《地下建筑结构》第二版(朱合华)中文(2)课件
- JB T 7946.1-2017铸造铝合金金相
- 包装过程质量控制
评论
0/150
提交评论