大一程序上机,使用代码越简单越好

在main函数中创建一个文件,将键盘输入的字符串(该字符串只包含数字、字母和*)写入文件中。打开该文件,读出字符串。若字符串中号多于n个,则删除多余的号;若少于或等于n个,则输出*号的个数,并将新串存放到另一个文件中。要求:n由键盘输入

引用新必应

以下是一个简单的C程序示例,可以创建一个文件并将键盘输入的字符串写入该文件中,然后读取文件内容,并按照要求进行处理:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    int n;  // 定义变量 n
    printf("请输入 n 的值:");
    scanf("%d", &n);  // 接收用户输入 n 的值

    char str[1024];  // 定义字符串变量 str,最多存储 1024 个字符
    printf("请输入一个字符串:");
    scanf("%s", str);  // 接收用户输入的字符串

    FILE* fp;  // 定义文件指针
    fp = fopen("test.txt", "w");  // 创建一个名为 test.txt 的文件,并以写入模式打开
    if (fp == NULL) {  // 判断文件是否成功打开
        printf("文件创建失败\n");
        exit(1);  // 如果文件打开失败,直接退出程序
    }
    fprintf(fp, "%s", str);  // 将字符串写入文件
    fclose(fp);  // 关闭文件

    fp = fopen("test.txt", "r");  // 以读取模式打开文件
    if (fp == NULL) {  // 判断文件是否成功打开
        printf("文件打开失败\n");
        exit(1);  // 如果文件打开失败,直接退出程序
    }
    fseek(fp, 0, SEEK_END);  // 将文件指针移动到文件末尾
    int file_length = ftell(fp);  // 获取文件长度
    fseek(fp, 0, SEEK_SET);  // 将文件指针移回文件头

    char* file_content = (char*)malloc(file_length + 1);  // 根据文件长度动态分配内存
    fread(file_content, file_length, 1, fp);  // 读取文件内容到内存中
    fclose(fp);  // 关闭文件

    int asterisk_count = 0;  // 定义变量存储 * 号的个数
    char* new_str = (char*)malloc(file_length + 1);  // 根据文件长度动态分配内存
    int new_str_pos = 0;
    for (int i = 0; i < file_length; i++) {
        if (file_content[i] == '*') {
            asterisk_count++;
        }
        else {
            new_str[new_str_pos++] = file_content[i];
        }
    }
    new_str[new_str_pos] = '\0';  // 给新字符串末尾加上结束符

    if (strlen(new_str) > n) {  // 如果新字符串中字符多于 n 个
        int delete_count = strlen(new_str) - n;
        printf("删除了 %d 个 * 号\n", delete_count);
        for (int i = 0; i < delete_count; i++) {
            for (int j = strlen(new_str) - 1; j > 0; j--) {
                if (new_str[j] == '*') {
                    new_str[j] = '\0';
                    break;
                }
            }
        }
    }
    else if (strlen(new_str) <= n) {  // 如果新字符串中字符少于或等于 n 个
        printf("* 号的个数为 %d\n", asterisk_count);
        fp = fopen("new_test.txt", "w");  // 创建另一个名为 new_test.txt 的文件,并以写入模式打开
        fprintf(fp, "%s", new_str);  // 将新字符串写入新文件中
        fclose(fp);  // 关闭文件
    }

    free(file_content);  // 释放动态分配的内存
    free(new_str);

    return 0;
}

程序中首先接收用户输入的 n 值和字符串,然后创建一个名为 test.txt 的文件,并将字符串写入该文件中。接着以读取模式打开文件,并将文件内容读取到内存中。随后判断文件中 * 号的个数,并根据要求进行处理。如果新字符串中字符多于 n 个,则删除多余的 * 号;如果少于或等于 n 个,则输出 * 号的个数并将新字符串存入另一个名为 new_test.txt 的文件中。

需要注意的是,在实际使用中,我们需要进行一些错误处理,例如判断文件是否成功创建、打开和关闭等,这里只是简单示范了程序的实现方法。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/688201
  • 你也可以参考下这篇文章:模拟存取款-异常(根据输入的过程,判断账户是否有钱?(要求用异常做) 输入一个整数n,之后n行输入相应的金额,整数为存款,负数为取款,输出最终的余额,若某一过程余额为负,直接抛出异常,并显示余额不足)
  • 除此之外, 这篇博客: 图文详解 排序算法对比以及能解决的问题中的 冒泡排序只会操作相邻的两个数据,每次冒泡操作都会对相邻的两个元素进行比较,如果不满足就让它俩互换。一次冒泡会至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在这里插入图片描述

    • 可以看出,经过一次冒泡操作之后,6 这个元素已经存储在正确的,想要完成正确的的顺序,我们只需要进行6次这样的冒泡操作就可以了
    • 实际上,我们可以进行优化,如下,判断是否有数据交换,如果没有数据交换,说明以已经是有序的数据
      在这里插入图片描述
    • 代码如下
    - `// 冒泡排序,a 表示数组,n 表示数组大小
    public void bubbleSort(int[] a, int n) {
      if (n <= 1) return;
     
     for (int i = 0; i < n; ++i) {
        // 提前退出冒泡循环的标志位
        boolean flag = false;
        for (int j = 0; j < n - i - 1; ++j) {
          if (a[j] > a[j+1]) { // 交换
            int tmp = a[j];
            a[j] = a[j+1];
            a[j+1] = tmp;
            flag = true;  // 表示有数据交换      
          }
        }
        if (!flag) break;  // 没有数据交换,提前退出
      }
    }
    
    • 分析一下
    • 第一,冒泡排序是原地排序算法吗?

    冒泡的过程只涉及相邻数据的交换操作,只需要常量级的临时空间,所以它的空间复杂度为 O(1),是一个原地排序算法。

    • 第二,冒泡排序是稳定的排序算法吗?

    在冒泡排序中,只有交换才可以改变两个元素的前后顺序。为了保证冒泡排序算法的稳定性,当有相邻的两个元素大小相等的时候,我们不做交换,相同大小的数据在排序前后不会改变顺序,所以冒泡排序是稳定的排序算法。

    • 第三,冒泡排序的时间复杂度是多少?

    最好情况下,要排序的数据已经是有序的了,我们只需要进行一次冒泡操作,就可以结束了,所以最好情况时间复杂度是 O(n)。而最坏的情况是,要排序的数据刚好是倒序排列的,我们需要进行 n 次冒泡操作,所以最坏情况时间复杂度为o(n²)