鱼C论坛

 找回密码
 立即注册
查看: 159|回复: 9

[已解决]C语言排序求助

[复制链接]
发表于 2024-3-21 17:34:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
#include<math.h>


int InsertSort(int A[],int n)
{
        int i,j;
        for(i=2; i<=n; i++)
        {
                if(A[i]<A[i-1])
                {
                        A[0]=A[i];
                        for(j=i-1;A[0]<A[j];--j)
                        A[j+1]=A[j];
                }
                A[j+1]=A[0];
        }
        printf("%d\n",A[i]);
       
        return 0;
}

int main()
{
        int n=20;
        int A[20]={2,1,23,12,10,3,4,56,45,100,21,13,14};
        int InsertSort(int A[20],int n);
       
        return 0;
}
最佳答案
2024-3-21 17:34:35
看起来你的代码写的有一些问题。首先,函数参数应该是一个数组,而不是一个整数,所以你的函数应该是这样定义的:

  1. int InsertSort(int A[], int n)
复制代码


另外,在循环内部对数组进行排序时,应该从数组的第一个元素开始,而不是第二个元素,所以循环应该改成这样:

  1. for(i=1; i<n; i++)
复制代码


最后,在插入排序算法中,需要将当前要排序的元素和已经排好序的元素依次比较,如果当前元素的值比已排序元素的值小,就将已排序元素后移一位,直到找到合适的位置。然后将当前元素插入到找到的位置。

以下是修改后的完整代码:

  1. #include <stdio.h>

  2. void InsertSort(int A[], int n)
  3. {
  4.     int i, j, temp;
  5.     for(i = 1; i < n; i++)
  6.     {
  7.         temp = A[i];
  8.         j = i - 1;
  9.         while(j >= 0 && A[j] > temp)
  10.         {
  11.             A[j+1] = A[j];
  12.             j--;
  13.         }
  14.         A[j+1] = temp;
  15.     }
  16. }

  17. int main()
  18. {
  19.     int A[] = {5, 2, 4, 6, 1, 3};
  20.     int n = sizeof(A) / sizeof(A[0]);
  21.    
  22.     InsertSort(A, n);
  23.    
  24.     for(int i = 0; i < n; i++)
  25.     {
  26.         printf("%d ", A[i]);
  27.     }
  28.    
  29.     return 0;
  30. }
复制代码


这个代码会将数组中的元素按从小到大的顺序排序,并打印出来。希望对你有帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-21 17:34:35 | 显示全部楼层    本楼为最佳答案   
看起来你的代码写的有一些问题。首先,函数参数应该是一个数组,而不是一个整数,所以你的函数应该是这样定义的:

  1. int InsertSort(int A[], int n)
复制代码


另外,在循环内部对数组进行排序时,应该从数组的第一个元素开始,而不是第二个元素,所以循环应该改成这样:

  1. for(i=1; i<n; i++)
复制代码


最后,在插入排序算法中,需要将当前要排序的元素和已经排好序的元素依次比较,如果当前元素的值比已排序元素的值小,就将已排序元素后移一位,直到找到合适的位置。然后将当前元素插入到找到的位置。

以下是修改后的完整代码:

  1. #include <stdio.h>

  2. void InsertSort(int A[], int n)
  3. {
  4.     int i, j, temp;
  5.     for(i = 1; i < n; i++)
  6.     {
  7.         temp = A[i];
  8.         j = i - 1;
  9.         while(j >= 0 && A[j] > temp)
  10.         {
  11.             A[j+1] = A[j];
  12.             j--;
  13.         }
  14.         A[j+1] = temp;
  15.     }
  16. }

  17. int main()
  18. {
  19.     int A[] = {5, 2, 4, 6, 1, 3};
  20.     int n = sizeof(A) / sizeof(A[0]);
  21.    
  22.     InsertSort(A, n);
  23.    
  24.     for(int i = 0; i < n; i++)
  25.     {
  26.         printf("%d ", A[i]);
  27.     }
  28.    
  29.     return 0;
  30. }
