当前位置:文档之家› 课题_C#Xpath解析HtmlDocument的使用方法与递归取得页面所有标签xpath值

课题_C#Xpath解析HtmlDocument的使用方法与递归取得页面所有标签xpath值

课题_C#Xpath解析HtmlDocument的使用方法与递归取得页面所有标签xpath值
课题_C#Xpath解析HtmlDocument的使用方法与递归取得页面所有标签xpath值

C#Xpath解析HtmlDocument的使用方法与递归取得页面所有标签

xpath值

在学习HTML Xpath之前呢我们先来下载一下Dll文件

大家下载单击如下图片下载就行了

接下来就是在程序中引用一下,

然后就可以直接调用了,大家看看

代码吧

普通浏览复制代码

1. //htmlDcoument对象用来访问Html文档s

2. HtmlAgilityPack.HtmlDocument hd = new HtmlAgilityPack.Ht

mlDocument();

3. //加载Html文档

4. hd.LoadHtml(strhtml);

5. string str = hd.DocumentNode.SelectSingleNode("//*[@id='e_font']"

).OuterHtml;

这样就可以得到一个标签的HTml代码了

OuterHtml是取包含本身的Html如果是InnerHtml就是取的包含在这个标签之内的所有Html代码了

这点大家要注意了

如果大家想获取Html代码的Xpath路径就是这部分

1.//*[@id='e_font']

复制代码

这个其实很简单只在大家安装一个Firbug就行了,

看下图片

大家只要进入选择模式,然后选择你要的内容,然后右键复制一下就行了。

然后放在SelectSingleNode()方法里就OK了

下面我说说几个方法和属性的意思吧、

方法

SelectNodes 获取的是一个集合

SelectSingleNode 获取一个标签

SetAttributeValue 设置标签的属性值例如:SetAttributeValue("name","xpath-89");这说明把name属性的值修改为xpath-89

属性

OuterHtml 是取包含本身的Html

InnerHtml 取的包含在这个标签之内的所有Html代码了

XPath 获取相对应的Xpath值

Attributes 获取一个属性的值例如:Attributes("name")

也可以进行添加属性例如:

普通浏览复制代码

1.

