C統計1-49的數字出現的次數

來源:互聯網
上載者:User
/* *  main.c * *  Created on: Jan 23, 2013 *      Author: linux 楊志永 *      QQ    : 929168233 *      Email : ljy520zhiyong@163.com * */#include <stdio.h>#include <stdlib.h>#include <ctype.h>#include <time.h>//數組的長度(一共49個數字,所以定義了50個元素,第一個元素為0,以後的一一對應#define LENGTH 50//定義輸出時,在一行中最多列印的數字#define ROWSIZE 15//定義隨機產生數位個數#define TESTSIZE 500000#define FILE_IN_NAME "input.txt"#define FILE_OUT_NAME "out.txt"void initNums(int initNumbers[], int length);int count(int initNumbers[], int length, int number);void writeToFile(int countNumber[], int initNumbers[], int copyInit[],int differentCountArray[], FILE * file_out);void generate();void getDifferentCount(int arrays[], const int original[]);void copyArray(int destination[], const int original[], int length);int my_compare(const void *x, const void *y);int main(int argc, char * argv[]) {FILE *file_in = fopen(FILE_IN_NAME, "r");if (file_in == NULL ) {perror("No input.txt file!");exit(1);}FILE *file_out = fopen(FILE_OUT_NAME, "w+");if (file_out == NULL ) {perror("Create or open out.txt file error!");exit(1);}//統計數字i出現的次數為countNumber[i]int countNumber[LENGTH] = { 0 };//初始化資料int initNum[LENGTH] = { 0 };//這個用來儲存出現0次的數字。如果copyInit[i] == 0,表示數字i的次數不為0int copyInit[LENGTH] = { 0 };//這個用來儲存不同次數的數字int differentCountArray[LENGTH] = { 0 };initNums(initNum, LENGTH);initNums(copyInit, LENGTH);char * read_num = calloc(10, sizeof(char));if (read_num == NULL ) {perror("分配記憶體在read_num失敗!!");exit(1);}fscanf(file_in, "%s", read_num);while (feof(file_in) == 0) {//printf("read_num = %s\n", read_num);if (atoi(read_num) != 0) {int index = count(initNum, LENGTH, atoi(read_num));if (index != -1 && index < LENGTH) {countNumber[index]++;}}fscanf(file_in, "%s", read_num);}getDifferentCount(differentCountArray, countNumber);writeToFile(countNumber, initNum, copyInit, differentCountArray, file_out);//釋放記憶體free(read_num);fflush(file_out);fflush(file_in);fclose(file_in);fclose(file_out);//產生測試使用的隨機數//generate();return 0;}/** * 初始化數字,0,1,2....到49 */void initNums(int initNumbers[], int length) {int i = 0;for (i = 0; i < length; i++) {initNumbers[i] = i;}}/** * 統計數字number在initNumbers中出現的索引位置,並返回該位置。方便將該位置的值加1,即累加該位置的次數 */int count(int initNumbers[], int length, int number) {int index = -1;int i = 0;for (i = 0; i < length; i++) {if (initNumbers[i] == number) {index = i;break;}}return index;}/** *將結果寫入out.txt檔案中 */void writeToFile(int countNumber[], int initNumbers[], int copyInit[],int differentCountArray[], FILE * file_out) {int i = 0;int j = 0;//rowSize用來控制一行中最多輸出的數位個數int rowSize = 0;//首先輸出的是次數不為0的數字及它的次數for (i = 1; i < LENGTH; i++) {if (countNumber[i] > 0) {fprintf(file_out, "數字 [%02d] 出現的次數為 <%d次>\n", i, countNumber[i]);}}fprintf(file_out, "\n");fflush(file_out);for (i = 0; i < LENGTH; i++) {rowSize = 0;if (differentCountArray[i] > 0) {//這裡輸出的是具有相同次數的數字fprintf(file_out, "出現的次數為 <%d次>的數字有:\n", differentCountArray[i]);for (j = 0; j < LENGTH; j++) {if (countNumber[j] == differentCountArray[i]) {fprintf(file_out, "%02d  ", j);//將曾經出現過的數字標記為0,表示該數字已經出現過了copyInit[j] = 0;rowSize++;if (rowSize == ROWSIZE) {fprintf(file_out, "\n");rowSize = 0;}}}fprintf(file_out, "\n");fprintf(file_out, "\n");fflush(file_out);}}fprintf(file_out, "\n");//下面輸出出現0次的數字fprintf(file_out, "出現的次數為 <0次>的數字有:\n");rowSize = 0;for (j = 0; j < LENGTH; j++) {// copyInit[j] != 0 表示還沒有出現過的數字,即表示是0次的數字if (copyInit[j] != 0) {fprintf(file_out, "%02d  ", copyInit[j]);rowSize++;if (rowSize == ROWSIZE) {fprintf(file_out, "\n");rowSize = 0;}}}fflush(file_out);}/** * 用於產生測試資料,並將資料儲存在tmp.txt檔案中 */void generate() {FILE * tmp = fopen("tmp.txt", "w+");if (tmp == NULL ) {perror("error on tmp file open");exit(1);}int i = 0;int count = 0;srand((int) time(0));for (i = 0; i < TESTSIZE; i++) {fprintf(tmp, "%d ", ((rand() % 49) + 1));count++;if (count == ROWSIZE) {fprintf(tmp, "\n");count = 0;}}fclose(tmp);}//擷取不同出現的次數並儲存在arrays[]數組中void getDifferentCount(int arrays[], const int original[]) {int i = 0;int j = 0;int k = 0;int tmp[LENGTH] = { 0 };copyArray(tmp, original, LENGTH);//排序,升序qsort(tmp, LENGTH, sizeof(int), my_compare);//去除重複for (i = 0; i < LENGTH; i++) {for (j = i + 1; j < LENGTH; j++) {if (tmp[i] == tmp[j]) {tmp[j] = 0;}}}//然後將臨時數組中儲存的次數不為0的資料複製到arrays[]數組中for (i = 0; i < LENGTH; i++) {if (tmp[i] != 0) {for (k = 0; k < LENGTH; k++) {if (arrays[k] == 0) {arrays[k] = tmp[i];break;}}}}}//複製數組void copyArray(int destination[], const int original[], int length) {int i = 0;for (i = 0; i < length; i++) {destination[i] = original[i];}}//void qsort(void *base, size_t nmemb, size_t size, int(*compare) (const void *, const void *));int my_compare(const void *x, const void *y) {const int *a = x;const int *b = y;return (*a - *b)*(-1);}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.