yindongex
yindongex
采纳率33.3%
2015-11-30 15:11 阅读 9.9k
已采纳

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

30

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

10条回答 默认 最新

  • 已采纳
    wenpinglaoyao 纹枰老妖 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]);
    }

    点赞 5 评论 复制链接分享
  • devmiao devmiao 2015-11-30 15:27
  • Bra_Hancock Bra_Hancock 2015-11-30 15:58

    看了一圈 就你这个问题我会 偶尔水一下
    从头开始挨个格读字符 创建个小的 char[] temp
    创建个变量 记录连续出现数字的位数 如果读到其它类型(asc2来判断是不是数字)就清0 清空 temp 从头记录
    输出成数的时候把每位减48就是对应的数字 再乘10的多少次方就是位 可能逆序

    点赞 评论 复制链接分享
  • adolph_jun adolph_jun 2015-11-30 16:17

    利用ascll就可以解决了,利用字符的ascll码范围,将字符转变成数字,后面几问应该不难

    点赞 评论 复制链接分享
  • yindongex yindongex 2015-11-30 16:34

    第一个函数找到数字了 我应该如何把找到的数字传递到下一个函数中?用数组实现吗 但是数组实现的话 第一个函数的结果怎么保证都放入一个数组中?

    点赞 评论 复制链接分享
  • qq429205464 qq429205464 2015-12-01 00:44

    数组可以用全局的,或者当函数参数传入,数组的下标也用一个全局的标识标识,函数一用来记录数字,其它函数就可以用了

    点赞 评论 复制链接分享
  • wunaidepao wunaidepao 2015-12-01 02:05

    在main的第一步,定义一个1024的数组A,然后strlen字符串的长度,定义一个int B在while里面每次读取一个字符串,判断是不是在‘0’~‘9’之间,在那就B = B + 这个数 * 进入 循环次数,当中间出现其他字符是或者到了第七位,则将B的值存入A,B值清零,直到读到字符串的末尾结束。第二个就是数组的排序,百度冒泡。其他的就不说了。

    点赞 评论 复制链接分享
  • qq_30324111 FakerHB 2015-12-01 03:00
    #include<stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    void MyFunction(const char* str,int* p)
    {
        char buf[7];
        int num = 0;
        int count = 0;
        int total = 0;
        int result = 0;
        int flag = 0;
        for (int i = 0; i < strlen(str)+1; i++)
        {
            if (str[i] > '0' && str[i] < '9')
            {
                buf[count] = str[i];
                count++;
                flag = 1;
            }
            else
            {
                if (flag == 1)
                {
                    for (int i = 0; i < count; i++)
                    {
                        num = buf[i] - '0';
                        total = num*int(pow(double(10), double(count-i-1))) + total;
                    }
                    p[result] = total;
                    result++;
                    //将有关数据清零,以备下一次存取下来的整数
                    for (int i = 0; i < 7;i++)
                    {
                        buf[i] = 0;
                    }
                    count = 0;
                    flag = 0;
                    total = 0;
                }
    
            }
        }
    }
    int main()
    {
        char* str = "5555fda455dsa586dsa4884dsa45454sddsa7445";
        int array[10] = {0};
        MyFunction(str, array);
        for (int i = 0; i < 6; i++)
        {
            printf("......%d\n", array[i]);
        }
    } 
    

    判断整数最大位为6位的自己想。
    排序的就不说了,什么排序都可以。
    遍历字符串的时候,应遍历总的长度,即包括字符串最后的结束符‘\0’这个字符,为什么自己想。

    点赞 评论 复制链接分享
  • wty18742426338 Bladewangpro 2015-12-01 04:33

    我写了一下这个程序,我运行没有问题,要是发现问题麻烦告诉我一声,欢迎指教

    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    
    string Read();
    bool type(char m);
    vector<vector<int>> pick(string m,vector<int>& arr);
    void sort(vector<int> &k);
    void output(vector<vector<int>> reback);
    
    int main(){
    
        vector<int> second_que;
        string queue = Read();
    
        //提取一个字符串中的所有整数。整数提取规则为:连续的数字字符构造一个整数,如果整数位数超过 6 位,则在第 7 位开始构建一个新的整数。
        vector<vector<int>> reback = pick(queue,second_que);
    
        //输出提取的所有整数。
        output(reback);
        //对(1)步提取的所有整数按照从小到大的顺序排序。
        sort(second_que);
        for(int z = 0; z < second_que.size(); z++){
                cout << endl <<"排序后数字分别为: "<<second_que[z];
        }
    
        return 0;
    }
    
    string Read(){
        string read_s;
        cout << "Please Input: "<<endl;
        cin >> read_s;
        return read_s;
    }
    
    bool type(char m){
        if((((int) m) > 47) && (((int) m) < 58))
            return true;
        else
            return false;
    }
    
    vector<vector<int>> pick(string m,vector<int>& arr){
        int flag = 0,buffer = 0;
        vector<int> result;
        vector<vector<int>> fin;
        for(int i = 0; i < m.length(); i++){
    
    
            if(type(m[i])){
                if(result.size() < 6){
                    int k = (int) m[i] - 48;
    
                    result.push_back(k);
                    buffer = buffer*10 +k;
                }
                else{
                    int k = (int) m[i] - 48;
                    result.push_back(k);
                    fin.push_back(result);
                    buffer = buffer*10 +k;
                    arr.push_back(buffer);
                    buffer = 0;
                    result.clear();
                }
            }
            else
                continue;
    
    
        }
        if(result.size()!=0){
            fin.push_back(result);
            arr.push_back(buffer);
        }
    
        return fin;
    }
    
    void sort(vector<int> &k){
        int key,i;
        for(int j = 1; j < k.size(); j++){
            key = k[j];
            i = j-1;
            while((i>=0)&&(k[i]>key)){
                k[i+1] = k[i];
                i = i-1;
            }
            k[i+1] = key;
        }
    }
    void output(vector<vector<int>> reback){
        cout<<endl<<"提取出的数字为:"<<endl;
        for(int i = 0; i < reback.size(); i++){
            for(int j = 0; j < reback[i].size(); j++){
                cout << reback[i][j];
            }
            cout <<endl;
        }
    }
    
    点赞 评论 复制链接分享
  • wenpinglaoyao 纹枰老妖 2015-12-01 09:46

    首先说一下我对题主题目的理解:因为题主说的是字符串,所以我就当字符串里面只能包含一些字符,不能包含一些空格、回车、制表符等,即扫描字符串时如果遇到空格等制表符就停止扫描【程序认为到了字符串终点】。还有题主并没有说像【 - 】 和小数点算不算在数值里面,所以我就当不算,即只提取从0到9的数字。最后题主说整数位数不能超过6,我的理解就是转换后的数值不能大于99999;如果我以上的理解正确,请题主参考下我的代码——
    #include
    #include
    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]);
    }

    
    
    
    
    
    
    点赞 评论 复制链接分享

相关推荐