hd.DocumentNode.SelectSingleNode(item.Key).Attributes.Add("xpathid", "

xpath_1" );

下面我写了一个递归获取Html页面所有Xpath值的方法大家看一下吧

普通浏览复制代码

1. //key(Xpath),value(整个节点)

2. public List XpathList = new List();

3. public string strhtml = "";//这里就是你的Html代码具体怎么获取请参

考我的

">HttpHelper类吧

4. private int Index = 0;

5.//开始处理Node

6. private void SartNode()

7. {

8. //htmlDcoument对象用来访问Html文档s

9. HtmlAgilityPack.HtmlDocument hd = new HtmlAgilityPack.Ht

mlDocument();

10. //加载Html文档

11. hd.LoadHtml(strhtml);

12. HtmlNodeCollection htmllist = hd.DocumentNode.ChildNodes;

13. Index = 0;

14. XpathList.Clear();

15. foreach (HtmlNode em in htmllist)

16. {

17. Setxpath(em);

18. }

19. }

20. ///

21. /// 递归获取Html Dom

22. ///

23. /// 要处理的节点

24. private void Setxpath(HtmlNode node)

25. {

26. foreach (HtmlNode item in node.ChildNodes)

27. {

28. if (item.XPath.Contains("#"))

29. {

30. continue;

31. }

32. if (item.ChildNodes.Count > 0)

33. {

34. XpathList.Add(new ObjXpath() { id = Index.ToString(),

Key = item.XPath, Value = "" });

35. Index++;

36. Setxpath(item);

37. }

38. else

39. {

40. XpathList.Add(new ObjXpath() { id = Index.ToString(),

Key = item.XPath, Value = "" });

41. Index++;

42. }

43. }

44. }

45. public class ObjXpath

46. {

47. public string id { get; set; }

48. public string Key { get; set; }

49. public string Value { get; set; }

50. }

XpathList 就是获取的所有Xpath值了,大家有兴趣的话可以试试

我们先来看看效果吧

好了下面放出所有代码给大家

普通浏览复制代码

https://www.doczj.com/doc/315364190.html,ing System;

https://www.doczj.com/doc/315364190.html,ing System.Collections.Generic;

https://www.doczj.com/doc/315364190.html,ing https://www.doczj.com/doc/315364190.html,ponentModel;

https://www.doczj.com/doc/315364190.html,ing System.Data;

https://www.doczj.com/doc/315364190.html,ing System.Drawing;

https://www.doczj.com/doc/315364190.html,ing System.Linq;

https://www.doczj.com/doc/315364190.html,ing System.Text;

https://www.doczj.com/doc/315364190.html,ing System.Windows.Forms;

https://www.doczj.com/doc/315364190.html,ing System.Text.RegularExpressions;

https://www.doczj.com/doc/315364190.html,ing System.Threading;

https://www.doczj.com/doc/315364190.html,ing HtmlAgilityPack;

https://www.doczj.com/doc/315364190.html,ing System.IO;

https://www.doczj.com/doc/315364190.html,ing System.Runtime.Serialization.Json;

14.

https://www.doczj.com/doc/315364190.html,space AutoXpathTools

16.{

17. public partial class Form1 : Form

18. {

19. public Form1()

20. {

21. InitializeComponent();

22. }

23.

24. #region 私有变量和方法

25.

26. //委托传入一个字符串

27. private delegate void SetListBox(string str);

28.

29. //key(Xpath),value(整个节点)

30. List XpathList = new List();

31. private int Index = 0;

32. //htmlDcoument对象用来访问Html文档

33. HtmlAgilityPack.HtmlDocument hd = new HtmlAgilityPack.HtmlD

ocument();

34.

35. #endregion

36.

37. //分析Xpath的所有代码

38. private void btnGetXpath_Click(object sender, EventArgs e)

39. {

40. try

41. {

42. HttpHelper http = new HttpHelper();

43. HttpItem item = new HttpItem() { URL = textBox1.Text.Tr

im(), IsToLower = false, Encoding = "gbk" };

44. txtXml.Text = http.GetHtml(item);

45. if (!string.IsNullOrWhiteSpace(txtXml.Text) && txtXml.Text

.Trim().ToLower() != "error")

46. {

47. //加载Html文档

48. hd.LoadHtml(txtXml.Text);

49.

50.

51. Thread pingTask = new Thread(new ThreadStart(delega

te

52. {

53. //代码,线程要执行的代码

54. SartNode(txtXml.Text);

55. }));

56. pingTask.Start();

57.

58. }

59. else

60. {

61. txtXml.Text = "根据您的的ULR:

" + textBox1.Text.Trim() + "无法得到任何内容";

62. }

63. }

64. catch (Exception ex)

65. {

66. txtXml.Text = ex.Message.Trim();

67. }

68. }

69.

70.

71. //开始处理Node

72. private void SartNode(string strhtml)

73. {

74. //htmlDcoument对象用来访问Html文档s

75. HtmlAgilityPack.HtmlDocument hd = new HtmlAgilityPack.Ht

mlDocument();

76. //加载Html文档

77. hd.LoadHtml(strhtml);

78. HtmlNodeCollection htmllist = hd.DocumentNode.ChildNodes;

79. Index = 0;

80. XpathList.Clear();

81. foreach (HtmlNode em in htmllist)

82. {

83. Setxpath(em);

84. }

85. }

86. ///

87. /// 递归获取Html Dom

88. ///

89. /// 要处理的节点

90. private void Setxpath(HtmlNode node)

91. {

92. foreach (HtmlNode item in node.ChildNodes)

93. {

94. if (item.XPath.Contains("#"))

95. {

96. continue;

97. }

98. if (item.ChildNodes.Count > 0)

99. {

100. XpathList.Add(new ObjXpath() { id = Index.ToString() , Key = item.XPath, Value = "" });

101. UIContorol(item.XPath);

102. Index++;

103. Setxpath(item);

104. }

105. else

106. {

107. XpathList.Add(new ObjXpath() { id = Index.ToString() , Key = item.XPath, Value = "" });

108. UIContorol(item.XPath);

109. Index++;

110. }

111. }

112. }

113.

114. //使用委托给控件赋值

115. private void UIContorol(string str)

116. {

117. listBox1.Items.Add(str);

118. toolStripStatusLabel1.Text = str;

119. }

120.

121. private void listBox1_SelectedValueChanged(object sender, Ev entArgs e)

122. {

123. if (listBox1.SelectedItem != null)

124. {

125. txtPath.Text = listBox1.SelectedItem.ToString().Trim();

126. }

127. }

128.

129. private void button3_Click(object sender, EventArgs e)

130. {

131. txtContents.Text = hd.DocumentNode.SelectSingleNode(txt Path.Text.Trim()).OuterHtml;

132. }

133.

134. private void Form1_Load(object sender, EventArgs e)

135. {

136. //HttpItem item = new HttpItem()

137. //{

138. // URL = "https://www.doczj.com/doc/315364190.html,/login",

139. // Method = "post",

140. // Cookie = "dtid=ZfXUVo1IsplHR4mHW1HYmgKbY4GJa00 3; kvf=1358855337188; alf=1; dru=1356356040; _l5=y",

141. // ContentType = "application/x-www-form-urlencoded",

142. // Postdata = "account=xinsuilie1998@https://www.doczj.com/doc/315364190.html,&passwor d=wjlove520&nextUrl=&lcallback=&persistent=1",

143. // Referer = "https://www.doczj.com/doc/315364190.html,/logout?formKey= e4714d863c862a84fafd83d98e5ecb22"

144. //};

145. //HttpHelper http = new HttpHelper();

146. //string html = http.GetHtml(item);

147. //string cookie = item.Cookie;

148. //item = new HttpItem() { URL = "http://www.diandian.co m/home", Cookie = cookie };

149. //html = http.GetHtml(item);

150. }

151. }

152. public class ObjXpath

153. {

154. public string id { get; set; }

155. public string Key { get; set; }

156. public string Value { get; set; } 157. }

158.}

就到这里吧

C语言-函数

C语言(函数,变量作用范围)二 1 C语言程序由函数组成,以下说法正确的是( A ). A)主函数可以在其它函数之前,函数内不可以嵌套定义函数 B)主函数可以在其它函数之前,函数内可以嵌套定义函数 C)主函数必须在其它函数之前,函数内不可以嵌套定义函数 D)主函数必须在其它函数之前,函数内可以嵌套定义函数 2 以下说法中不正确的是( A )。 A) 主函数main中定义的变量在整个文件或程序中有效 B) 不同的函数中可以使用相同名字的变量 C) 形式参数是局部变量 D) 在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效 3 下面函数 f(double x) {printf(“%6d\n”,x);} 的类型为( C ). A) 实型B)void 类型C)int 类型 D) A)、B)、C)均不正确 4 以下说法中正确的是( C ). A)C语言程序总是从第一个定义的函数开始执行 B)在C语言程序中,要调用的函数必须在main函数中定义 C)C语言程序总是从main函数开始执行 D)C语言程序中,main函数必须放在程序的开始部分 5 以下正确的函数定义是( C ). A) double fun(int x,int y); {int z; z=x+y; return z;} B) fun(int x,y) {int z; return z;} C) double fun(int x,int y) {double z; z=x+y; return z;} D) double fun( x, y) {int x,y; double z; z=x+y; return z;} 6 定义为void类型的函数,其含义是( A ). A)调用函数后,被调用的函数没有返回值 B)调用函数后,被调用的函数不返回 C)调用函数后,被调用的函数的返回值为任意的类型 D)以上三种说法都是错误的

