CPrimerPlus第11章第10题
题目:
编写一个程序,读取输入,直到读入了10个字符串或遇到EOF,由二者中最先被满足的那个终止读取过程。这个程序可以为用户提供一个有5个选项的菜单:输出初始字符串列表、按ASCII顺序输出字符串、按长度递增顺序输出字符串、按字符串中第一个单词的长度输出字符串和退出。菜单可以循环,直到用户输入退出请求。当然,程序要能真正完成菜单中的各项功能。
1.先完成第一个部分,读入字符串。
打算使用指针数组来储存字符串们,先定义并初始化指针字符串(指针需要初始化,指针数组也是,担心成为野指针,所以刚开始全部指向NULL,发现后来就用不了,所以还是用malloc分配一下内存给指针吧)。
char *str[];
for(i=; i<; i++)
str[i] = (char *)malloc( * sizeof(char));
按要求读入字符串们,遇到EOF或者读入了10个字符串就停止读入。结果不行,因为函数gets(ptr)如果发现了EOF就返回NULL,不会把EOF读入并让指针ptr指向的(比方说我吩咐了gets()去读EOF符号,他碰到了EOF符号并没有读入,而是跑回来跟我说,臣妾做不到啊~)。
while(j< && (*str[j]!=EOF))
{
gets(str[j]);
j++;
}
所以修改while()中的判断条件,且修改后的while()条件中已经包含了gets()函数,每次判断时已经执行了一遍,所以下面循环中的gets()要删除,只留下j++就好了。
while( (j<) && (gets(str[j]) != NULL))//(*str[j]!=EOF)这个作为判断是不行滴
j++;
2.设计好主函数的思路,分析逻辑,编写主函数部分。主要就是用if和else的组合给选择分类,要注意选择超出选项范围的情况。代码如下
while (scanf("%c",&choice) == )
{
if(choice < 'a' || choice > 'e')
printf("choice must be between 'a' and 'e'\n");
if(choice == 'e')
exit();
else
{
if(choice == 'a')
print_orig(str);
if(choice == 'b')
print_as_ascii(str);
if(choice == 'c')
print_as_strlen(str);
if(choice == 'd')
print_as_1strlen(str);
}
getchar(); //清除enter键确认输入时带来的换行字符
puts("make your choice(a, b, c, d, e):");
print_table();
}
puts("fail reading the choice, good bye!"); return ;
}
3.分别编写各个子函数
3.0 打印表头,这个简单,就是printf函数即可
/*******************************打印表头***************************/
void print_table(void)
{
printf("a) print original text b) print lines in order of ASCII\n");
printf("c) print lines in order of strlen d) print lines in order of first word's len\n");
printf("e) exit\n");
}
3.1 打印原来的字符串们,由于刚开始就考虑使用指针数组,因此挨个指针进行打印就可以了(循环puts(str[i]几次即可))
/**************************打印原字符串们**************************/
void print_orig(char *str[])
{
int i;
for(i=; i<lines; i++)
puts(str[i]);
}
3.2 按照字符串ascii码大小来打印字符串们,需要对字符串们进行排序,本章讲解了选择排序的算法,在这里正好使用上,我之前的博客也提到了。代码如下,注意注释中的注意。不过经过排序后指针变换了指向的位置,所以执行完选择排序后再想打印出原字符串们,就不能用指针了。我能想到的办法就是再用一组指针,指向这些字符串们,变一组指针,不变另一组指针,打印原字符串们时就用不变的指针数组,选择排序时就用变得指针数组(时间原因自己没有弄了)。
/*********************按ascii码打印字符串们*************************/
void print_as_ascii(char *str[])
{
int i,j;
char * p_temp;
for(i=; i<lines; i++)
{
for(j=i+; j<lines; j++)
{
if(ascii_num(str[i]) > ascii_num(str[j])) //参考答案是用strcmp()函数来比较字符串的ascii码值大小的,我自己不嫌麻烦又写了个函数(其实是没想到,呜呜~~)
{
p_temp = str[i]; //比的是ascii_num(str[i])和ascii_num(str[j]),调换的是str[i]和str[j],这里有映射关系!!映射问题困扰了我半天
str[i] = str[j];
str[j] = p_temp;
}
}
}
print_orig(str);
}
3.3 按照字符串长度来输出字符串们,和上面的套路其实都一样了,只是比较时使用strlen()函数即可。代码如下
/**********************按字符串长度打印字符串们*********************/
void print_as_strlen(char *str[])
{
int i,j;
char * p_temp;
for(i=; i<lines; i++)
{
for(j=i+; j<lines; j++)
{
if(strlen(str[i]) > strlen(str[j]))
{
p_temp = str[i];
str[i] = str[j];
str[j] = p_temp;
}
}
}
print_orig(str);
}
3.4 按照字符串中第一个单词的长度来排序并输出字符串们,同上的套路,只是比较时比较首单词的长度而已。我没有仔细考虑具体情况,简单写了个函数(开头的就是空格的话就算0),当然考虑清楚写的缜密些最好了,只是这里我想自己毕竟出于练习的目的,不必花太多时间(其实也写了两三天了,呜呜~,心里烦他了~呜呜~)。
/********************按字符串中首个单词长度打印*********************/
void print_as_1strlen(char *str[])
{
int i,j;
char *p_temp;
for(i=; i<lines; i++)
{
for(j=i+; j<lines; j++)
{
if(first_len(str[i]) > first_len(str[j]))
{
p_temp = str[i];
str[i] = str[j];
str[j] = p_temp;
}
}
}
print_orig(str);
}
3.5 在3.2和3.4中自己有写两个简单的小程序,分别计算ascii码值和首单词长度,代码如下(随便写的,不缜密)
int ascii_num(char * p) //计算一个字符串的ascii码值
{
int i,asciinum = ;
for(i=; *(p+i)!='\0'; i++)
asciinum+=*(p+i);
return asciinum;
} int first_len(char *p) //计算一个字符串中首单词的长度
{
int i;
for(i=; *(p+i)!=' '; i++);
return i;
}
4.总结
参考答案中使用了二维数组和指针数组,把输入读入二维数组的指针,再用指针数组分别指向各个字符串,算是备份好了原文件,然后折腾指针也不怕损坏原文件的顺序什么的吧。这一点值得学习。参考答案中的选择排序在实现时基本与我的差不多;主函数中没有用if—else组合,而是用的switch—case组合;调用了库函数strcmp(),isalpha(),不浪费资源啊。
经过调试算是能完成任务了吧,但是问题还是有滴,所以我想还是在程序开头位置作好说明,毕竟如果再回头看时能方便回忆和理清思路,尤其是程序稍微有点复杂时(这是我自己编的比较长的程序了,可见自己有多水了。不过路漫漫其修远兮,自己慢慢努力慢慢完善自己吧,加油^_^)。
CPrimerPlus第11章第10题的更多相关文章
- Rspec: everyday-rspec实操: 第10章测试其他功能,第11章TDD 第12章总结。
10.测试文件上传 作者推荐的Paperclip,官方维护组已经不推荐使用deprecated. 推荐使用rails自带的 ActiveStorage. Active Storage: 推进文件上传到 ...
- 第11章 Windows线程池(1)_传统的Windows线程池
第11章 Windows线程池 11.1 传统的Windows线程池及API (1)线程池中的几种底层线程 ①可变数量的长任务线程:WT_EXECUTELONGFUNCTION ②Timer线程:调用 ...
- 高性能Linux服务器 第11章 构建高可用的LVS负载均衡集群
高性能Linux服务器 第11章 构建高可用的LVS负载均衡集群 libnet软件包<-依赖-heartbeat(包含ldirectord插件(需要perl-MailTools的rpm包)) l ...
- Linux就这个范儿 第11章 独霸网络的蜘蛛神功
Linux就这个范儿 第11章 独霸网络的蜘蛛神功 第11章 应用层 (Application):网络服务与最终用户的一个接口.协议有:HTTP FTP TFTP SMTP SNMP DNS表示层 ...
- 《学习OpenCV》练习题第四章第八题ab
这道题是利用OpenCV例子程序里自带的人脸检测程序,做点图像的复制操作以及alpha融合. 说明:人脸检测的程序我参照了网上现有的例子程序,没有用我用的OpenCV版本(2.4.5)的facedet ...
- 《学习OpenCV》练习题第四章第七题abc
题外话:一直是打算把这本书的全部课后编程题写完的,中间断了几个月,一直忙于其他事.现在开始补上. 这道题我不清楚我理解的题意是不是正确的,这道题可以练习用OpenCV实现透视变换(可以用于矫正在3维环 ...
- 锋利的jQuery第2版学习笔记8~11章
第8章,用jQuery打造个性网站 网站结构 文件结构 images文件夹用于存放将要用到的图片 styles文件夹用于存放CSS样式表,个人更倾向于使用CSS文件夹 scripts文件夹用于存放jQ ...
- 第11章 享元模式(Flyweight Pattern)
原文 第11章 享元模式(Flyweight Pattern) 概述: 面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是在某些情况下,对象的数量可能会太多,从而导致了运行时 ...
- 翻译连载 | 第 11 章:融会贯通 -《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...
随机推荐
- 常用jQuery 方法
//强制给数字补全小数点 function toDecimal2(x) { var f = parseFloat(x); if(isNaN(f)) { return false; } var f = ...
- windows server 2008 各版本号下载地址(微软官网)
前言: 微软官网上下载系统的镜像文件要远比百度网盘下载起来得更快. Windows Server 2008 32-bit Standard(标准版)
- IE兼容方法
其实我也觉得非常麻烦,开始的时候都用 _XXX:XXX; /* IE6支持 */ *XXX:XXX; /* IE6.IE7支持 */ *+XXX:XXX; /* IE7支持 */ XXX:XXX\9; ...
- form表单提交时,action怎么带参数
<html> <title>form</title> <script type="text/javascript"> functio ...
- 《黑客反汇编揭秘》(2e)推荐书单
Must-Read Books and Other References Books on C/C++: The C Programming Language by Brian W. Kernigha ...
- C#设计模式
自从上次记录完“重构之道”以后,查询设计模式挺麻烦的.就打算把原先写的设计模式系列合并一下. 设计原则 使用设计模式的根本原因就是适应需求变化,提高代码的复用率,使程序更具有扩展性和可维护性. SOL ...
- HDU 4081Qin Shi Huang's National Road System(次小生成树)
题目大意: 有n个城市,秦始皇要修用n-1条路把它们连起来,要求从任一点出发,都可以到达其它的任意点.秦始皇希望这所有n-1条路长度之和最短.然后徐福突然有冒出来,说是他有魔法,可以不用人力.财力就变 ...
- HTML DOM prompt() 方法
1. 定义和用法 prompt() 方法用于显示可提示用户进行输入的对话框. 语法 prompt(text,defaultText) 参数 描述 text 可选.要在对话框中显示的纯文本(而不是 HT ...
- 12月15日smarty模板基本语法
smarty基本语法: 1.注释:<{* this is a comment *}>,注意左右分隔符的写法,要和自己定义的一致. <{* I am a Smarty comment, ...
- 记一次WinForm中屏蔽空格键对按钮的作用
事件的起因是在做一个项目功能时,添加快捷键关闭声音,这个键最终选择了空格键,但是当按下空格键时,会把窗体中获取焦点的控件(比如按钮,文本框等)的单击事件触发,所以要屏蔽这个现象. 开始使用各种方法,在 ...