鱼C论坛

 找回密码
 立即注册
查看: 519|回复: 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
看起来你的代码写的有一些问题。首先,函数参数应该是一个数组,而不是一个整数,所以你的函数应该是这样定义的:
int InsertSort(int A[], int n)

另外,在循环内部对数组进行排序时,应该从数组的第一个元素开始,而不是第二个元素,所以循环应该改成这样:
for(i=1; i<n; i++)

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

以下是修改后的完整代码:
#include <stdio.h>

void InsertSort(int A[], int n)
{
    int i, j, temp;
    for(i = 1; i < n; i++)
    {
        temp = A[i];
        j = i - 1;
        while(j >= 0 && A[j] > temp)
        {
            A[j+1] = A[j];
            j--;
        }
        A[j+1] = temp;
    }
}

int main()
{
    int A[] = {5, 2, 4, 6, 1, 3};
    int n = sizeof(A) / sizeof(A[0]);
    
    InsertSort(A, n);
    
    for(int i = 0; i < n; i++)
    {
        printf("%d ", A[i]);
    }
    
    return 0;
}

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

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

使用道具 举报

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

另外,在循环内部对数组进行排序时,应该从数组的第一个元素开始,而不是第二个元素,所以循环应该改成这样:
for(i=1; i<n; i++)

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

以下是修改后的完整代码:
#include <stdio.h>

void InsertSort(int A[], int n)
{
    int i, j, temp;
    for(i = 1; i < n; i++)
    {
        temp = A[i];
        j = i - 1;
        while(j >= 0 && A[j] > temp)
        {
            A[j+1] = A[j];
            j--;
        }
        A[j+1] = temp;
    }
}

int main()
{
    int A[] = {5, 2, 4, 6, 1, 3};
    int n = sizeof(A) / sizeof(A[0]);
    
    InsertSort(A, n);
    
    for(int i = 0; i < n; i++)
    {
        printf("%d ", A[i]);
    }
    
    return 0;
}

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

以上回复来自 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++`添加到相应的位置。

下面是完整修正后的代码:
#include <stdio.h>

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

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

    for (int i = 0; str[i] != '\0'; i++) {
        if ((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z')) {
            if (str[i] >= 'A' && str[i] <= 'Z') {
                ch1++;
            } else {
                ch2++;
            }
        } else {
            break;
        }
    }

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

    return 0;
}

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

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

以上回复来自 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. 最后,检查一下临时字符串是否非空,如果非空,则将其输出。

下面是一个示例代码:
#include <stdio.h>

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

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

    if (index > 0) {
        temp[index] = '\0';
        printf("%s\n", temp);
    }
}

int main() {
    char str[] = "abc123def456ghi";
    printContinuousDigits(str);

    return 0;
}

上述代码将会输出:
123
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


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

void printContinuousDigits(char* str) {
    char temp[100];   // 临时数组,用于存储连续的数字
    int index = 0;    // 临时数组的索引
    int foundContinuous = 0;  // 是否已经找到第一个连续数字序列
    
    for (int i = 0; str[i] != '\0'; i++) {
        if (str[i] >= '0' && str[i] <= '9') {
            if (!foundContinuous) {
                foundContinuous = 1;
            }
            temp[index++] = str[i];
        } else {
            if (foundContinuous) {
                temp[index] = '\0'; // 在临时数组末尾加上结束符
                printf("%s\n", temp);
                break;  // 找到第一个连续数字序列后,结束循环
            }
        }
    }
}

int main() {
    char str[] = "abc123def456ghi";
    printContinuousDigits(str);
    return 0;
}

这样,上述代码将会输出: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
要求只输出第一串连续数字后面的数字不再输入


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

void printContinuousDigits(char* str) {
    int index = -1;  // 记录连续数字串的起始索引
    int i = 0;
    while (str[i] != '\0') {
        if (str[i] >= '0' && str[i] <= '9') {
            if (index == -1) {
                index = i;  // 找到了连续数字串的起始索引
            }
        } else {
            if (index != -1) {
                break;  // 遇到非数字字符,且已经找到了连续数字串,则跳出循环
            }
        }
        i++;
    }

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

int main() {
    char str[] = "abc123def456ghi";
    printContinuousDigits(str);
    return 0;
}

上述代码将会输出:123def456ghi

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 21:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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