Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4826949
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-08-06 18:35:31

输入:N(整数)
输入:数据文件A.txt,不超过6条记录,字符串长度不超过15个字节
文件格式如下:
字符串\t数字\n

说明:
每行为1条记录;字符串中不含有\t
数字描述的是该字符串的出现概率,小于等于100的整数。
多条记录的出现概率之和为100,如果A.txt不满足该条件,程序则退出;
如果文件格式错误,程序也退出。

要求:
编写一个程序,输入为N(正整数),读入文件A.txt,按照字符串出现概率随机地输出字符串,输出N条记录

例如:
输入文件A.txt
abc\t20
a\t30
de\t50
输入为:10

abc20%的概率输出,a30%的概率输出,de50%的概率输出,输出10条记录
以下为一次输出的结果,多次输出的结果可能不相同。
abc
a
de
de
abc
de
a
de
a
de

记得这题是帮小江在线笔试的时候做的,当时刚回武汉,自己犯的错误实在都不好意思说出来。考试的时候有个哥们问我\t我说就是tab啊。。。结果写程序的时候我当成'\''\t'两个字符了,惭愧
 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define RECORD 6
#define LEN 15

typedef struct str
{
  char* str;
  int probability;
}STR;

void process_str(char* string,STR* S)
{
  char* tmp = string;
  while(*tmp)
  {
    if(*tmp == '\t')
     {
      *tmp = '\0';
      break;
     }
    else
      tmp++;
  }
  S->str = string;
  S->probability = atoi(tmp+1);
  
  printf("str is %s,probability is %d\n",S->str,S->probability);
}

void swap(int* a, int* b)
{
  int tmp = *a;
  *a = *b;
  *b = tmp;
}

void pro_rand(int A[], int N)
{
   int i = 0;
   int num;
   for(;i<N;i++)
   {
     num = rand()%(N-i) + i;
     swap(A+i,A+num);
   }
}
       
int main(int argc, char *argv[])
{
  STR* str[RECORD];
  int record = 0;
  int i = 0;
  int j = 0;
  int num = 10;
  int total = 0;
  srand((unsigned int)time(NULL));
  FILE* fp = fopen("A.txt","r");
  while(1)
  {
   char* string = (char*)malloc(LEN);
   if(fgets(string, LEN, fp))
    {
     str[record] = (STR*)malloc(sizeof(STR));
     process_str(string,str[record]);
     total += str[record]->probability;
     record++;
    }
   else
    break;
  }

  int A[num];

  if(total !=100)
   {
     printf("sorry not 100\n");
     return -1;
     }

  for(i=0,j=0;i<record;i++)
  {
    (str[i]->probability) /= num;
    while((str[i]->probability)--)
     {
       A[j] = i;
       j++;
     }
   }
  pro_rand(A, num);
  
  for(i=0;i<num;i++)
     printf("%s\n", str[A[i]]->str);
  fclose(fp);
  
  system("PAUSE");    
  return 0;
}

阅读(1167) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~