《南开三级网络技术100题题型整理总结》
作者:茅于轼【完结】
茅于轼,1929年出生于南京,著名经济学家。中国最有影响的经济学家之一,是中国民间经济学者的重要代表。1993年从中国社会科学院退休。
100题题型
茅于轼事件真相揭秘
100题题型
类型一:英文文章字母ASCII值变换
替代关系:f(p)=p*11 mod 256,同时限定部分替换条件。
一 例题:题目96:函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS8.DAT中。
替代关系:f(p)=p*11 mod 256 ,p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果原字符是小写字母或计算后f(p)值小于等于32,则该字符不变,否则将f(p)所对应的字符进行替代。
注意:部分源程序已给出。原始数据文件存放的格式是:每行的宽度均小于80个字符。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
------------------------------
void encryptChar() 定义函数encryptchar()
{int i,j,t; 定义i,j,t
for(i=0;i<maxline;i++) 行数i循环
{for(j=0;j<strlen(xx[i]);j++) 列数j循环
{t=xx[i][j]*11%256; 替换ASCII值
if(t<=32 || (xx[i][j]>='a' && xx[i][j]<='z')) continue; 替换后处理continue
xx[i][j]=t;}}
}
※内嵌的for函数来表达行列:
for(i=0;i<maxline;i++)
{for(j=0;j<strlen(xx[i]);j++)
……}
※用if表达额外条件
※利用continue函数跳过改轮循环后面的语句,而继续进入下一次循环;
比较:break语句则跳过剩下的语句,而且跳出循环;
二 变形题目
(4)题目36:函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS6.DAT中。
替代关系:f(p)=p*11 mod 256 (p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果计算后f(p)值小于等于32或f(p)对应的字符是数字0至9,则该字符不变,否则将f(p)所对应的字符进行替代。
注意:部分源程序已给出。原始数据文件存放的格式是:每行的宽度均小于80个字符。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
------------------------------
void encryptChar()
{int i,j,t;
for (i=0;i<maxline;i++)
{for(j=0;j< strlen(xx[i];j++)
{t=xx[i][j]*11%256;
if (t<=32 || (t>='0' && t<= '9')) continue;
xx[i][j]=t;}}
}
(8)题目95:函数ReadDat()实现从文件ENG.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS4.DAT中。
替代关系:f(p)=p*13 mod 256 (p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果计算后f(p)值小于等于32或其ASCII值是偶数,则该字符不变,否则将f(p)所对应的字符进行替代。
注意:部分源程序已给出。原始数据文件存放的格式是:每行的宽度均小于80个字符。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
------------------------------
void encryptChar()
{int i,j,t;
for(i=0;i<maxline;i++)
{for(j=0;j<strlen(xx[i]);j++)
{t=xx[i][j]*11%256;
if(t<=32 ||( xx[i][j]%2==0)) continue;
xx[i][j]=t;}}
}
类型二: 英文文章以行为单位进行字符变化
一 例题:题目73:函数ReadDat( )实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中; 请编制函数ConvertCharD(), 其函数的功能是: 以行为单位把字符串中的所有小写字母改写成该字母的上一个字母, 如果是字母a, 则改写成字母z,大写字母和其它字符保持不变。把已处理的字符串仍按行重新存入字符串数组xx中。最后main()函数调用函数WriteDat()把结果xx输出到文件OUT4.DAT中。原始数据文件存放的格式是: 每行的宽度均小于80个字符, 含标点符号和空格。
注意: 部分源程序存放在PROG1.C中。
请勿改动主函数main( )、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
-----------------
类型:字符串(单词)的倒置和删除。
答案:
void ConvertCharD(void)
{ int i,j;
char c;
for(i=0;i<maxline;i++) 千万注意,此时用<,而不是<=,因为是从0开始数的
{ for(j=0;j<strlen(xx[i]);j++) 一定要注意变量的真实位置
if(xx[i][j]=='a') 我们通常写的xx[i][j]是ASCII值,与‘a’对应。
xx[i][j]='z';
else
if(xx[i][j]>='b'&&xx[i][j]<='z')
xx[i][j]--; } xx[i][j]—表示xx[i][j]-=1即xx[i][j]= xx[i][j]-1
}
用两个for函数表达行列:
for(i=0;i<maxline;i++)
{for(j=0;j<strlen(xx[i]);j++)}
二 变形
(1)题目63:下列程序的功能是:把S字符串中的所有字符左移一个位置,串中的第一个字符移到最后.请编写函数CHG(CHAR *S)实现程序要求,最后调用函数READWRITEDAT()把结果输出到OUT.DAT文件中.
例如:S字符串中原有内容为:Mn.123xyZ,则调用函数后,结果为:n.123xyZM.
注意:部分源程序已给出。
请勿改动主函数main()和输出数据函数readwriteDat()的内容。
-----------------------
void chg(char *s)
{ int i;
char c;
c=s[0];
for(i=0;i<strlen(s)-1;i++)
s[i]=s[i+1];
s[strlen(s)-1]=c;
}
(2)题目11:下列程序的功能是:把s字符串中的所有字母改写成该字母的下一个字符,字母z改写成字母a。要求大写字母仍为大写字母,小写字母仍为小写字母,其他字符不做改变。请编写函数chg(char *s)实现程序的要求,最后调用函数readwriteDat()把结果输出到文件out.dat中。
例如:s字符串中原有的内容为:Mn.123Zxy,则调用该函数后,结果为No.123Ayz。
注意:部分源程序已给出。
请勿改动主函数main()和输出数据函数readwriteDat()的内容。
-----------------------
void chg(char *s)
{ int i,k;
k=strlen(s);
for(i=0;i<k;i++)
{ if(s[i]=='z'||s[i]=='Z')
s[i]-=25;
else
if(isalpha(s[i]))
s[i]++; }
}
(3)题目10:请编制函数ConvertCharA(), 其函数的功能是: 以行为单位把字符串中的所有小写字母改写成该字母的下一个字母, 如果是字母z, 则改写成字母a,大写字母和其它字符保持不变。把已处理的字符串仍按行重新存入字符串数组xx中。。最后main()函数调用函数WriteDat()把结果xx输出到文件OUT3.DAT中。
例: 原文: Adb.Bcdza
abck.LLhj
结果: Aec.Bdeab
bcdl.LLik
原始数据文件存放的格式是: 每行的宽度均小于80个字符, 含标点符号和空格。
注意: 部分源程序存放在PROG1.C中。
请勿改动主函数main( )、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
-----------------
类型:字符串(单词)的倒置和删除。
答案:
void ConvertCharA(void) /*标准答案*/
{int I,j,str;
for(I=0;I<maxline;I++)
{str =strlen(xx[I]);
for(j=0;j<str;j++)
if(xx[I][j]=='z')xx[I][j]='a';
else if(xx[I][j]>='a'&&xx[I][j]<='y') xx[I][j]+=1;
}
}
类型三 产品排列 按序号,按代码
一 例题 题目99:已知在文件IN.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)四部分组成。其中:金额=单价*数量计算得出。函数ReadDat()是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按金额从小到大进行排列, 若金额相等, 则按产品代码从小到大进行排列 最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT1.DAT中。
注意: 部分源程序存放在PROG1.C中。
请勿改动主函数main( )、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
----------------------------------
void SortDat() /*标准答案*/ 定义sortdat()
{int i,j; 定义i,j
PRO xy; ?????
for(i=0;i<99;i++) for循环各个产品
for(j=i+1;j<100;j++) for循环表达下一个产品
if(sell[i].je>sell[j].je) 比较je
{xy=sell[i];sell [i]=sell[j];sell[j]=xy;} 交换出较大的一个继续比较
else if(sell[i].je==sell[j].je) 如果相同
if(strcmp(sell[i].dm,sell[j].dm)>0) 比较dm
{xy=sell[i];sell[i]=sell[j];sell[j]=xy;} 交换出较大的一个继续比较
}
※表达行列
for(i=0;i<=99;i++)
for (j=i+1;j<=100;j++)
※用i,j=i+1,表达相邻的两个量
※排列的基本方法“如果”if(x[i]>x[j])
“交换”{t=x[j];x[j]=x[i];x[i]=t}
※字母顺序比较:strcmp( sell[i].dm,sell[j].dm)>0 大于0则表示sell[i].dm比sell[j].dm的ASCII值大
类型四 英文文章 按行 ASCII值 排列
一简单排列
例题 题目88:函数READDAT()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组XX中;请编制函数SORTCHARA(),其函数功能是:以行为单位对字符按从小到大的顺序进行排序,排序后的结果仍按行重新存入字符串数组XX中,最后调用函数WRITEDAT()把结果XX输出到文件OUT1.DAT .
例:原文:dAe,BfC.
CCbbAA
结果:,.ABCdef
AACCbb
原始数据文件存放的格式是: 每行的宽度均小于80个字符, 含标点符号和空格。
注意: 部分源程序存放在PROG1.C中。
请勿改动主函数main( )、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
-----------------
类型:字符串(单词)的倒置和删除。
答案:
void ConvertCharA(void)/*标准答案*/
{int I,j,k,strl;
char ch;
for(I=0;I<maxline;I++) 列
{strl=strlen(xx[I]);
for(j=0;j<strl-1;j++) 行 某个字母
for(k=j+1;k<strl;k++) 某个相邻字母
if(xx[I][j]>xx[I][k]) 按行对字母进行比较
{ch=xx[I][j]; xx[I][j]=xx[I][k];xx[I][k]=ch;} 交换排序
}
}
二 一分为二排列
例题 题目71:函数ReadDat()实现从文件in.dat中读取20行数据存放到字符串数组xx中(第行字符串长度均小于80)。请编制函数jsSort(),其函数的功能是:以行为单位对字符串按给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数WriteDat()把结果xx输出到文件out.dat中。
条件:从字符串中间一分为二,左边部分按字符的ASCII值降序排序,右边部分按字符的ASCII值升序排序。如果原字符串长度为奇数,则最中间的字符不参加排序,字符仍放在原位置上。
类型:字符串左右排序和比较。
注:要注意当要进行右半部分排序时,一定要判断原字符串个数是否为奇数,若是则要
half加1,本题对右半部分采用选择法对其进行升序排序。
void jsSort() /*标准答案*/
{int I,j,k,strl,half;
char ch;
for(I=0;I<20;I++) 按行
{strl=strlen(xx[I]);
half=strl/2; 定义half
for(j=0;j<half-1;j++) 左半部分进行排列
for(k=j+1;k<half;k++)
if (xx[I][j]<xx[I][k])
{ch=xx[I][j];xx[I][j]=xx[I][k];xx[I][k]=ch;}
if (strl%2) half++; 判断原字符串长度为奇为偶
for(j=half;j<strl-1;j++) 右半部分进行排列
for(k=j+1;k<strl;k++)
if (xx[I][j]>xx[I][k])
{ch=xx[I][j];xx[I][j]=xx[I][k];xx[I][k]=ch;}
}
}
变形(1)题目50:函数ReadDat()实现从文件in.dat中读取20行数据存放到字符串数组xx中(每行字符串长度均小于80)。请编制函数jsSort(),其函数的功能是:以行为单位对字符串按给定的条件进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数WriteDat()把结果xx输出到文件out.dat中。
条件:从字符串中间一分为二,左边部分按字符的ASCII值升序排序,排序后左边部分与右边部分进行交换。如果原字符串长度为奇数,则最中间的字符不参加处理,字符仍放在原位置上。
例如:位置 0 1 2 3 4 5 6 7 8
源字符串 d c b a h g f e
4 3 2 1 9 8 7 6 5
则处理后字符串 h g f e a b c d
8 7 6 5 9 1 2 3 4
部分源程序已给出。
请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。
----------------------------
类型:字符串左右排序和比较.
注:先采用冒泡法对左边部分进行升序排序,然后将排序后的左半与右半按对应位进行
调换。
void jsSort()
{int i,strl,half,j,k;
char ch; /*注意:用以交换的ch,必须是char型的!*/
for(i=0;i<20;i++) /*行循环*/
{strl=strlen(xx[i]); /*每行长度*/
half=strl/2;
for(j=0;j<half-1;j++) /*每行的第j个位置*/
for(k=j+1;k<half;k++)
if(xx[i][j]>xx[i][k])
{ch=xx[i][j];/*每次将最小数赋给xx[i][j]*/
xx[i][j]=xx[i][k]; xx[i][k]=ch;}
for(j=half-1,k=strl-1;j>=0;j--,k--)/*左右部分进行交换*/
{ch=xx[i][j];xx[i][j]=xx[i][k];xx[i][k]=ch;}
}
}
题43: 函数ReadDat()实现从文件in.dat中读取20行数据存放到字符串数组xx中(第行字符串长度均小于80)。请编制函数jsSort(),其函数的功能是:以行为单位对字符串变量的下标为奇数的字符按其ASCII值从小到大的顺序进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数WriteDat()把结果xx输出到文件out.dat中。
例如:位置 0 1 2 3 4 5 6 7
源字符串 h g f e d c b a
则处理后字符串 h a f c d e b g
部分源程序已给出。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
-------------------------
类型:字符串左右排序和比较。
void jsSort() /*标准答案*/
{int I,j,k,strl;
char ch;
for(I=0;I<20;I++)
{strl=strlen(xx[I]);
for(j=1;j<strl-2;j=j+2) /*下标从0,1,2…其中为奇数就是1,3…*/
for(k=j+2;k<strl;k=k+2) /*相邻的数就是j+2了*/
if (xx[I][j]>xx[I][k])
{ch=xx[I][j];xx[I][j]=xx[I][k];xx[I][k]=ch;}
}}
※ 下标为奇数的数据的表达
※ for(j=1;j<strl-2;j=j+2)
※ for (k=j+2;k<strl;k=k+2)
题目16:函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数StrCharJR(),其函数的功能是:以行为单位把字符串中所有字符的ASCII值右移4位,然后把右移后的字符ASCII值再加上原字符的ASCII值,得到新的字符仍存入原字符串对应的位置上。最后把已处理的字符串仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT8.DAT中。原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。
注意:部分源程序已给出。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。
-----------------------
void StrCharJR(void) /*标准答案*/
{int I,j,strl;
for(I=0;I<maxline;I++)
{strl=strlen(xx[I]);
for(j=0;j<strl;j++)
xx[I][j]+=xx[I][j]>>4;
}
}
注:这个编程题比二级考得还简单。
void StrCharJR(void)
{int i,j;
for(i=0;i<maxline;i++)
for(j=0;xx[i][j]!='\0';j++)
xx[i][j]+=xx[i][j]>>4;
}
题目17:函数READDAT()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组XX中;请编制函数CHA(),其函数功能是:以行为单位把字符串中的第一个字符的ASCII值加第二个字符的ASCII值,得到第一个亲朋字符,第二个字符的ASCII值加第三个字符的ASCII值,得到第二个新字符,依此类推一直处理到最后第二个字符,最后一个字符的ASCII值加原第一个字符的ASCII值,得到最后一个新的字符,得到的新字符分别存放在原字符串对应的位置上。最后把已处理的字符串逆转后按行重新存入字符串数组XX中,最后调用函数WRITEDAT()把结果XX输出到文件OUT9.DAT中.原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格.
注意:部分源程序已给出。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。
-----------------------
void ChA(void) /*标准答案*/
{int I,j,k,str;
char ch;
for(I=0;I<maxline;I++)
{str=strlen(xx[I]);
ch=xx[I][0];
for(j=0;j<str-1;j++)
xx[I][j]+=xx[I][j+1];
xx[I][str-1]+=ch;
for(j=0,k=str-1;j<str/2;j++,k--)/*逆转 对头调动*/
{ch=xx[I][j];xx[I][j]=xx[I][k];xx[I][k]=ch;}}
}
类型五 两百个数的简单计算
题目91:请编制程序,从文件in.dat中读取200个整数至数组xx中,求出奇数的个数cnt1和偶数的个数cnt2以及数组xx值为偶数的元素值的算术平均值pj(保留2位小数)。
结果cnt1,cnt2,pj输出到out.dat中。部分程序、读数据函数read_dat(int xx[200])及输出格式已给出。
--------------------
cnt1=0;cnt2=0;pj=0.0;
for(i=0;i<N;i++) 200个数据循环处理
if(xx[i]%2==1) cnt1++; %2为1即为奇数
else
{ cnt2++; pj+=xx[i]; } pj+=xx[i]求和的极好方法
pj/=cnt2;
题目92:请编制程序,从文件in.dat中读取200个整数至数组xx中,求出最大数max及最大数的个数cnt和数组xx中值能被3整除或能被7整除的算术平均值pj(保留2位小数)。结果cnt1,cnt2,pj输出到out.dat中。
部分程序、读数据函数read_dat(int xx[200])及输出格式已给出。
--------------------
max=xx[0]; /*求最大数的办法*/
for(I=1,k=0;I<N;I++)
{if (xx[I]>max) max=xx[I];
if (xx[I]%3==0||xx[I]%7==0)
{j+=xx[I];k++;}
}
for(I=0,cnt=0;I<N;I++)
if (xx[I]==max) cnt++;
pj=(float)(j*100/k)/100; /*保留两位小数的办法*/
※ 求最大数的办法:假定max=xx[0];然后逐个比较:比xx[0]大,就重新定义max即可。
※ 保留两位小数的办法:pj=(float)(j*100/k)/100
题目6:在文件in.dat中有200个正整数,且每个数均在1000至9999之间。函数ReadDat()读取这200个数存放到数组aa中。请编制函数jsSort(),其函数的功能是:要求按每个数的后三位的大小进行降序排列,然后取出满足此条件的前10个数依次存入数组b中,如果后三位的数值相等,则按原先的数值进行升序排列。最后调用函数WriteDat()把结果bb输出到文件out.dat中。
例:处理前 9012 5099 6012 7025 8088
处理后 5099 8088 7025 6012 9012
注意:部分源程序已给出。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
--------------------
void jsSort() /*标准答案*/
{int I,j,data;
for(I=0;I<199;I++)
for(j=I+1;j<200;j++)
{if (aa[I]%1000<aa[j]%1000) /*就是把后面的三位看成一个百位数来看,只需要%1000即可
{data=aa[I];aa[I]=aa[j];aa[j]=data;}
else if(aa[I]%1000==aa[j]%1000)
if(aa[I]>aa[j])
{data=aa[I];aa[I]=aa[j];aa[j]=data;}
}
for(I=0;I<10;I++)/*当排列完成以后,取其前十个即可 */
bb[I]=aa[I];
}
题目5(完全同上):
题目22:请编写函数countvalue(),它的功能是:求n以内(不包括n)同时能被3和7整数的所有自然数之和的平方根s,并作为函数值返回,最后结果s输出到文件out.dat中。
例如若n为1000时,函数值应为:s=153.909064。
注意:部分源程序已给出。
请勿改动主函数main()和输入输出数据函数progreadwrite()的内容。
----------------------------
double countvalue(int n)
{ int i,j=0;
double k;
for(i=0;i<n;i++)
if(i%3==0&&i%7==0)
j+=i;
k=sqrt(j);/*平方根的求法*/
return k; }
题目93请编制函数ReadDat()实现从文件IN.DAT中读取1000个十进制整数到数组xx中;再编制函数COMPUTE()分别计算出XX中奇数的个数ODD,偶数的个数EVEN,平均值AVER以及方差TOTFE的值,最后调用函数WriteDat()把结果输出到OUT.DAT文件中。计算方差的公式如下:totfc=1/N∑(xx[i]-ave1)2
设N为奇数的个数,xx[i]为奇数,ave1为奇数的平均值。
原始数据文件存放的格式是:每行存放10个数,并用逗号隔开。(每个数均大于0且小于等于2000)
注意:部分源程序已给出。
请勿改动主函数main()和输出数据函数writeDat()的内容。
------------------------------
void Compute(void)
{int I;
for(I=0;I<1000;I++)
{if(xx[I]%2) odd++; }/*表达偶数这样就可以了吗?*/
else {even++;
aver=aver+xx[I];}}/*要注意使用题目已知的变量,尽可能减少变量*/
aver/=even;
for(I=0;I<1000;I++)
totfc+=(xx[I]-aver)*(xx[I]-aver)/MAX;/*方差公式一直都没有看明白*/
}
totfc/=MAX;
}
题目23:已知在文件in.dat中存有N个(个数<200)四位数字的正整数,函数readdat()读取这N个正整数并存入数组xx中。请编制函数calvalue(),其功能要求:1、求出这N个实数的平均值aver;2、分别求出这N个实数的整数部分之和sumint以及小数部分之和sumdec,最后调用函数writedat()把所求的结果输出到文件out.dat中。
注意:部分源程序已给出。
请勿改动主函数main()、读数据函数readdat()和输出数据函数writedat()的内容。
----------------------------
void CalValue(void) /*标准答案*/
{int I;
double x,sum=0;/*到底什么时候用double噢?*/
for (I=0;I<MAXNUM;I++)
{sumint=sumint+(int)xx[I]; /*在前面补充类型(int)就可以表达整数部分了了*/
x=xx[I]-(int)xx[I]; /*小数部分=整体-整数部分*/
sumdec=sumdec+x;