wujr5 / c-and-cpp-language-learning

C和C++编程语言学习 - 2015级
67 stars 34 forks source link

计科:实验课分享 #22

Open wujr5 opened 8 years ago

wujr5 commented 8 years ago

计科:实验课分享

大家可以在评论中分享你觉得很有价值的东西,觉得可能对大家有用的东西。TA会鉴定你所分享的内容,如果不恰当,可能会被修改或者删除。但是请不要因为这样而害怕或者拒绝分享,因为交换想法或者思想,你将收获巨大。

linzhk commented 8 years ago

伪代码的语法规则在伪代码中,每一条指令占一行(else if 例外,),指令后不跟任何符号(Pascal和C中语句要以分号结尾);书写上的“缩进”表示程序中的分支程序结构。这种缩进风格也适用于if-then-else语句。用缩进取代传统Pascal中的begin和end语句来表示程序的块结构可以大大提高代码的清晰性;同一模块的语句有相同的缩进量,次一级模块的语句相对与其父级模块的语句缩进;例如:line 1line 2sub line 1sub line 2 sub sub line 1 sub sub line 2sub line 3line 3而在Pascal中这种关系用begin和end的嵌套来表示, line 1 line 2 begin sub line 1 sub line 2 begin sub sub line 1 sub sub line 2end; sub line 3 end; line 3在C中这种关系用{ 和 } 的嵌套来表示, line 1 line 2 { sub line 1 sub line 2 { sub sub line 1 sub sub line 2 } sub line 3 } line 3 在伪代码中,通常用连续的数字或字母来标示同一即模块中的连续语句,有时也可省略标号。例如: 1. line 1 2. line 2 a. sub line 1 b. sub line 2 1. sub sub line 1 2. sub sub line 2 c. sub line 3 3. line 3符号△后的内容表示注释;在伪代码中,变量名和保留字不区分大小写,这一点和Pascal相同,与C或C++不同;在伪代码中,变量不需声明,但变量局部于特定过程,不能不加显示的说明就使用全局变量;赋值语句用符号←表示,x←exp表示将exp的值赋给x,其中x是一个变量,exp是一个与x同类型的变量或表达式(该表达式的结果与x同类型);多重赋值i←j←e是将表达式e的值赋给变量i和j,这种表示与j←e和i←e等价。例如:x←yx←20(y+1)x←y←30以上语句用Pascal分别表示为: x := y; x := 20(y+1); x := 30; y := 30;以上语句用C分别表示为: x = y; x = 20(y+1); x = y = 30;选择语句用if-then-else来表示,并且这种if-then-else可以嵌套,与Pascal中的if-then-else没有什么区别。例如: if (Condition1) then [ Block 1 ] else if (Condition2) then [ Block 2 ] else [ Block 3 ] 循环语句有三种:while循环、repeat-until循环和for循环,其语法均与Pascal类似,只是用缩进代替begin - end;例如: 1. x ← 0 2. y ← 0 3. z ← 0 4. while x < N 1. do x ← x + 1 2. y ← x + y 3. for t ← 0 to 101. do z ← ( z + x * y ) / 1002. repeat1. y ← y + 12. z ← z - y3. until z < 0 4. z ← x * y 5. y ← y / 2上述语句用Pascal来描述是:x := 0;y := 0;z := 0;while x < N dobegin x := x + 1; y := x + y; for t := 0 to 10 do begin z := ( z + x * y ) / 100; repeat y := y + 1; z := z - y; until z < 0; end; z := x * y;end;y := y / 2;上述语句用C或C++来描述是: x = y = z = 0; while( z < N ) { x ++; y += x; for( t = 0; t < 10; t++ ) { z = ( z + x * y ) / 100; do { y ++; z -= y; } while( z >= 0 ); } z = x \ y; } y /= 2; 数组元素的存取有数组名后跟“[下标]”表示。例如A[j]指示数组A的第j个元素。符号“ …”用来指示数组中值的范围。例如:A[1…j]表示含元素A[1], A[2], … , A[j]的子数组;复合数据用对象(Object)来表示,对象由属性(attribute)和域(field)构成。域的存取是由域名后接由方括号括住的对象名表示。例如:数组可被看作是一个对象,其属性有length,表示其中元素的个数,则length[A]就表示数组A中的元素的个数。在表示数组元素和对象属性时都要用方括号,一般来说从上下文可以看出其含义。用于表示一个数组或对象的变量被看作是指向表示数组或对象的数据的一个指针。对于某个对象x的所有域f,赋值y←x就使f[y]=f[x],更进一步,若有f[x]←3,则不仅有f[x]=3,同时有f[y]=3,换言之,在赋值y←x后,x和y指向同一个对象。有时,一个指针不指向任何对象,这时我们赋给他nil。函数和过程语法与Pascal类似。函数值利用 “return (函数返回值)” 语句来返回,调用方法与Pascal类似;过程用 “call 过程名”语句来调用;例如:1. x ← t + 102. y ← sin(x)3. call CalValue(x,y)参数用按值传递方式传给一个过程:被调用过程接受参数的一份副本,若他对某个参数赋值,则这种变化对发出调用的过程是不可见的。当传递一个对象时,只是拷贝指向该对象的指针,而不拷贝其各个域。a) 伪代码表示的算法用传统的流程图和N-S图表示算法直观易懂,但画起来比较费事,在设计一个算法时,可能要反复修改,而修改流程图是比较麻烦的。因此,流程图适宜于表示一个算法,但在设计算法过程中使用不是很理想的(尤其是当算法比较复杂、需要反复修改时)。为了设计算法时方便,常用一种称为伪代码的工具。伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。它如同一篇文章一样,自上而下地写下来。每一行(或几行)表示一个基本操作。它不用图形符号,因此书写方便、格式紧凑,易懂也便于向计算机语言算法(即程序)过渡。可以用英文、汉字、中英文混合表示算法,以便于书写和阅读为原则。用伪代码写算法并无固定的、严格的语法规则,只要把意思表达清楚,并且书写的格式要写成清晰易读的形式。

