用系列相关操作完成一个任务: 1、完成 数组 Data[] 和Str[] 的声明; 2、对数组 Data[] 设计函数,实现指定数目元素个数(可由用户指定元素个数)的输入和 不指定元素个数(整数元素的个数不确定)的输入完成数组的初始化。 3、对数组Str ,设计函数,分别用scanf 和 gets 的方法完成字符串的输入,输入字符串包括空格。 4、对 Data 整型数组查找最大值(最小值);输出最大值及所在下标。 5、输出 Data 整型数组; 6、使用排序算法对 Data 实现至少一种方案的排序;(冒泡法、选择法、从小到大、从大到小) 7、对比排序后的Data 整型数组; 8、键盘输入查找元素:(二分法),查到,输出元素所在下标,并删除元素;否则,输出查找失败!,并将元素插入到合适位置,并保持数组有序。 9、对比查找操作后的数组; 10、判断Str 是否为回文,如果不是,就地转置字符串。
时间: 2024-02-09 13:10:00 浏览: 81
好的,以下是代码实现:
```c
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100
int Data[MAX_SIZE];
char Str[MAX_SIZE];
int input_data() {
int n;
printf("请输入整数元素个数:");
scanf("%d", &n);
printf("请输入 %d 个整数:", n);
for (int i = 0; i < n; i++) {
scanf("%d", &Data[i]);
}
return n;
}
void input_data_unspecified() {
printf("请输入整数元素,以 -1 结束:");
int i = 0, x;
while (scanf("%d", &x) == 1 && x != -1) {
Data[i++] = x;
}
}
void input_str() {
printf("请输入一个字符串(包括空格):");
fflush(stdin);
gets(Str);
}
void print_data(int n) {
printf("Data 数组为:");
for (int i = 0; i < n; i++) {
printf("%d ", Data[i]);
}
printf("\n");
}
void find_max(int n) {
int max = Data[0], max_index = 0;
for (int i = 1; i < n; i++) {
if (Data[i] > max) {
max = Data[i];
max_index = i;
}
}
printf("最大值为 %d,所在下标为 %d\n", max, max_index);
}
void bubble_sort(int n) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (Data[j] > Data[j + 1]) {
int temp = Data[j];
Data[j] = Data[j + 1];
Data[j + 1] = temp;
}
}
}
}
void selection_sort(int n) {
for (int i = 0; i < n - 1; i++) {
int min_index = i;
for (int j = i + 1; j < n; j++) {
if (Data[j] < Data[min_index]) {
min_index = j;
}
}
int temp = Data[i];
Data[i] = Data[min_index];
Data[min_index] = temp;
}
}
void sort_data(int n) {
int choice;
printf("请选择排序方法:\n");
printf("1. 冒泡排序(从小到大)\n");
printf("2. 冒泡排序(从大到小)\n");
printf("3. 选择排序(从小到大)\n");
printf("4. 选择排序(从大到小)\n");
printf("请输入数字选择:");
scanf("%d", &choice);
switch (choice) {
case 1:
bubble_sort(n);
break;
case 2:
bubble_sort(n);
for (int i = 0; i < n / 2; i++) {
int temp = Data[i];
Data[i] = Data[n - i - 1];
Data[n - i - 1] = temp;
}
break;
case 3:
selection_sort(n);
break;
case 4:
selection_sort(n);
for (int i = 0; i < n / 2; i++) {
int temp = Data[i];
Data[i] = Data[n - i - 1];
Data[n - i - 1] = temp;
}
break;
default:
printf("输入不合法!\n");
break;
}
}
int binary_search(int n, int x) {
int left = 0, right = n - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (Data[mid] == x) {
return mid;
} else if (Data[mid] < x) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
void search_data(int n) {
int x;
printf("请输入要查找的整数:");
scanf("%d", &x);
int index = binary_search(n, x);
if (index != -1) {
printf("元素 %d 在数组中的下标为 %d,将被删除!\n", x, index);
for (int i = index; i < n - 1; i++) {
Data[i] = Data[i + 1];
}
n--;
} else {
printf("查找失败!将 %d 插入到合适位置...\n", x);
int i;
for (i = n - 1; i >= 0 && Data[i] > x; i--) {
Data[i + 1] = Data[i];
}
Data[i + 1] = x;
n++;
}
print_data(n);
}
void reverse_str() {
int len = strlen(Str);
int left = 0, right = len - 1;
while (left < right) {
char temp = Str[left];
Str[left] = Str[right];
Str[right] = temp;
left++;
right--;
}
}
int is_palindrome() {
int len = strlen(Str);
for (int i = 0; i < len / 2; i++) {
if (Str[i] != Str[len - i - 1]) {
return 0;
}
}
return 1;
}
int main() {
int n;
n = input_data();
input_data_unspecified();
input_str();
print_data(n + strlen(Str));
find_max(n + strlen(Str));
sort_data(n + strlen(Str));
print_data(n + strlen(Str));
search_data(n + strlen(Str));
printf("字符串为:%s\n", Str);
if (!is_palindrome()) {
printf("字符串不是回文,将字符串就地转置...\n");
reverse_str();
printf("转置后的字符串为:%s\n", Str);
} else {
printf("字符串是回文!\n");
}
return 0;
}
```
注意:在函数 `input_data_unspecified()` 中,我们使用了 `scanf("%d", &x) == 1` 的写法,表示只要输入的是一个整数,就会返回 1,即使输入的整数是负数。这样可以保证只有输入 -1 时才退出循环。另外,我们在调用 `gets()` 函数之前加了一个 `fflush(stdin)`,这是因为 `gets()` 函数会读取缓冲区中的换行符,导致输入不完整,所以需要清空缓冲区。但是,这种写法并不是标准的,因为 `fflush()` 函数在标准输入流上的行为是未定义的,因此不同的编译器可能有不同的行为。
阅读全文