问题 : 阶段2考试题目4 手机按键
时间限制: 1 Sec 内存限制: 128 MB
提交: 4617 解决: 874
[提交][状态][讨论版]
题目描述
老式的智能手机的键盘一般是这样的:
要按出英文字母就必须要按数字键多下。例如要按出x就得按9两下,第一下会出w,而第二下会把w变成x。0键按一下会出一个空格。你的任务是从指定文件中读取指定行只包含英文小写字母和空格的句子,计算要在手机上打出这个句子至少需要按多少下键盘。
请完成函数: int CountLine(FILE *fp, int n);
函数说明:从fp文件中读入第n行句子(文件从第1行开始算起,不是从第0行开始计算),每个句子只包含英文小写字母和空格,注意过滤大写字母、数字、符号、\n、\t等其他字符,每行不超过200个字符。返回按键次数。若指定行不存在或文件读取错误,函数返回0。
如文件中读到的文本串为:i have a dream, 则函数返回23。
提示
1. 参考流程图如下(建议图片右键另存到本地,在本地放大查看),但也可以不按该流程编写代码。
2. 请按照要求编写指定函数,允许新增函数。
3. 在本地调试时需要自行编写main()函数及其他辅助函数,但不能提交,否则可能会导致函数重定义编译错误。
4. 在本地调试时,可使用的参考输入文件请从这里下载。
代码实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int ReadLine(char* s, FILE* fp, int n) {
int i = 0;
int ch = 0;
if (s == NULL || fp == NULL || n < 1) {
return 0;
}
else
{
rewind(fp);
while (n != 1 && ch != EOF)
{
ch = fgetc(fp);
if (ch == '\n') {
n--;
}
}
while ((ch = fgetc(fp)) != EOF && ch != '\n' && i < 200)
{
if (ch >= 'a' && ch <= 'z' || ch == ' ') {
s[i++] = ch;
}
}
s[i] = '\0';
return i;
}
return 0;
}
int CountLine(FILE* fp, int n) {
int alpha[26] = { 1,2,3,1,2,3, 1,2,3,
1,2,3, 1,2,3, 1,2,3, 4,1,2,3, 1,2,3, 4 };
char str[200] = { '\0'};
int len, i, keys = 0;
if (fp == NULL || n < 1) {
return 0;
}
else
{
ReadLine(str, fp, n);
len = strlen(str);
if (len == 0) {
return 0;
}
i = 0;
while (i<len)
{
if (str[i] >= 'a' && str[i] <= 'z') {
keys += alpha[str[i] - 'a'];
}
else
{
keys++;
}
i++;
}
return keys;
}
return 0;
}
int main() {
FILE* fp = NULL;
int a, b, i;
fp = fopen("test.dic", "r");
if (fp == NULL) {
puts("Cannot Open Input File.\n");
return -1;
}
else
{
scanf("%d%d", &a, &b);
i = a;
while (i <= b) {
printf("%d\n", CountLine(fp, i));
i++;
}
fclose(fp);
}
return 0;
}