C语言实现二叉树的前序遍历(递归)

C语言实现二叉树的前序遍历算法实现一: #include #include typedef struct BiTNode//定义结构体 { char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; void CreateBiTree(BiTree &T) //前序创建树 { char ch; scanf("%c",&ch); if(ch==' ') T=NULL; else { T=(struct BiTNode *)malloc(sizeof(struct BiTNode)); T->data=ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); } } int print(BiTree T)//前序遍历(输出二叉树) { if(T==NULL)return 0; else if(T->lchild==NULL && T->rchild==NULL)return 1; else return print(T->lchild)+print(T->rchild); } void main()//主函数 { BiTree T; CreateBiTree(T); printf("%d\n",print(T)); } 算法实现二: #include

#include struct BiTNode//定义结构体 { char data; struct BiTNode *lchild,*rchild; }; int num=0; void CreatBiTree(struct BiTNode *&p) //前序创建树 { char ch; scanf("%c",&ch); if(ch==' ') p=NULL; else { p=(struct BiTNode *)malloc(sizeof(struct BiTNode)); p->data=ch; CreatBiTree(p->lchild); CreatBiTree(p->rchild); } } void print(struct BiTNode *p) //前序遍历(输出二叉树){ if(p!=NULL) { if(p->lchild==NULL&&p->rchild==NULL) else { print(p->lchild); print(p->rchild); } } } void main()//主函数 { struct BiTNode *p; CreatBiTree(p); print(p); printf("%d\n",num); } 供测试使用的数据

二叉树遍历C语言(递归,非递归)六种算法

数据结构(双语) ——项目文档报告用两种方式实现表达式自动计算 专业: 班级: 指导教师: 姓名: 学号:

目录 一、设计思想 (01) 二、算法流程图 (02) 三、源代码 (04) 四、运行结果 (11) 五、遇到的问题及解决 (11) 六、心得体会 (12)