复制代码


这个代码会将数组中的元素按从小到大的顺序排序,并打印出来。希望对你有帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-4 20:19:46 | 显示全部楼层
#include <stdio.h>
#include <math.h>

int main()
{
        char a[10];
        int i,ch1=0,ch2=0;
       
        printf("请输入待转换的字符串:\n");
       
        for(i=0 ; i<=9; i++){
                scanf("%c",&a[i]);
            if( (a[i]< 'A' && a[i]>'Z' ) && (a[i]< 'a' && a[i]>'z' ) ){
                ch1 = i;
                }break;       
        }
        for(i=0 ; i<=9 && i>=ch1; i++){
        if( (a[i]>='A'&& a[i]<='Z' ) && (a[i]>='a' && a[i]<='z')){
                        ch2 = i - 1;
            }
        else
            ch2 = 9;
        break;
    }
        for(i=0 ; i<=ch2 && i>=ch1 ; i++){
                printf("%d %d",a[i]);
    }
    return 0;        
}
求助问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-4 20:19:57 | 显示全部楼层
王泽元 发表于 2024-04-04 20:19
#include
#include

int main()
{
        char a;
         ...


你的代码中存在一些问题,我来帮你修正一下。

首先,你应该用`scanf`函数来获取用户输入的字符串,而不是直接使用一个字符变量。因为需要转换的字符串可能不止一个字符,所以需要使用一个字符数组来存储。

其次,在循环中判断字符是否为字母时,你使用了逻辑运算符错误,应该使用逻辑或(`||`)运算符而不是逻辑与(`&&`)运算符。逻辑或的意思是两个条件中只要有一个满足即可。

最后,在循环中,你使用了两个变量`ch1`和`ch2`来记录大写字母和小写字母的出现次数,但是没有对它们进行累加操作,你需要将`ch1++`和`ch2++`添加到相应的位置。

下面是完整修正后的代码:

  1. #include <stdio.h>

  2. int main() {
  3.     char str[100];
  4.     int ch1 = 0, ch2 = 0;

  5.     printf("请输入待转换的字符串:\n");
  6.     scanf("%s", str);

  7.     for (int i = 0; str[i] != '\0'; i++) {
  8.         if ((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z')) {
  9.             if (str[i] >= 'A' && str[i] <= 'Z') {
  10.                 ch1++;
  11.             } else {
  12.                 ch2++;
  13.             }
  14.         } else {
  15.             break;
  16.         }
  17.     }

  18.     printf("大写字母出现的次数:%d\n", ch1);
  19.     printf("小写字母出现的次数:%d\n", ch2);

  20.     return 0;
  21. }
复制代码


这段代码会获取用户输入的字符串,并统计其中大写字母和小写字母的出现次数。最后打印出统计结果。

希望对你有帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-4 20:25:33 | 显示全部楼层
FishC 发表于 2024-4-4 20:19
你的代码中存在一些问题,我来帮你修正一下。

首先,你应该用`scanf`函数来获取用户输入的字符串, ...

要从字符串中挑选出一组连续数字并输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-4 20:26:00 | 显示全部楼层
王泽元 发表于 2024-04-04 20:25
要从字符串中挑选出一组连续数字并输出


如果你想从字符串中挑选出一组连续的数字并输出,你可以使用以下方法:

1. 遍历整个字符串,判断每个字符是否为数字。
2. 如果当前字符是数字,则将其添加到一个临时字符串中。
3. 如果当前字符不是数字,且临时字符串不为空,则将临时字符串输出,并清空它。
4. 最后,检查一下临时字符串是否非空,如果非空,则将其输出。

下面是一个示例代码:

  1. #include <stdio.h>

  2. void printContinuousDigits(char* str) {
  3.     char temp[100];   // 临时字符串,用于存储连续的数字
  4.     int index = 0;    // 临时字符串的索引

  5.     for (int i = 0; str[i] != '\0'; i++) {
  6.         if (str[i] >= '0' && str[i] <= '9') {
  7.             temp[index++] = str[i];
  8.         } else {
  9.             if (index > 0) {
  10.                 temp[index] = '\0';   // 在临时字符串末尾加上结束符
  11.                 printf("%s\n", temp);
  12.                 index = 0;   // 清空临时字符串
  13.             }
  14.         }
  15.     }

  16.     if (index > 0) {
  17.         temp[index] = '\0';
  18.         printf("%s\n", temp);
  19.     }
  20. }

  21. int main() {
  22.     char str[] = "abc123def456ghi";
  23.     printContinuousDigits(str);

  24.     return 0;
  25. }
复制代码


上述代码将会输出:
  1. 123
  2. 456
复制代码


希望对你有帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-4 20:30:10 | 显示全部楼层
FishC 发表于 2024-4-4 20:26
如果你想从字符串中挑选出一组连续的数字并输出,你可以使用以下方法:

1. 遍历整个字符串,判断每 ...

只输出123不输出456
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-4 20:30:31 | 显示全部楼层
王泽元 发表于 2024-04-04 20:30
只输出123不输出456


如果你只想输出字符串中的第一个连续数字序列,并且忽略后面的连续数字序列,你可以稍微修改一下代码逻辑。在发现第一个连续数字序列后,输出并结束循环即可。下面是修改后的代码示例:

  1. #include <stdio.h>

  2. void printContinuousDigits(char* str) {
  3.     char temp[100];   // 临时数组,用于存储连续的数字
  4.     int index = 0;    // 临时数组的索引
  5.     int foundContinuous = 0;  // 是否已经找到第一个连续数字序列
  6.    
  7.     for (int i = 0; str[i] != '\0'; i++) {
  8.         if (str[i] >= '0' && str[i] <= '9') {
  9.             if (!foundContinuous) {
  10.                 foundContinuous = 1;
  11.             }
  12.             temp[index++] = str[i];
  13.         } else {
  14.             if (foundContinuous) {
  15.                 temp[index] = '\0'; // 在临时数组末尾加上结束符
  16.                 printf("%s\n", temp);
  17.                 break;  // 找到第一个连续数字序列后,结束循环
  18.             }
  19.         }
  20.     }
  21. }

  22. int main() {
  23.     char str[] = "abc123def456ghi";
  24.     printContinuousDigits(str);
  25.     return 0;
  26. }
复制代码


这样,上述代码将会输出:123

希望对你有帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-4-4 20:38:20 | 显示全部楼层
FishC 发表于 2024-4-4 20:26
如果你想从字符串中挑选出一组连续的数字并输出,你可以使用以下方法:

1. 遍历整个字符串,判断每 ...

要求只输出第一串连续数字后面的数字不再输入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-4 20:38:56 | 显示全部楼层
王泽元 发表于 2024-04-04 20:38
要求只输出第一串连续数字后面的数字不再输入


明白了,你想要从字符串中找到第一个连续的数字串,并且只输出该数字串后面的字符。你可以使用以下方法来实现:

  1. #include <stdio.h>

  2. void printContinuousDigits(char* str) {
  3.     int index = -1;  // 记录连续数字串的起始索引
  4.     int i = 0;
  5.     while (str[i] != '\0') {
  6.         if (str[i] >= '0' && str[i] <= '9') {
  7.             if (index == -1) {
  8.                 index = i;  // 找到了连续数字串的起始索引
  9.             }
  10.         } else {
  11.             if (index != -1) {
  12.                 break;  // 遇到非数字字符,且已经找到了连续数字串,则跳出循环
  13.             }
  14.         }
  15.         i++;
  16.     }

  17.     if (index != -1) {
  18.         printf("%s\n", &str[index]);
  19.     }
  20. }

  21. int main() {
  22.     char str[] = "abc123def456ghi";
  23.     printContinuousDigits(str);
  24.     return 0;
  25. }
复制代码


上述代码将会输出:123def456ghi

希望对你有帮助!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 07:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表