yindongex 2015-11-30 15:11 采纳率: 33.3%
浏览 10507
已采纳

【C语言编写函数问题】从键盘输入一个字符串,编写程序完成 如下功能:

(1) 编写一个函数,提取一个字符串中的所有整数。整数提取规则为:连续
的数字字符构造一个整数,如果整数位数超过 6 位,则在第 7 位开始构建一
个新的整数。
(2) 编写一个函数,对(1)步提取的所有整数按照从小到大的顺序排序。
(3) 编写一个函数,输出提取的所有整数。
(4) 编写相关测试程序。
(没有学到指针)麻烦大神们给个详细的程序,做了几个小时了一直不成功。不知道在问题1中返回的值如何返回,并在2中使用,求详细解答,谢谢啦

  • 写回答

10条回答 默认 最新

  • 纹枰老妖 2015-12-01 09:51
    关注

    #include “stdio.h”
    #include “stdlib.h”
    char string[1000]; //这个是您的字符串样本
    int num[100]; //这个是字符串转换后的数值数组
    int ad_num[100000];//这个是排序时所用的间接数组

    int Convert(char *s);
    void Sort(int c);
    void print(int c);
    int main()
    {
    int num_Count;
    printf("请输入您的字符串文本:\n"); //现在我们输入我们的字符串样本,按下回车键表示输入结束
    scanf("%s", string);

      num_Count = Convert(string);        //在这里把字符串文本中的数字都提取出来
      printf("字符串转换后如下所示:\n");
    for (int i = 0; i < num_Count; i++)  printf("%d  ", num[i]);
    
      printf("\n经过排序后的数值如下所示:\n");
      Sort(num_Count);                   //在这里调用函数进行排序
      print(num_Count);
      printf("程序运行完毕,按任意键退出!");
      system("pause");
      return 0;
    

    }

    int Convert(char *s)
    {
    int count=0, temp=0,a=0;
    for (int i = 0; s[i] != '\0'; i++)
    {
    if (s[i] >= '0'&&s[i] <= '9')
    {
    temp = temp * 10 + (s[i] - '0'); //temp用来提取数字
    if (temp > 99999) //如果数值大于99999,则把数值经过处理后赋值给num数组中的某一个元素
    {
    num[a] = (temp - (s[i] - '0')) / 10; //这个就是处理过程,因为检测时数值已经超过六位数,所以要减去个位数再 / 10
    temp = s[i] - '0'; //把溢出的这个字符值保存在temp中
    a++; //a在这个函数里只是用来当作num的下标而已
    count++;
    }
    }
    }
    num[a] = temp; //最后不要忘了我们还有一个不大于99999的数值呢。。。
    count++;
    return count; //这个count用来表示提取出的数字可以组成多少个数值
    }

    void Sort(int c) //抱歉,其它的排序算法不记得啥样了,所以这里用了一个本人最熟悉的吧
    {
    int a = 0;
    for (int i = 0; i < c; i++) ad_num[num[i]]++; //这个循环是用来把num里的所有数值映射到ad_num数组中,每映射一次,对应的标记+1

      for (int i = 0; i < 100000; i++) //这个循环用来检测六位数里面哪些数值曾经出现在num里
      {
            while (ad_num[i]>0) //因为ad_num里的这个元素大于0,这意味着对应的i数值至少在曾经的num里出现过一次
            {
                  num[a++] = i;  //很简单,赋值即可
                  ad_num[i]--;   //自然的,ad_num的标记要减一次
            }
      }
    

    }

    void print(int c) //输出被排序过的num数组
    {
    for (int i = 0; i < c; i++) printf("%d ", num[i]);
    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

悬赏问题

  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab