您好,欢迎来到好走旅游网。
搜索
您的当前位置:首页西安交大C++程序设计第四章作业2

西安交大C++程序设计第四章作业2

来源:好走旅游网
西安交通大学实验报告

课程 计算机程序设计

系 别__ 专业班级__ 姓 名_

_

实验名称 结构体 第1页共29页

_____ 实 验 日 期2014 年4月26日

_ __组别 _______________ 实验报告日期2014 年4月27日

_ 报 告 退 发(订正、重做)

— 一一 学号_

同组人 ______________________________________ 教师审批签字

一、 实验目的

掌握结构体的使用方法,学会用结构体的方法定义变量并对变 量进行处理;掌握枚举法的使用方法。

二、 实验内容

(一)第一题:1、输入某小组5个人的姓名、性别、出生年份 等信息,统计男女人数以及1988年以后(含1988年)出生的人 数。

1. 源程序代码:

//输入某小组个人的姓名、性别、出生年份等信息,统计男女人数以及年以后(含

年)出生的人数。

#include

using namespacestd; struct xinxi {

char n ame[20]; char sex;

int year;

}; //定义结构体xinxi,包含名称(字符串)、性别(字符)、出生时间(整数) 三

个变量

int main() {

xi nxi cy[5]; int i,s=0,m=0; for (i=0;i<5;i++)

{

coutvv\"请输入第\"<>cy[i].name;

coutvv\"性别(男的输入b”女的输入g ”):\"; cin>>cy[i].sex;

coutvv\"出生年份:\"; cin>>cy[i].year;

}

coutvv\"您输入的是:\\n\";

for (i=0;iv5;i++) // 显示输入内容

coutvvcy[i].namevv \"\\" vvcy[i].sexvv \"\\" vvcy[i].yearvvendl; for (i=0;iv5;i++) // 统计男女、之后个数

{

if (cy[i].sex== 'b' )

s++;

if (cy[i].year>=1988)

m++;

}

coutvv\"其中男生人数为:\"wsvCt女生人数为:\"vv5-svvendl; coutvv \"1988年以后(含)出生的的人数为:\"vvmvve ndl; return 0;

}

2. 实验结果:

OS C:W^in dows\\syrtenn32\\cmd1exe

谆触八弟丄个咸员的信息: \" 常曹寿r” •女的输入b

______________________

11?

豈赣人兼个成员的信息, 姓名r的输入F ■女的输人b

Ji: 1^V6

Ejj

请筮人第H个成员的信息’

性别隅的输入 f 以的输入《>=» 出生年俶1996

髄入聲4个成员的信息=

性勃隅的输入m的输u吉 岀生年册:1988 请锁人鄴个成员的信息. 姓名:xiaoli

性臥男的输入计•女的输人=\";a 出生孝粉.198? 您输八崗杲:

brd b cs j b d3j b

1??^ 199ft

xlaoning xiaoli A

其中塁吿△数知 19 9&

a 丄

LW毗年以后(含988 1908 )岀生 请1987 按任意霾继I- - 3 - ■

姓各dzj

3•问题分析:略。

(二)第二题: 读入五个用户的姓名和电话号码,按照姓名的字典 顺序排列后,输出用户的姓名和电话号码。

1.源程序代码:

//读入五个用户的姓名和电话号码,按照姓名的字典顺序排列后,输出用户的姓 名

和电话号码。

#include #inelude using namespacestd; struct dia nhuabu {

char n ame[30];

char nu m[15];

}; //定义结构体dianhuabu,包含两个变量:名字和电话号码。由于电话号码较 长

又无需对其进行具体处理,故定义为字符串型

int main()

dianhuabu dhb[5]; // 声明 dianhuabu 型变量 int i;

for (i=0;i<5;i++)

{

coutvv\"请输入第\"<>dhb[i].name; cout<<\" 电话号码: \"; cin>>dhb[i].num;

}

coutvv\"您输入的信息如下:\\n\";

for (i=0;i<5;i++) // 显示输入信息

{

coutvvdhb[i].namevv \"\\" vvdhb[i].numvv \"\\n\" ;

}

int k=i;

for (int j=i+1;jv5;j++)

if (strcmp(dhb[j].name,dhb[k].name)<0)

for (i=0;iv5;i++) // 排序

{

// 用库函数 strcmp 比较

字符串大小

k=j;

if (k!=i)

{

dianhuabu tmp=*(dhb+i); // 定义dianhuabu 型变量 tmp乍为中间变

量,进行交换

*(dhb+i)=*(dhb+k); *(dhb+k)=tmp;

}

}

coutvv\"排序结果如下:\\n\";

for (i=0;iv5;i++) coutvvdhb[i].namevv \"\\" vvdhb[i].numvvendl; // 输出排序后结果 return 0;

}

2. 实验结果:

1)随机输入名称:

39

匚i^wi nd ow5\\5ysterTi 32\\cmd ^exe

口 | 回

请输入第1个用户的信息:姓名:ewrthr 电话号码:346768 请输入第2个用户的信息:姓名:bhnjt 电话号码:4356 \" = 请输入第3个用户的信息:姓名:nghjhtm 电话号码;23476 请输入第4个用户的信見:姓名;bfgdnhg 电话号码:32457 请输久第5个用户的信息:姓名:bghg.j 电话号码】3245637 您输入的信息如下: ewrthr 346768 bhnjt 435(5 nghjhtm 23476 bfgdnhg 32457 bghgj 3245637 排序结果如下: bfgdnhg 32457 bghgj 3245637 bhnjt 4356 ewrthr 346768 nghjhtm 23476 请按任意键继续. * | 町■ I ” ( 2)输入名称长度递增,后者包含前者,用来检验库函数 strcmp的 排序效果:

3B C:' /.indo^vs-^'. 5t#m32\\cmd

请输入第1个用户的信息:姓名:abcdef 电话号码< 46378798 请输入第2个用户的信息:姓名:abcdefg 电话号码書267 请输只第3个用户的信息:姓名:abcdefghi 电话号码:67 请输入第4个用户的信息:姓名:abcdefgh 电话号码’ 5676 请输入第3个用户的信息:姓名:abcde 电话号码二456768 您输入的信息如下; abcdef 46378798 abcdefg 267 abcdefghi 67 abcdefgh 5676 abcde 456768 排序结果如下: abcde 456768 abcdef 46378798 abcdefg 267 abcdefgh 5676 abcdefghi 67 请按任意键继续・・・. 4 1 rpi , 3•问题分析:略

(三)第三题:输入两个整型数组(假设数组的大小为 7)的各个元 素,输出不是两个数组共有元素,例如,输入 5,6,7,8,9,0,输出为 123,4,8,9,0. 1. 源程序代码:

// 输入两个整型数组(假设数组的大小为 7)的各个元素,输出不是两个数组共 有元

1,234,5,6,7和

素,

// 例如,输入 1,2,3,4,5,6,7 和5,6,7,8,9,0 ,输出为 1,2,3,4,8,9,0.

#include using namespacestd; int main()