wujr5 commented 8 years ago

@yyh14353191 同学,你的分享可读性太差了。要学一下使用Markdown语法。还要注意分段。这样大段的放上来,没有人愿意看的。 参考:Markdown语法

如果没有Markdown语法,未来可能会删除你的分享哦,并且这样的分享不算数。

MattMu commented 8 years ago

int转化成string的两种方法

1.使用sprintf函数

字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。

sprintf 是个变参函数,定义如下:

int sprintf( char *buffer, const char *format , [argument] ... );

除了前两个参数类型固定外,后面可以接任意多个参数。

具体内容请参考sprintf_百度百科

Example

#include < iostream >
#include < string > 
int main() {
    int numbers;
    std::cout << "请输入一串数字" << std::endl;
    std::cin >> numbers;
    char n[10];
    std::string n1;
    sprintf(n, "%d", numbers);
    n1 = n;
    std::cout << n1;
    return 0;
}

但是这种方式存在缓冲区溢出风险。比如当输入数据的长度超过定义的字符串的长度(在这里是10),就会溢出。

qq 20151112095909

因此,为了避免溢出的风险,我们可以用下面这种方法

2.使用stringstream

stringstream是字符串流,它将流与存储在内存中的string对象绑定起来。 在多种数据类型之间实现自动格式化。

具体内容和其它用法请参考stringstream的基本用法

这里只简单说一下把它用作int和srting之间的转换。

Example

#include < iostream >
#include < sstream > 

int main() {
    int numbers;
    std::cout << "请输入一串数字" << std::endl;
    std::cin >> numbers;
    std::string n;
    std::stringstream stream;
    stream << numbers;
    stream >> n;
    std::cout << n;
    return 0;
}

这种方式不必担心会造成缓冲区溢出,所以个人认为比第一种好用。

将int与string类型相转化还有很多,例如http://bbs.csdn.net/topics/220013347 中就讲了不少。

wujr5 commented 8 years ago

@MattMu 看一下这样的效果。我稍微改一下语法,可读性就提高了很多。善用Markdown语法。

SgLy commented 8 years ago

@wujr5 这个星期来不及准备了……下个星期可以讲选择排序或者程序的时空复杂度分析吗

wujr5 commented 8 years ago

@SgLy 你的意思是你分享:选择排序或者程序的时空复杂度分析,还是让我讲?

SgLy commented 8 years ago

@wujr5 我分享w

MattMu commented 8 years ago

AStyle

最近看到一些同学在解决自己代码风格不佳的问题,现提供一种简单(轻松)的方式。

在Dev-C++中,主菜单行中有一个AStyle的选项。

qq 20151122164108

只需点击AStyle然后格式化当前文件或直接Ctrl + Shift + A就可以将代码格式化,可读性提高不少。

还可自行选择风格

qq 20151122165925

附上命令符

  1. -f 在两行不相关的代码之间插入空行,如import和public class之间、public class和成员之间等;
  2. -p 在操作符两边插入空格,如=、+、-等。 如:int a=1060; 处理后变成int a = 10 \ 60;
  3. -P 在括号两边插入空格。另,-d只在括号外面插入空格,-D只在里面插入。 如:MessageBox.Show ("aaa"); 处理后变成MessageBox.Show ( "aaa" );
  4. -U 移除括号两边不必要的空格。 如:MessageBox.Show ( "aaa" ); 处理后变成MessageBox.Show ("aaa");
  5. -V 将Tab替换为空格。