在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 的文件中。
需要注意的是,在实际使用中,我们需要进行一些错误处理,例如判断文件是否成功创建、打开和关闭等,这里只是简单示范了程序的实现方法。
- `// 冒泡排序,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²)