一、设计思想 二叉树的遍历分为三种方式,分别是先序遍历,中序遍历和后序遍历。先序遍历实现的顺序是:根左右,中序遍历实现的是:左根右,后续遍历实现的是:左右根。根据不同的算法分,又分为递归遍历和非递归遍历。 递归算法: 1.先序遍历:先序遍历就是首先判断根结点是否为空,为空则停止遍历,不为空则将左子作为新的根结点重新进行上述判断,左子遍历结束后,再将右子作为根结点判断,直至结束。到达每一个结点时,打印该结点数据,即得先序遍历结果。 2.中序遍历:中序遍历是首先判断该结点是否为空,为空则结束,不为空则将左子作为根结点再进行判断,打印左子,然后打印二叉树的根结点,最后再将右子作为参数进行判断,打印右子,直至结束。 3.后续遍历:指针到达一个结点时,判断该结点是否为空,为空则停止遍历,不为空则将左子作为新的结点参数进行判断,打印左子。左子判断完成后,将右子作为结点参数传入判断,打印右子。左右子判断完成后打印根结点。 非递归算法: 1.先序遍历:首先建立一个栈,当指针到达根结点时,打印根结点,判断根结点是否有左子和右子。有左子和右子的话就打印左子同时将右子入栈,将左子作为新的根结点进行判断,方法同上。若当前结点没有左子,则直接将右子打印,同时将右子作为新的根结点判断。若当前结点没有右子,则打印左子,同时将左子作为新的根结点判断。若当前结点既没有左子也没有右子,则当前结点为叶子结点,此时将从栈中出栈一个元素,作为当前的根结点,打印结点元素,同时将当前结点同样按上述方法判断,依次进行。直至当前结点的左右子都为空,且栈为空时,遍历结束。 2.中序遍历:首先建立一个栈,定义一个常量flag(flag为0或者1),用flag记录结点的左子是否去过,没有去过为0,去过为1,默认为0.首先将指针指向根结点,将根结点入栈,然后将指针指向左子,左子作为新的结点,将新结点入栈,然后再将指针指向当前结点的左子,直至左子为空,则指针返回,flag置1,出栈一个元素,作为当前结点,打印该结点,然后判断flag,flag为1则将指针指向当前结点右子,将右子作为新的结点,结点入栈,再次进行上面的判断,直至当前结点右子也为空,则再出栈一个元素作为当前结点,一直到结束,使得当前结点右子为空,且栈空,遍历结束。 3.后续遍历:首先建立两个栈,然后定义两个常量。第一个为status,取值为0,1,2.0代表左右子都没有去过,1代表去过左子,2,代表左右子都去过,默认为0。第二个常量为flag,取值为0或者1,0代表进左栈,1代表进右栈。初始时指针指向根结点,判断根结点是否有左子,有左子则,将根结点入左栈,status置0,flag置0,若没有左子则判断结点有没有右子,有右子就把结点入右栈,status置0,flag置1,若左右子都没有,则打印该结点,并将指针指向空,此时判断flag,若flag为0,则从左栈出栈一个元素作为当前结点,重新判断;若flag为1则从右栈出栈一个元素作为当前结点,重新判断左右子是否去过,若status 为1,则判断该结点有没有右子,若有右子,则将该结点入右栈,status置1,flag置1,若没有右子,则打印当前结点,并将指针置空,然后再次判断flag。若当前结点status为2,且栈为空,则遍历结束。若指针指向了左子,则将左子作为当前结点,判断其左右子情况,按上述方法处理,直至遍历结束。

C语言函数习题及答案

第6章函数习题 一、选择题 1. 一个完整的C源程序是【】。 A)要由一个主函数或一个以上的非主函数构成 B)由一个且仅由一个主函数和零个以上的非主函数构成 C)要由一个主函数和一个以上的非主函数构成 D)由一个且只有一个主函数或多个非主函数构成 2. 以下关于函数的叙述中正确的是【】。 A)C语言程序将从源程序中第一个函数开始执行 B)可以在程序中由用户指定任意一个函数作为主函数,程序将从此开始执行 C)C语言规定必须用main作为主函数名,程序将从此开始执行,在此结束 D)main可作为用户标识符,用以定义任意一个函数 3. 以下关于函数的叙述中不正确的是【】。 A)C程序是函数的集合,包括标准库函数和用户自定义函数 B)在C语言程序中,被调用的函数必须在main函数中定义 C)在C语言程序中,函数的定义不能嵌套 D)在C语言程序中,函数的调用可以嵌套 4. 在一个C程序中,【】。 A)main函数必须出现在所有函数之前 B)main函数可以在任何地方出现 C)main函数必须出现在所有函数之后 D)main函数必须出现在固定位置 5. 若在C语言中未说明函数的类型,则系统默认该函数的数据类型是【】 A)float B)long C)int D)double 6. 以下关于函数叙述中,错误的是【】。 A)函数未被调用时,系统将不为形参分配内存单元 B)实参与形参的个数应相等,且实参与形参的类型必须对应一致 C)当形参是变量时,实参可以是常量、变量或表达式 D)形参可以是常量、变量或表达式 7. C程序中各函数之间可以通过多种方式传递数据,下列不能用于实现数据传递的方式是【】。 A)参数的形实(哑实)结合 B)函数返回值 C)全局变量 D)同名的局部变量 8. 若函数调用时参数为基本数据类型的变量,以下叙述正确的是【】。 A)实参与其对应的形参共占存储单元 B)只有当实参与其对应的形参同名时才共占存储单元 C)实参与对应的形参分别占用不同的存储单元 D)实参将数据传递给形参后,立即释放原先占用的存储单元 9. 函数调用时,当实参和形参都是简单变量时,他们之间数据传递的过程是【】。 A)实参将其地址传递给形参,并释放原先占用的存储单元 B)实参将其地址传递给形参,调用结束时形参再将其地址回传给实参 C)实参将其值传递给形参,调用结束时形参再将其值回传给实参

C语言函数递归[1]

