• 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. 在本地调试时,可使用的参考输入文件请从这里下载。

    代码实现

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. #include
    4. int ReadLine(char* s, FILE* fp, int n) {
    5. int i = 0;
    6. int ch = 0;
    7. if (s == NULL || fp == NULL || n < 1) {
    8. return 0;
    9. }
    10. else
    11. {
    12. rewind(fp);
    13. while (n != 1 && ch != EOF)
    14. {
    15. ch = fgetc(fp);
    16. if (ch == '\n') {
    17. n--;
    18. }
    19. }
    20. while ((ch = fgetc(fp)) != EOF && ch != '\n' && i < 200)
    21. {
    22. if (ch >= 'a' && ch <= 'z' || ch == ' ') {
    23. s[i++] = ch;
    24. }
    25. }
    26. s[i] = '\0';
    27. return i;
    28. }
    29. return 0;
    30. }
    31. int CountLine(FILE* fp, int n) {
    32. int alpha[26] = { 1,2,3,1,2,3, 1,2,3,
    33. 1,2,3, 1,2,3, 1,2,3, 4,1,2,3, 1,2,3, 4 };
    34. char str[200] = { '\0'};
    35. int len, i, keys = 0;
    36. if (fp == NULL || n < 1) {
    37. return 0;
    38. }
    39. else
    40. {
    41. ReadLine(str, fp, n);
    42. len = strlen(str);
    43. if (len == 0) {
    44. return 0;
    45. }
    46. i = 0;
    47. while (i
    48. {
    49. if (str[i] >= 'a' && str[i] <= 'z') {
    50. keys += alpha[str[i] - 'a'];
    51. }
    52. else
    53. {
    54. keys++;
    55. }
    56. i++;
    57. }
    58. return keys;
    59. }
    60. return 0;
    61. }
    62. int main() {
    63. FILE* fp = NULL;
    64. int a, b, i;
    65. fp = fopen("test.dic", "r");
    66. if (fp == NULL) {
    67. puts("Cannot Open Input File.\n");
    68. return -1;
    69. }
    70. else
    71. {
    72. scanf("%d%d", &a, &b);
    73. i = a;
    74. while (i <= b) {
    75. printf("%d\n", CountLine(fp, i));
    76. i++;
    77. }
    78. fclose(fp);
    79. }
    80. return 0;
    81. }

  • 相关阅读:
    【前端】Vue+Element UI案例:通用后台管理系统-代码总结
    (标签-yolo|关键词-上标)
    【初阶】C语言指针详解——指针必备的7大知识点
    python示例
    2023 百度之星(夏日漫步 + 跑步问题)
    华为手机adbshell卸载不需要的系统应用
    依赖注入(六)
    [经验] 两头都是平的电池怎么分正负极 #微信#媒体
    WEB跨平台桌面程序构建工具对比(Electron、Tauri、Wails)
    智慧公厕整体解决方案,厕所革命实施方案的范本
  • 原文地址:https://blog.csdn.net/qq_53436105/article/details/128089745