您好,欢迎访问三七文档
实验报告课程名称:程序设计与数据结构指导老师:刘济全成绩:实验名称:实验3实验类型:程序实验同组学生姓名:一、实验目的和要求(必填)三、主要仪器设备(必填)五、实验数据记录和处理七、讨论、心得二、实验内容和原理(必填)四、操作方法和实验步骤六、实验结果与分析(必填)一、实验目的和要求模拟采用占位符构造动态字符串的格式化方法构造一句话,其中包含不定数量的用{}括起来的数字,如{0}、{1}、{2},并提示用户输入字符串,并按顺序替换包括花括号在内的数字,从而构造出新的一句话,并打印输出,请编写算法实现。编程验证作业四中4.17、4.28的算法实现(可选)二、实验内容和原理掌握编程工具的使用掌握字符串数据结构在计算机上的实现掌握通过计算机编程解决问题的基本方法三、主要仪器设备实验软件:visualstudio2010四、操作方法和实验步骤实验代码如下:intparserToPositiveInteger(charstr[],unsignedinti,unsignedintj)专业:电仪1201姓名:陈俊杰学号:3120104046日期:4.3地点:东1b416装订线{if(!str||ij)return-1;while(i=j&&(str[i]==''||str[i]=='\t'))//去掉前面的空白字符i++;while(j=i&&(str[j]==''||str[j]=='\t'))//去掉后面的空白字符j--;if(ij)return-1;else{intk;for(k=i;k=j;k++)//检查是否全部数字字符if(!('0'=str[k]&&str[k]='9'))return-1;intn=0,p=1;for(k=j;k=i;k--){//字符串转换为数字n+=p*(str[k]-'0');p*=10;}returnn;}}//占位符structPlaceholder{//占位符编号unsignedintindex;//占位符起始位置unsignedintstart;//占位符结束位置unsignedintend;};/*采用占位符的动态字符串占位符是指字符串中用{}括起来,括号了里面包含【一个正整数及任意空白字符】的子字符串。如:{0},{100}都是合法的占位符。占位符中的正整数必须【从0开始,并且连续(建议,但是不强制)】。相同的占位符可以【出现多次】。如:hello{0},hello{1}.{1}hassendamailto{0}*/structDynamicString{//原字符串(可以包含多行)charsource[MAX_STRING_LENGTH];//占位符structPlaceholderplaceholders[MAX_PLACEHOLDER_AMOUNT];//占位符的总数unsignedintplaceholdersAmount;//替换占位符的具体内容charreplaceContent[MAX_PLACEHOLDER_AMOUNT][MAX_CONTENT_LENGTH];//替换后字符串chartarget[MAX_STRING_LENGTH];//替换标记charreplaceMark[MAX_STRING_LENGTH];};/*功能:初始化动态字符串参数:ds动态字符串返回:如果参数非法(比如有空指针):返回FALSE如果初始化成功:返回TRUE*/intinit(structDynamicString*ds){if(!ds)returnFALSE;unsignedinti,j;printf(输入一动态字符串:\n);gets(ds-source);/*****************寻找所有占位符*****************/ds-placeholdersAmount=0;for(i=0;ds-source[i];i++){if(ds-source[i]=='{'){//出现了占位符的开始标记//寻找占位符的结束标记j=i;while(ds-source[j]&&ds-source[j]!='}')j++;if(ds-source[j]=='}'){//出现了占位符的结束标记intn=parserToPositiveInteger(ds-source,i+1,j-1);if(n=0){//找到了一个合法的占位符ds-placeholders[ds-placeholdersAmount].index=n;ds-placeholders[ds-placeholdersAmount].start=i;ds-placeholders[ds-placeholdersAmount].end=j;ds-placeholdersAmount++;//跳过占位符i=j;}}else{break;}}}returnTRUE;}intcomparePlaceholderByIndex(constvoid*a,constvoid*b){return((structPlaceholder*)a)-index-((structPlaceholder*)b)-index;}intcomparePlaceholderByStart(constvoid*a,constvoid*b){return((structPlaceholder*)a)-start-((structPlaceholder*)b)-start;}/*功能:替换所有的占位符参数:ds动态字符串返回:参数非法(比如有空指针):返回-1替换成功:替换的占位符的个数(一个正数)。*/intreplaceAll(structDynamicString*ds){if(!ds)return-1;unsignedinti,j,k;unsignedintstart,end;;qsort(ds-placeholders,ds-placeholdersAmount,sizeof(ds-placeholders[0]),comparePlaceholderByIndex);for(i=0;ids-placeholdersAmount;i++){//输入替换内容if(i==0||ds-placeholders[i].index!=ds-placeholders[i-1].index){printf(输入第%3d个替换内容:,ds-placeholders[i].index);gets(ds-replaceContent[ds-placeholders[i].index]);}}qsort(ds-placeholders,ds-placeholdersAmount,sizeof(ds-placeholders[0]),comparePlaceholderByStart);for(i=0,k=0;i=ds-placeholdersAmount;i++){//开始替换start=i0?ds-placeholders[i-1].end+1:0;end=ids-placeholdersAmount?ds-placeholders[i].start-1:strlen(ds-source)-1;for(j=start;j=end;j++,k++){//源字符串中不用替换的部分ds-target[k]=ds-source[j];ds-replaceMark[k]='';}if(i==ds-placeholdersAmount)continue;char*content=ds-replaceContent[ds-placeholders[i].index];for(j=0;content[j];j++,k++){//占位符部分进行文本替换ds-target[k]=content[j];ds-replaceMark[k]='^';}}ds-target[k]='\0';ds-replaceMark[k++]='\0';returnds-placeholdersAmount;}/*功能:打印动态字符串参数:ds动态字符串doPrintMark是否打印出替换标记*/voidprintReplacedResult(conststructDynamicString*ds,intdoPrintMark){if(!ds)return;printf(%s\n,ds-target);if(doPrintMark)printf(%s\n,ds-replaceMark);}intmain(){structDynamicStringdynamicString;if(init(&dynamicString)){replaceAll(&dynamicString);printReplacedResult(&dynamicString,TRUE);//可以执行多次替换replaceAll(&dynamicString);printReplacedResult(&dynamicString,TRUE);}return0;}四、实验结果及分析程序运行结果如下:六:实验心得通过这次实验,我更加熟悉了vs软件的使用,加深的了对串的操作的理解。这次实验报告由于自己的原因没有在上传时间内上传,是拖延症的毛病在作祟,坚决不会再犯了。
本文标题:实验报告4
链接地址:https://www.777doc.com/doc-6879382 .html