{

int a[7],b[7],c[14]; int i,j,m=0;

cout«\"请输入数组a的每个元素:\\n\";

for (i=0;i<7;i++)

cin>>*(a+i);

cout«\"请输入数组b的每个元素:\\n\"; for (j=0;j<7;j++) cin>>*(b+j); for (i=0;i<7;i++)

{

j=0;

while (*(a+i)!=*(b+j)&&j<7) j++; if (j==7)

{

*(c+m)=*(a+i); m++;

}

}

j=0;

while (*(b+i)!=*(a+j)&&j<7) j++; if (j==7)

{

for (i=0;i<7;i++)

{

*(c+m)=*(b+i); m++;

}

}

cout<<\" 没有非共有元素! \\n\" ;

return 0; // 直接结束,不再进行以下内容

if (m==0)

{

}

cout«\"共有\"《mv<个非共有元素:\\n\"; int k;

for (k=0;k2. 实验结果:

(1)全不相同:

33 Ci\\wii nd 口诉叭 sy sts m3 2\\c mdl.we j II 叵 l|w| (2)部分相同:

1 2 3 4 5 6 7 □ 请输入数绘b的每个元素: 11 12 13 14 15 16 17 共有珂个非共有元素; 1 2 3 4 5 6 7 11 12 13 14 15 16 17 请按任意键继续・・.. * 1 in 1 p J 1 33 CiX^ind owi\\sy stemS 2Xc 请输入数组&的每个元素; 1 2 3 4 5 6 7 请输入数组b的每个元素: 1 2 3 4 8 9 0 共有6个非共有元素: 5 6 7 8 9 0请按任意键继续. * f ——一I (3)全相同:

f Ci\\wind 请输入数组a的每个兀素: 1 2 3 4 5 6 7 请输入数组b的每个元素: H 2 3 4 5 6 7 没有非共有元素! 请按任意键继续・•・■ 少 1 * I 3•问题分析:

* n 1_1 * 不足之处:

题目中说是数组大小为7,但第二个数组只有六个元素也进行了比较。 而我的作业中没有实现这一点,只能是 7个元素.

(四)实验题目四:

口袋中有红、黄、蓝、白、黑5种颜色的小球若干个,如果每次都从 口袋中取出3种不同颜色的小球,共有多少种组合?试打印出每种组 合的3种颜色,要求使用枚举类型来表示小球的颜色。

1.程序源代码

#include using namespace std;

enumColors{red,yellow,blue,white,black}; void ys( int i) {

switch (i) {

case red:

cout« \"red \"; break;

case yellow:

cout« \"yellow \"; break;

case blue:

cout« \"blue \"; break;

case white:

cout« \"white \"; break;

case black:

cout« \"black \"; break;

}

}

void main() {

int s=O,i,j,k;

for (i=red;i<=blue;i++)

for (j=1+i;jv=white;j++)

for (k=j+1;k<=black;k++) {

s++; ys(i); ys(j); ys(k); coutvvendl;

}

coutvv \"总共的组合数为:\"vvsvvendl;

}

2.实验结果

raw 匚A'Window red red red red red ystein^2\\cnn d.exe A yellow blue yellow 叶hitm yellow black blue white blue black □ red white black yellow blue white /elLow blue black yellow white black blue white black 总共的组含数10 请按任意犍纟瞬. 4 | ■ ■ ■ irr 3. 问题分析 : 此题中虽然定义了枚举类型, 然而实际过程中, 感觉并没有使用到枚 举,它的存在似乎没有意义,不知道是不是方法用错了。

五、第五题: 5 、编写函数,该函数实现任意一个正整数是否为完全 数。再编写函数输出完全数等于各因子之和的式子。最后找出 2~100000 之内所有完全数。所谓完全数是其各因子之和正好等于本 身的数,例如输出格式如下的完全数: 6=1+2+3,28=1+2+4+7+14。

#include using namespacestd;

void panduan( int i) // 自定义函数,用于判断 i 是不是完全数

{

int m,s=0;

int *num=new int [i]; // 动态分配数组空间,虽然仍然大于实际需要值,但 数

组大小基本上得到了控制

for (m=1;m<=i/2;m++)

{

if (i%m==0)

{

num[s]=m;

s++; //s 最终为因子个数

}

}

int sum=0; int n;

for (n=0;nsum=sum+num[n];//sum 最终为各因子之和 if (sum==i)

{

cout<cout<}

delete []num; // 释放数组空间

int main() {

int i;

cout«\"从2到的100000完全数如下:\\n\"; for (i=2;i<100000;i++)

pan dua n(i); return 0; }

2.实验结果:

3•问题分析:

在做这道题的过程中,起初出现了一个奇怪的现象:如果上限由 100000改为10000,则程序正常运行,但对于100000,会显示出现问 题:

S3 f:\\盯」5y^tp n $ Arrrd PXF

I Ll H 冃 I

6=B2+3 28=1+2+4+7+14 496=1+2+4+8+16+31+62+124+248 8128=1+2+4+8-16+32+^-127+2-508+1016+2032+40 This application has requested the Runtime to terminar Please contact the application' s support team for more 请按任意键继续.,. 后来检查不出问题时,发现了一直以来一个不良习惯: 不编写释放数 组空间的语句。试着加上这一语句之后再运行时, 发现程序能够正常 进行了,因而认为

应该是这句语句的作用,但并不知道具体的原因。

六、第六题: 6、(必做题)编写一个实现文章(即字符串)单词统 计功能的程序,要求:输入一系列英文单词字符串(即带空格的字符 串),单词间用空格隔开或逗号或句号隔开。请统计该字符串中单词 出现的频率, 并按词典顺序输出单词及其频率。 必须用结构体方法实 现。

1. 源程序代码:

#include #include using namespacestd; struct frequency

{

char word[20]; int n;

}danci[100]; // 定义结构体变量 danci ,它由单词及其频率两个量组成 struct w

{

char a[20];

}in[100]; // 定义了个元素的字符串组,用于储存输入的句子中的每个单词 int fre( char nu[],w in[], int mu)// 统计每个单词的频率函数

{

int i,pl=0;

for (i=0;i{

if (strcmp(nu,in[i].a)==0)

pl++;

}

return pl;

}

void main()

{

char article[501];

cout<< \"输入句子: \\n\" ; cin.get(article,500);

int l=strlen(article); // 取其长度,定义为整型数 l int i,j,k,m;

for (i=0,j=0;i的字符

{

char a=*(article+i); //a 定义为 article 第 i 个字符,

if ((a<= 'z' &&a>='a' )||(a<= 'Z' &&a>='A' )) // 判断若已经是字母了的

话 就进入循环记录接下来的单词内容,否则继续 i 增加直到走完非字母字符到达字 母

m=0; k=i; char b=*(article+k); while ((b<= 'z' &&b>='a' )||(b<= 'Z'

&&b>='A' )) // 当它是字母就循 环,若已经不是字母了,就跳出循环

{

{

in[j].a[m]=b;

k++; m++; b=*(article+k);

}; // 一直加直到遇到非字母字符时停止 in[j].a[m]= '\\0' ; // 这个

单词转录完了之后,将最后一个字符写为 ‘\\0' 以防乱码

j++; // 下一个单词的写入

i=k-1; //由于在小循环中k最后一次循环多加了一个,所以在这里扣

除,赋给 i,i 就不再执行单词的中间字母部分,只需对非字母部分判断直到遇到 下一个单词的开头字母

}

}// 至此,已记录所有单词到 in[].a 中。

int mu=j; //记录下单词数目,共有单词口个(注意到最后j加了) // 然后将每一个不同的单词储存在 danci[].word 里

int s=0;

for (i=0;i{

j=0;

while (jj++; if (j==i) {

strcpy(danci[s].word,in[i].a); s++;

}//至此将所有不同单词依次储存到了 danci.word中,s为不同单词个数

}

//然后排序 for (i=0;ik=i;

for (j=i+1;jif (strcmp(danci[j].word,danci[k].word)<0) k=j;

if (k!=i) {

freque ncy tmp=*(da nci+i); *(da nci+i)=*(da nci+k); *(da nci+k)=tmp; } } //

cout«\"统计结果为:\\n\";

for (i=0;idan ci[i]. n=fre(da nci[i].word,i n,mu);

cout«\"单词:\"<//

输出

} }

2.实验结果:

(1)按照题目要求的检验:

fsn r:\\vji nd 0虫W \"对a n ? TVrrr-d PVP

输入句子;

I7 and, vou, are, and, I, am, are? mavbe, you, and, I7 mavbe, are 统计结東为: ^ 单词:I频率:3

频辜1 频率3 频率3 频率2 顷率2

请按任意键继续・• * .

d p- y U m n r a o aaam y

3B C;\\wi ndtem3 2\\c md-exe

入斗绕・单计句单词电词结单词雀词勺单词词■词喻anO : eafeL n b b t ; d y o a s Ftsn aoh rhe wh ........... d, yes, probably.

频率频率频率频率频率频率频率1 1 1 1 1 1 1

<

(2) 事实上,由于审题失误,我所编写的这个程序,能够对一切情 况进行处理(个人认为这个程序能够实现题目的要求,所以不能算 错),单词之间可以有多个非字母字符,可以有空格,开头也可以有 各种字符,唯一不足的是无法将The和the识别为同一单词:

S3 CAwndoiAis\\5yi5tern>321,icrnclKexe

LEICBJI

sgb sgb bgf

输入句子;

!bs sgb sfg sgb 频统计结果为:

bgf 单词; 单词 bs 单词 单词sfg

频率频率频率率 b sg请按任意键继续.

输入句子豈

\"Enjoy our short life:\"HE said, with a 』已吐hough he is only twwenty-th\"己

ye e cured and there is little timE left and the gently blowing yind everyday world for a longer time.

统计结果为:

But 频率:1 Enjoy 频率:1 He 频率:1 I频率:2 We 频率:1 a频率:2 accept 频率:1 all 频率:2 although 频率:1 am 频率:1 司and 频率:2 司be 频率:1

birds 频率:1 可blowing 频率:1 司can 频率:1 司频率:1 司complex

司cured 频率:1 司desires 频率:1 diaease 频率:1

3•问题分析:这道题较难,再加上审题的失误导致我在这道题上做了 更多的工作。可能办法有点笨,但没有深入思考,所以最终程序较为 麻烦。从我最终编写的程序来看,能够实现对各种输入情况下单词数 的统计,实现这一功能主要问题在以下几点:

首先说明程序的思路: 输入一个含有各种字符的字符串, 然后将其中的每一

个单词依次挑选 出来同时将其储存在用结构体定义好的 一组字符串 中;然后将这些单 词中不同的单词挑出来存到另一二元结构体 {单词,频率} 的每一项的 “单词”元素中;然后对二元结构体根据“单词”元素进行排序;然 后根据每个“单词”元素在原来储存的所有单词中的出现次数得到 频率并且同时将频率值保存到“频率”元素中并输出。

(1)单词的分离过程,这应该是其中几乎最麻烦的过程。由于要将 每个单词识别出来, 分开并且储存下来所以要定义一系列的字符串用 于存储每个单词,为此定义了结构体:

struct w

{

char a[20];

}in[100];

然后需要判断单词。从第一个字符开始,遇到字母后开始将原字 符串的字符录入到单词字符串, 遇到不是字母的字符时停止, 给末尾 加上' 0'后这一单词的录入便完成, 然后从这个非字母字符开始在 往下判断,遇到下一个字母也就是下一个单词的首字母时子进行下一 个单词的录入,直到完成所有录入。

完成以上工作之后,为了进行下一步的统计频率,还需要将其中 不同的单词挑出来然后存储到二元结构体的 如下操作:

Word元素中,为此进行

从第一个单词开始, 逐个判断它是不是与前面所有单词都不相同, 若是,则将其存储下来,否则不存储。为此用了库函数 strcmp 进行 两个字符串之间的比较。

(2) 排序:这一环节比较简单,完全可以仿照作业第二题的方法;

(3) 频率统计:将存储下来的不同单词依次在所有单词中找出与之 相同的个数即可, 由于之前已经完成, 故可以在记录频率同时输出结 果。

(4) 不足:用到库函数 strcmp 时,程序有警告,但可以运行,至于 警告的原因,尚不清楚。

(七)第七题: 7 、(必做题)任意输入一个正整数,统计输出各个 数位上数字出现的次数。例如输入 312366060,输出 0为2;1为1; 2为 1;3 为 2;6为 3。

1.源程序代码:

#include using namespacestd; struct frequency

{

int m;// 数字 int n; // 频率

}; int main()

{

int x; // 输入的数

cout<< \"请输入整数: \"; cin>>x;

int a,i,j,k,s=x; //s 初始为输入值,后逐渐缩小,用于求解位数;

a得到的

是位数

for (a=0;s>0;a++) s=s/10; int *num=new int [a]; for (i=0,s=x;i*(num+i)=s%10; s=s/10;

}

frequency fre[10]; for (j=0;j<=9;j++)

{

k=0;

for (i=0;i<=a;i++)

{

if (j==num[i])

k++;

}

fre[j].n=k; fre[j].m=j;

}

cout<< \"统计结果如下: \\n\" ; for (j=0;j<10;j++)

{

if (fre[j].n!=0) cout<}

return 0;

}

2. 实验结果: (1)开头不是 0:

SB C;\\wi nd ow^Xsysterni 2\\c mdl.exe

请输入W: 2323235 统计结果如下:

6 1 请按任意键继续.

(2)开头是0,由于是输入正整数,所以开头的 0不考虑:

Cs\\^ind cm

叭5■泸怙 m3 2\\c 叩dl,e2 II G

请输入整数;01245155 统计结果如下; 1 2 2 1 4 1 5 3

请按任意键继续・・・

3•问题分析: 思路:

(1) 求出整数位数,以便动态分配数组空间; (2) 依次分离出每一位的数存储下来; (3) 从0到9逐个统计个数;

(4) 对于个数为0的不输出,大于0的输出统计结果

八、第八题:& (选作题)第一将整数翻译程序中翻译千位整数的函 数直接屏幕输出英文改为形成翻译字符串返回给主调函数;

第二将子

串个数统计程序改为使用库函数 strncmp() 来实现。 1. 源程序代码: (1)

#include #include using namespacestd; static char *gewei[]=

{

Illi

J

\"one \" , \"two \" , \"three \" , \"four \" , \"five \" ,

\"six \" , \"seven \" , \"eight \" , \"nine \" , \"ten \" , \"eleven \" , \"twelve \" ,

\"thirteen \" , \"fourteen \" , \"fifteen \" , \"sixteen \" ,

T.. \"seventeen \" , \"eighteen \" , \"nineteen \"

};

static char *shiwei[]=

{

Illi J Illi

J

\"twenty \" , \"thirty \" , \"forty \" , \"fifty \" , \"sixty \" ,

\"seventy \" , \"eighty \" , \"ninety \"

};

char *m( int a)

{

int b = a % 100;

char output[50] = \"\" ;

if (a / 100 != 0) { strcat(output,gewei[a/100]);

strcat(output, \"hundred \" ); if

(b!=0)

strcat(output, \"and \" );

} if (b < 20) strcat(output, gewei[b]);

else { strcat(output, shiwei[b/10]); if (b%10!=0) {

strcat(output, gewei[b%10]);

} } return output

; }

void main()

{

int n;

char str[200] = \"\" ; cout<< \"请输入 n:\"; cin>>n;

int a=n/1000000,b=(n%1000000)/1000,c=n%1000; if (a!=0) { strcat(str, m(a)); strcat(str, \"million \" ); } if (b!=0)

{ strcat(str, m(b)); strcat(str, \"thousand \" ); } if (c!=0)

{ if (c<100)

strcat(str, \"and \");

strcat(str, m(c));

} cout << str << en dl;

}

(2)

#include using namespacestd;

int count( char *pi, char *pj) {

int num=0; char *pt=pi;

int pjn=strlen(pj);

while ( *pt!= '\\0' && strlen(pt) >= pjn) {

if (strncmp(pt, pj, pjn) == 0)

nu m++; pt++;

}

return num; }

void main() {

char *pa= \"ganggugangguganggangangang:*pb= \"gan\"; cout << \"母串:\"<< pa << endl;

cout << \"子串:\"<< pb << endl; cout << \"子串个数:\"<< coun t(pa,pb) << en dl; }

2.实验结果: (1)

(2)

SB C:\\window叭秽Wm32\\cmd・5u 1 口 II w ll^^l 母串:ganggugangguganggangangang 子串;gan 子串个数:6 请按任意键继续・・・ □ < L 一 皿 ― 」 □

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- haog.cn 版权所有 赣ICP备2024042798号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务