递归,作为C语言最经典的算法之一,是一种非常有用的程序设计方法。虽然用递归算法编写的程序结构清晰,具有很好的可读性,还往往使某些看起来不易解决的问题变得容易解决。但在递归函数中,由于存在着自调用过程,程序控制反复进入其自身,使程序的分析设计有一定困难,致使很多初学者往往对递归迷惑不解,也在这上面花了不少的时间,却收效甚微。那么,究竟什么是递归?怎么实现递归呢? 所谓递归,简而言之就是在调用一个函数的过程中又直接或间接地调用该函数本身,以实现层次数据结构的查询和访问。在函数中直接调用函数本身,称为直接递归调用。在函数中调用其它函数,其它函数又调用原函数,这就构成了函数自身的间接调用,称为间接递归调用。 而采用递归方法来解决问题,必须符合以下三个条件: 1、可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的对象有规律地递增或递减。 说明:解决问题的方法相同,调用函数的参数每次不同(有规律的递增或递减),如果没有规律也就不能适用递归调用。 2、可以应用这个转化过程使问题得到解决。 说明:使用其他的办法比较麻烦或很难解决,而使用递归的方法可以很好地解决问题 3、必定要有一个明确的结束递归的条件。 说明:一定要能够在适当的地方结束递归调用。不然可能导致系统崩溃。 好知道是这样以后;我们来写一个众多教材上的程序:使用递归的方法求n!。 当n>1时,求n!的问题可以转化为n*(n-1)!的新问题。比如n=4: 第一部分:4*3*2*1 n*(n-1)! 第二部分:3*2*1 (n-1)(n-2)! 第三部分:2*1 (n-2)(n-3)! 第四部分:1 (n-4)! 4-4=0,得到值1,结束递归。 我给的源程序如下: #include int fac(int n) {int c; printf("now the number is %d ",n); getchar(); if(n==1 || n==0) c=1; else c=n*fac(n-1); printf("now the number is %d and the %d! is %d",n,n,c); getchar();

c语言递归函数示例

1.编写计算X的Y次幂的递归函数getpower(int x,int ),并在主程序中实现输入输出。#include"stdio.h" long getpower(int x,int y) { if(y==1) return x; else return x*getpower(x,y-1); } void main() { int num,power; long answer; printf("please input a number:"); scanf("%d",&num); printf("please input the number's power series:"); scanf("%d",&power); answer=getpower(num,power); printf("结果是:%ld\n",answer); } 结果说明:输入61再输入5求得61的5次幂为844596301. 2编写计算学生年龄的递归函数。 #include int age(int n) { int c; if(n==1) c=10; else c=age(n-1)+2; return c; } void main() { int n=5; printf("the five student'sage is:%d years old\n",age(n)); }

结果说明:第五个学生的年龄为18岁。 3.编写递归函数实现Ackman函数。 #include Acm(int m,int n) { if(m==0) return n+1; else if(n==0) return Acm(m-1,1); else return Acm(m-1,Acm(m,n-1)); } int main() { printf("Acm(2,1)=%d\n",Acm(2,1)); printf("Acm(3,2)=%d\n",Acm(3,2)); return 0; } 结果说明:利用递归函数求得Acm(2,1)=5,Acm(3,2)=29. 实验小结:

C语言函数练习题及答案

1 【单选题】 在下列关于C函数定义的叙述中,正确的是??A、 函数可以嵌套定义,但不可以嵌套调用; ? ?B、 函数不可以嵌套定义,但可以嵌套调用; ? ?C、 函数不可以嵌套定义,也不可以嵌套调用; ? ?D、 函数可以嵌套定义,也可以嵌套调用; ? 我的答案:B得分:2.5分 2 【单选题】 下面函数调用语句含有实参的个数为? nc((exp1,exp2),(exp3,exp4,exp5)); ?A、 1 ? ?B、 2

? ?C、 4 ? ?D、 5 ? 我的答案:B得分:2.5分 3 【单选题】 C语言中函数返回值的类型是由以下哪个选项决定的??A、 函数定义时指定的类型; ? ?B、 return语句中的表达式类型; ? ?C、 调用该函数时的实参的数据类型; ? ?D、 形参的数据类型; ? 我的答案:A得分:2.5分 4 【单选题】

以下关于函数叙述中,错误的是? ?A、 函数未被调用时,系统将不为形参分配内存单元; ? ?B、 实参与形参的个数必须相等,且实参与形参的类型必须对应一致; ? ?C、 当形参是变量时,实参可以是常量、变量或表达式; ? ?D、 如函数调用时,实参与形参都为变量,则这两个变量不可能共享同一内存空间; ? 我的答案:B得分:2.5分 5 【单选题】 若函数调用时参数为基本数据类型的变量,以下叙述正确的是? ?A、 实参与其对应的形参共享内存存储单元; ? ?B、 只有当实参与其对应的形参同名时才共享内存存储单元; ? ?C、 实参与对应的形参分别占用不同的内存存储单元; ?

实参将数据传递给形参后,立即释放原先占用的内存存储单元; ? 我的答案:C得分:2.5分 6 【单选题】 函数调用时,实参和形参都是简单变量,它们之间数据传递的过程描述正确的是??A、 实参将地址传递给形参,并释放原先占用的存储单元; ? ?B、 实参将地址传递给形参,调用结束时形参再将此地址回传给实参; ? ?C、 实参将值传递给形参,调用结束时形参再将其值回传给实参; ? ?D、 实参将值传递给形参,调用结束时形参并不将其值回传给实参; ? 我的答案:D得分:2.5分 7 【单选题】 若用数组名作为函数调用的实参,则传递给形参的是? ?A、 数组第一个元素的地址; ?

