Nwafu-OJ-1507 Problem 阶段2考试题目4 手机按键

问题 : 阶段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;
}

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值