我是个汉子 发表于 2019-2-24 20:25:15

救助,,我的c语言计数和删除好像有些问题

本帖最后由 我是个汉子 于 2019-2-24 20:46 编辑

/***********************************************
题目:主函数main()中数字字符串s为测试数据,程序主要先对数
      字字符串s进行降序排序,将结果存入在数组b中,然后对
      数组b中数据进行压缩,不同数字保存在数组b中,数字出
      现次数保存在数组times中,计算各个数字加权和(即数字
      本身乘以该数字出现次数),结果保存在数组c中。

编写程序:
      1. 编写函数voidSortAndChange(char s[],int n, int b[]),
         对字符串s中n个字符进行降序排列,并将n个字符转换为
         数字,保存在数组b中。
   
      2. 编写函数int Calculcate(int b[],int n,int times[],int c[]),
         对数组b中数字进行压缩,不同数字保存在数组b中,不
         同数字出现次数存入数组times中,并计算各个数字加权
         和,结果存入数组c中,函数返回不同数字的个数。

      测试数据: 13334444555582298760
      运行结果:b=9 and times=1, the weight sum is 9
                b=8 and times=2, the weight sum is 16
                ...
                b=0 and times=1, the weight sum is 0
*************************************/
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<ctype.h>
#include<string.h>
#define N 50

void SortAndChange(char s[],int n,int b[])
{
/**********Program**********/
int i,j;
char t;
for(i=0; i<n-1; i++)
{
    for(j=i+1; j<n; j++)
    {
      if(s<s)
      {
            t=s;
            s=s;
            s=t;
      }
    }
}
for(i=0; i<n; i++)
    b=s-'0';
/**********End**********/
}
int Calculcate(int b[],int n,int times[],int c[])
{
/**********Program**********/ //98876555544443332210
int i,j,k=0,num,count;
for(i=0; i<n; i++)
{
    count=1;
    for(j=i; j<n; j++)
    {
      if(b==b)
            count++;
      else
      {
            times=count;
            b=b;
            i=j;
            c=b*times;
            k++;
            break;
      }   
    }      
}
return k;
/**********End**********/
}

int main()
{
    char s="13334444555582298760";
    int b={0};
    int c={0};
    int times={0};
    int num;
    int i,n;
            
    FILE *fp;
    if((fp=fopen("DATA.TXT","w"))==NULL)
    {
      printf("File open error\n");
      exit(0);
    }
      
    n=strlen(s);
    SortAndChange(s,n,b);
    num=Calculcate(b,n,times,c);

    for(i=0;i<num;i++)
    {
      printf("b[%d] = %d and times[%d] =%d, the weight sum is %d\n",i,b,i,times,c);
      fprintf(fp,"b[%d]= %d and times[%d] =%d, the weight sum is %d\n",i,b,i,times,c);
    }
   
    fclose(fp);
   
    return 0;
}

我的输出:
b = 9 and times =1, the weight sum is 9
b = 8 and times =2, the weight sum is 16
b = 7 and times =1, the weight sum is 7
b = 6 and times =1, the weight sum is 6
b = 5 and times =4, the weight sum is 20
b = 4 and times =4, the weight sum is 16
b = 3 and times =3, the weight sum is 9
b = 2 and times =2, the weight sum is 4
b = 1 and times =1, the weight sum is 1


Croper 发表于 2019-2-25 20:29:57

if(b==b)
            count++;
      else
      {
            times=count;
            b=b;
            i=j;
            c=b*times;
            k++;
            break;
      }   
这一段至少有两个问题
1.既然j<n当j=n-1时 b溢出,这是不安全的代码
2.考虑下边界情况。你这样写只有b!=b时结算,如果最后b的值刚好与b这个内存位置储存的值相同,那么最后一次结算就直接被你吃掉了
这就是输出中为什么没有0的原因

我是个汉子 发表于 2019-2-25 20:57:23

Croper 发表于 2019-2-25 20:29
这一段至少有两个问题
1.既然j

for(i=0; i<n; i++)
{
        count=1;
        for(j=i; j<n-1; j++)
        {
                if(b==b)
                        count++;
                else
                {
                        times=count;
                        b=b;
                        i=j;
                        c=b*times;
                        break;
                }       
        }
这样修改也不行的

Croper 发表于 2019-2-25 21:09:35

什么叫“这样修改也不行的”?
那是你自己的代码啊- -,我又没给你改
页: [1]
查看完整版本: 救助,,我的c语言计数和删除好像有些问题