C语言递归练习(附答案)

dic递归基础练习题: 1.求1+2+3+……+n的值 int sum(int a,int b) { if(b==a) return a; return a+sum(a+1,b); } 2. 求1*2*3*……*n的值 cheng(int begin,int end) { if(begin==end) return begin; return begin * cheng(begin+1,end); } 3. 数的全排列问题。将n个数字1,2,…n的所有排列按字典顺序枚举出猴 2 3 1 2 1 3 3 1 2 3 2 1 4. 数的组合问题。从1,2,…,n中取出m个数,将所有组合按照字典顺序列出。 如n=3,m=2时,输出: 1 2 1 3 2 3 5. 小猴子第一天摘下若干桃子,当即吃掉一半,又多吃一个.第二天早上又将剩下的桃子吃一半,又多吃一个.以后每天早上吃前一天剩下的一半另一个.到第10天早上猴子想再吃时发现,只剩下一个桃子了.问第一天猴子共摘多少个桃子? fruit(int begin,int times) { if(times==10) return begin; return fruit((begin+1)*2,times+1); } 6. 有雌雄一对兔子,假定过两个月便可繁殖雌雄各一的一对小兔子。问过n个月后共有多少对兔子? 7. 一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子? duck(int begin,int times) { if(times==7) return begin; return duck((begin+1)*2,times+1); }

c语言_递归下降分析程序实验_共13页

实验二递归下降语法分析程序的设计与实现 、实验目的:加深对语法分析器工作过程的理解;加强对递归下降法实现语法分析程序的掌握;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法翻译。 、实验内容:在实验1的基础上,用递归下降分析法编制语法分析程序,语法分析程序的实现可以采用任何一种编程工具。 三、实验要求: 1.对语法规则有明确的定义; 2.编写的分析程序能够进行正确的语法分析; 3.*对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成语法分析过程; 4.实验报告要求用文法的形式对语法定义做出详细说明,说明语法分析程序的工作过程,说明错误处理的实现*。 四、实验学时:4学时 五、实验步骤: 1.定义目标语言的语法规则; 2.根据语法规则输入语句段,用递归下降分析的方法进行语法分析,直到结束; 3.*对遇到的语法错误做出错误处理。 六、实验内容: 1.编程实现给定文法的递归下降分析程序。 E—T|E+T T—F|T*F F—(E)|i

2.(参考课本P74)对文法先进行消除左递归。 3.分析程序由一组递归过程组成,文法中每个非终结符对应一个过程几个全局过程和变量: ADVANCE,把输入串指示器IP指向下一个输入符号,即读入一个单字符号 SYM,IP当前所指的输入符号 ERROR,出错处理子程序 每个非终结符有对应的子程序的定义,首先在分析过程中,当需要从某个非终结符出发进行展开(推导)时,就调用这个非终结符对应的子程序。 4.具体实现时: 当遇到终结符,编写:if (当前读到的输入符号=i) 读入下一个输入符号 当遇到非终结符E时,编写语句:调用E() 当遇到E-->编写语句if (当前读到的输入符号不属于Follow (E)) Error(); (4)当某个非终结符的规则有多个候选式时,按LL(1)文法的条件能唯一的选择一个候选式进行推导。 #in elude using n ames pace std; char 〃字符串的存入 a[80]; char sym; 〃单个的判断字符 int //字符串下标 i=0; void //功能识别函数 E(); void //功能识别函数 E2(); void //功能识别函数 T(); void //功能识别函数 T2();

c语言函数

用递归法将一个正整数n的各个数字分别输出int f(int num) { int x; if(num==0) return 0; else{ x=num%10;

f(num/10); } 穷举实例 int main() { int n=1,m,sum,i; while(1) { m=n; sum=0; for(i=1;i<8;i++) { m=m*2; sum=m+sum; } sum=sum+n; if(sum==765) { cout<<"fist"<

break; } n++; } return 0; } 宏定义可以定义函数例如交换函数swap #Define swap(a,b){int c;c=a;a=b;b=c;} 简单结构体成员号码姓名 #include "StdAfx.h" #include"stdio.h" #include"string.h"

#include"iostream" using namespace std; struct student { int num; char name[50]; struct student *next; }; struct student *creat(int n) { int i; struct student *head,*p1,*p2; int num1; char name1[50]; head=NULL; for(i=n;i>0;--i) { p1=(struct student* )malloc(sizeof(struct student)); cout<<"输入编号";

二叉树遍历C语言递归非递归六种算法

二叉树遍历C语言(递归-非递归)六种算法

————————————————————————————————作者:————————————————————————————————日期:

数据结构(双语) ——项目文档报告用两种方式实现表达式自动计算 专业: 班级: 指导教师: 姓名: 学号:

目录 一、设计思想 (01) 二、算法流程图 (02) 三、源代码 (04) 四、运行结果 (11) 五、遇到的问题及解决 (11) 六、心得体会 (12)

一、设计思想 二叉树的遍历分为三种方式,分别是先序遍历,中序遍历和后序遍历。先序遍历实现的顺序是:根左右,中序遍历实现的是:左根右,后续遍历实现的是:左右根。根据不同的算法分,又分为递归遍历和非递归遍历。 递归算法: 1.先序遍历:先序遍历就是首先判断根结点是否为空,为空则停止遍历,不为空则将左子作为新的根结点重新进行上述判断,左子遍历结束后,再将右子作为根结点判断,直至结束。到达每一个结点时,打印该结点数据,即得先序遍历结果。 2.中序遍历:中序遍历是首先判断该结点是否为空,为空则结束,不为空则将左子作为根结点再进行判断,打印左子,然后打印二叉树的根结点,最后再将右子作为参数进行判断,打印右子,直至结束。 3.后续遍历:指针到达一个结点时,判断该结点是否为空,为空则停止遍历,不为空则将左子作为新的结点参数进行判断,打印左子。左子判断完成后,将右子作为结点参数传入判断,打印右子。左右子判断完成后打印根结点。 非递归算法: 1.先序遍历:首先建立一个栈,当指针到达根结点时,打印根结点,判断根结点是否有左子和右子。有左子和右子的话就打印左子同时将右子入栈,将左子作为新的根结点进行判断,方法同上。若当前结点没有左子,则直接将右子打印,同时将右子作为新的根结点判断。若当前结点没有右子,则打印左子,同时将左子作为新的根结点判断。若当前结点既没有左子也没有右子,则当前结点为叶子结点,此时将从栈中出栈一个元素,作为当前的根结点,打印结点元素,同时将当前结点同样按上述方法判断,依次进行。直至当前结点的左右子都为空,且栈为空时,遍历结束。 2.中序遍历:首先建立一个栈,定义一个常量flag(flag为0或者1),用flag记录结点的左子是否去过,没有去过为0,去过为1,默认为0.首先将指针指向根结点,将根结点入栈,然后将指针指向左子,左子作为新的结点,将新结点入栈,然后再将指针指向当前结点的左子,直至左子为空,则指针返回,flag置1,出栈一个元素,作为当前结点,打印该结点,然后判断flag,flag为1则将指针指向当前结点右子,将右子作为新的结点,结点入栈,再次进行上面的判断,直至当前结点右子也为空,则再出栈一个元素作为当前结点,一直到结束,使得当前结点右子为空,且栈空,遍历结束。 3.后续遍历:首先建立两个栈,然后定义两个常量。第一个为status,取值为0,1,2.0代表左右子都没有去过,1代表去过左子,2,代表左右子都去过,默认为0。第二个常量为flag,取值为0或者1,0代表进左栈,1代表进右栈。初始时指针指向根结点,判断根结点是否有左子,有左子则,将根结点入左栈,status置0,flag置0,若没有左子则判断结点有没有右子,有右子就把结点入右栈,status置0,flag置1,若左右子都没有,则打印该结点,并将指针指向空,此时判断flag,若flag为0,则从左栈出栈一个元素作为当前结点,重新判断;若flag为1则从右栈出栈一个元素作为当前结点,重新判断左右子是否去过,若status 为1,则判断该结点有没有右子,若有右子,则将该结点入右栈,status置1,flag置1,若没有右子,则打印当前结点,并将指针置空,然后再次判断flag。若当前结点status为2,且栈为空,则遍历结束。若指针指向了左子,则将左子作为当前结点,判断其左右子情况,按上述方法处理,直至遍历结束。

C语言函数练习题及答案

C语言函数练习题及答案

1 【单选题】 在下列关于C函数定义的叙述中,正确的是? ?A、 函数可以嵌套定义,但不可以嵌套调用; ? ?B、 函数不可以嵌套定义,但可以嵌套调用; ? ?C、 函数不可以嵌套定义,也不可以嵌套调用; ? ?D、 函数可以嵌套定义,也可以嵌套调用; ? 我的答案:B得分:2.5分 2 【单选题】 下面函数调用语句含有实参的个数为? nc((exp1,exp2),(exp3,exp4,exp5));

?A、 1 ? ?B、 2 ? ?C、 4 ? ?D、 5 ? 我的答案:B得分:2.5分 3 【单选题】 C语言中函数返回值的类型是由以下哪个选项决定的? ?A、 函数定义时指定的类型; ? ?B、

return语句中的表达式类型; ? ?C、 调用该函数时的实参的数据类型; ? ?D、 形参的数据类型; ? 我的答案:A得分:2.5分 4 【单选题】 以下关于函数叙述中,错误的是? ?A、 函数未被调用时,系统将不为形参分配内存单元; ? ?B、 实参与形参的个数必须相等,且实参与形参的类型必须对应一致; ? ?C、 当形参是变量时,实参可以是常量、变量或表达式; ?

?D、 如函数调用时,实参与形参都为变量,则这两个变量不可能共享同一内存空间; ? 我的答案:B得分:2.5分 5 【单选题】 若函数调用时参数为基本数据类型的变量,以下叙述正确的是? ?A、 实参与其对应的形参共享内存存储单元; ? ?B、 只有当实参与其对应的形参同名时才共享内存存储单元; ? ?C、 实参与对应的形参分别占用不同的内存存储单元; ? ?D、 实参将数据传递给形参后,立即释放原先占用的内存存储单元; ? 我的答案:C得分:2.5分

C语言实验报告,含递归(带程序)

一、写一个函数int digit(int n,int k),它返回数n的从右边向左的第k个十进数字位值。例如,函数调用digit(1234,2)将返回值3。 二、写一个函数int isprime(int n),当n是质数时,函数返回非零值;当n是合数时,函数返回零值。 三、写一个函数reverse(char s[]),将字符串s[]中的字符存储位置颠倒后重新存于s[]中。试分别用递归和非递归两种形式编写。 四、写一个主函数输入测试数据(自己指定),并调用上述函数,检查函数功能的正确性。要求:把预备知识、步骤、程序框图、调试好的程序及存在的问题写在下面(不够可以附页)。 #include #include int digit(int n,int k); int isprime(int n); void reverse(char s[]); //非递归实现 void reverse1(char s[]); //递归实现 int digit(int n,int k) { int m1,m2,i; m1=n; m2=0; while(m1!=0) //统计n数字的位数 { m1=m1/10; m2=m2+1; } if(k<=0||k>m2) return 0; //不能正确截取 m1=n; for(i=1;in/2) return 1; else

C语言程序设计 递归调用的概念

7.3.1递归调用的概念 函数的递归调用指的是一个函数执行过程中出现了直接或间接调用函数本身的调用方式。如果直接调用函数本身称为直接递归;如果调用了另外一个函数,那个函数又调用该函数,则称为间接递归。 递归方法的基本思想是将一个问题向下分解具有同样解决方法但规模不断缩小的子问题,不断进行这样的分解,直到分解的子问题有一个已知解。下面通过一个例子来讲解递归的概念。 例如,某数列为k(n)的定义为: 1n=1 k(n)=2×k(n-1)n为偶数 3×k(n-1)n为奇数 求该数列的第四项k(4)。 从以上数列的定义来看,该数列的任何一项均受前一项的约束,在求解k(4)时,首先要求解k(3),要求解k(3)就必须先知道k(2)的值,k(2)的值取决于k(1)的值。由于k(1)的值是已知的,然后再由k(1)反推回去计算k(2),k(3),k(4),得到K(4)的值。求解过程可以用图7-2表示。 k(4)=k(3)×2 k(3)=k(2)×3 k(2)=k(1)×2 k(1)=1k(2)=1×2=2 k(3)=2×3=6 k(4)=6×2=12 图7-2回推和递推过程 从图7-2可以看出,求解过程分为两个阶段:第一阶段是“回推”,将第4个值表示为第3个值的函数,将第3个值表示为第2个值的函数,再回推到第1个,而k(1)是已知的,到达了递归的边界。第二阶段使用“递推”,从已知的第1个值推出第2个值,从第2个值推出第3个值,从第3个值就推出了第4个值。整个的回推和递推过程就称为递归过程。 可以用一个函数描述上面的递归过程: int k(int n)/*递归计算函数*/ { int m;/*m存放函数的返回值*/ if(n==1)m=1; else if(n%2==0)m=k(n-1)*2;/*调用自身,n为偶数*/ else m=k(n-1)*3;/*调用自身,n为奇数*/ return(m);

C语言函数定义、调用,递归函数

C语言程序设计实验报告 实验5 函数程序设计 班级学号姓名 一、实验目的 (1)掌握C语言函数定义及调用的规则; (2)掌握递归函数的编写方法和运行过程; (3)理解变量的作用域和生存期。 二、补充知识: 怎样模拟计算机“想”一个数呢?用随机函数rand() 产生[0,RAND_MAX] 之间的随机数magic = rand();RAND_MAX是在stdlib.h中定义,不大于双字节整数的最大值32767 ,所以使用前加 #include 产生[0,b-1] 之间的随机数 ◆magic = rand()%b; 产生[a,a+b-1] 之间的随机数 ◆magic = rand()%b + a; rand()产生的数据是一串伪随机序列,要实现真正的随机化,用srand()函数播种种子: ◆#include ◆srand(time(NULL)); ◆magic = rand() % 100 + 1; 二、实验内容及步骤 1、程序改错 输入已编好的源程序,源程序中包含有错误,先对源程序进行编译和连接,然后根据提示信息,修改程序中的错误,经过多次修改—编译—连接,直到编译、连接成功。最后运行程序,输出正确结果。 (1)下述程序中,函数FUN功能是:计算正整数NUM的各位上的数字之积。例如,若输入252,则输出应该是20;若输入202,则输出应该是0。 #include /*提示:有3处错误*/ #include long fun(num) {long k=1; do {k*=num%10; num\=10; }while (num) return k; } void main() {long n; scanf(“%ld”,&n); printf(“\n%ld\n”,fun(n)); }

相关主题
文本预览
相关文档 最新文档