高级语言课程设计报告
实习题目 |
第五次报告: 字符串 字符串的处理是常见竞赛编程题,做好这部分题目需要扎实的基础知识:字符串的概念,字符数组的理论,字符指针、字符串处理函数,以及良好的算法。红色内容是基础,建议基础不扎实的自行复习。字符串处理函数不限于教材讲述的内容,李文新书《程序设计导引及在线实践》1.17节是个很好的补充。多读经典字符串的程序可以开阔眼界,启发思路。书中题目4.3对于没有学过C++的同学可能看不懂函数模板sort,不必强求,依据其所要实现的功能自己打造一个C版本的函数不算给你出难题。 本章中为我们演示了很多函数的使用方式,请活学活用。 苏小红数本章扩充内容之一:const实属用处较少的繁琐语法,不必深究。除此以外的其他内容应该深入研究领会。 l 完成ACM俱乐部作业:2015cup实习5字符串中至少2道 l 描述你的算法,注释你的程序。 l 注意勿抄袭:全系统自动判定抄袭,一旦抄袭,0分。 |
一、实习目的:熟练掌握字符串的使用
二、针对你的每一道题目:
字符串后继:
1.算法描述。
没啥算法,就是用ASCII码,给最后的+1,遇到z就去掉。
2.你的代码及注释。
#include <stdio.h>
int main()
{
int a;
char s[100000];
scanf("%s",s);
for(a=0;s[a]<='z'&&s[a]>='a';a++); //将a拉到字符串末尾
a--;
for(;s[a]=='z';a--)
{
s[a]='\0'; //如果是z就消掉
}
s[a]=s[a]+1; //给最后一位+1
printf("%s",s);
}
3. 设计及调试过程遇到的问题及解决方案。
完全没问题。
- 心得体会和自我对程序的评价。
很简单的题目,只是练手用的。没什么好评价的。
字符串反转:
1.算法描述。
先把第一个单词反转,之后每遇到一个空格反转一次。
2.你的代码及注释。
#include <stdio.h>
#include <string.h>
int main()
{
int a,b,c,i;
char s[10000],q[10000];
scanf("%d",&i);
getchar();
while(i)
{
memset(s,0,10000);
memset(q,0,10000);
gets(s);
for(a=0;s[a]!=' ';a++); //把a拉到第一个空格前一个处
for(c=0;s[c]!=' ';c++,a--) //c在空格上了,
{
q[c]=s[a-1]; //换位置
}
while(s[c]!='\0') //c往后走到最后停
{
if(s[c]==' ') //遇到空格
{
q[c]=s[c]; //把空格粘上
for(b=c+1;s[b+1]!=' '&&s[b+1]!='\0';b++); //把b送到下一个空格
for(c=c+1;s[b]!=' ';b--,c++) //b到上一个空格,c到下一个空格
{
q[c]=s[b];
}
}
}
q[c]='\0'; //结束按个\0
printf("%s\n",q);
i--;
};
return 0;
}
3. 设计及调试过程遇到的问题及解决方案。
acm总说我运行错误,不知道为啥,最后也没改,用别人的代码进去了,这个就放这吧。
4.心得体会和自我对程序的评价。
感觉以前编过的程序不能扔啊,还是有用的,这个程序不知道有没有以前编的好,忘记了,总之算法都是能行的就看能不能快一点了。
破译邮件:
1.算法描述。
同样是做过的题,就是用switch去替换每个字。
2.你的代码及注释。
#include <stdio.h>
#define n 10000
int main()
{
int a,b;
char s[n];
scanf("%d",&a); //测试次数
getchar(); //吸收回车
do
{
scanf("%s",s); //输入字符串
for(b=0;s[b]!='\0';b++) //逐个检查
{
if(s[b]=='#') //#变空格
printf(" ");
else if(s[b]=='-') //忽略-
continue;
else
switch(s[b]) //若是数字看选项,一目了然不做注释
{
case '1':{switch(s[b+1])
{
case '0':{printf("J");b++;break;}
case '1':{printf("K");b++;break;}
case '2':{printf("L");b++;break;}
case '3':{printf("M");b++;break;}
case '4':{printf("N");b++;break;}
case '5':{printf("O");b++;break;}
case '6':{printf("P");b++;break;}
case '7':{printf("Q");b++;break;}
case '8':{printf("R");b++;break;}
case '9':{printf("S");b++;break;}
case '-':{printf("A");break;}
case '#':{printf("A");break;}
case '\0':{printf("A");break;}
}break;
}
case '2':{switch(s[b+1])
{
case '0':{printf("T");b++;break;}
case '1':{printf("U");b++;break;}
case '2':{printf("V");b++;break;}
case '3':{printf("W");b++;break;}
case '4':{printf("X");b++;break;}
case '5':{printf("Y");b++;break;}
case '6':{printf("Z");b++;break;}
case '-':{printf("B");break;}
case '#':{printf("B");break;}
case '\0':{printf("B");break;}
}break;
}
case '3':{printf("C");break;}
case '4':{printf("D");break;}
case '5':{printf("E");break;}
case '6':{printf("F");break;}
case '7':{printf("G");break;}
case '8':{printf("H");break;}
case '9':{printf("I");break;}
}
}
printf("\n"); //换行
a--;
}while(a);
return 0;
}
3. 设计及调试过程遇到的问题及解决方案。
NO PROBLEM
4.心得体会和自我对程序的评价。
也就那么回事,毕竟做过,就当复习了。
定位符:
1.算法描述。
从//开始,到/或:为止输出中间的。
2.你的代码及注释。
#include <stdio.h>
#include <string.h>
#define n 10000
int main()
{
int c,b;
char s[n];
while(scanf("%s",s)!=EOF)
{
for(b=0;s[b]!='\0';b++) //浏览
{
if(s[b]=='/'&&s[b+1]=='/') //两个斜杠 开始
{
for(c=b+2;s[c]!='/'&&s[c]!=':';c++) //斜杠或者冒号停止
{
printf("%c",s[c]); //输出
}
printf("\n");
}
}
memset(s,0,10000);
};
}
3. 设计及调试过程遇到的问题及解决方案。
就是那个冒号我不知道也是停止符,费了点时间,其他没了。
4.心得体会和自我对程序的评价。
没什么体会,比较简单。程序就那样吧。