输入: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
即 abc有20%的概率输出,a有30%的概率输出,de有50%的概率输出,输出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) |