一个有意思的符号

          作为一个接触时间很长却几乎没有动过手的c菜鸟来说,这个程序让我有着浓厚的兴趣。这是一个返回参数二进制中1的个数的程序,在开始做的时候,想的是如何将一个整型十进制先变成一个二进制,按照十进制转换为二进制的定义尝试去编,也就是用除二取余进行运算,做这样一个函数让后将十进制数放进去转化为二进制序列在返回给主函数进行调用,写完之后在书上查了查,然后发现一个按位与运算&,然后借鉴编出来下面这个代码,比之前编出来的代码简便多了,哈哈!生活处处有惊喜,人丑还是要多读书,现在还是个菜鸟,还需要努力学习。奋斗

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int count_one_bits(unsigned int value)
{
	int count = 0;
	for (count = 0; value; value = value&(value -1))//&是按位与运算
	{
		count++;
	}
	return count;
}
int main()
{
	int i = 0, num = 0;
	printf("请输入一个整数:");
	scanf("%d",&num);
	i = count_one_bits(num);
	printf("%d这个数的返回参数二进制中1的个数为%d\n",num,i);
	system("pause");
	return 0;
}

好的,这是一个有意思的问题!首先,我们需要读取文本文件并将其分解成单词。因为单词之间的分隔符可以是任何非字母字符或空格字符,所以我们需要对文件进行逐字符读取,并将非字母字符或空格字符作为单词之间的分隔符。 读取文件可以使用 C 语言中的标准库函数 `fopen()` 和 `fread()`,其中 `fopen()` 用于打开文件, `fread()` 用于将文件内容读取到缓冲区中。 接下来,我们需要对缓冲区中的字符进行逐一扫描,以识别单词边界。如果我们找到了一个字母字符,则我们需要从该字符开始扫描,直到找到一个非字母字符或空格字符为止。此时,我们可以将这个单词加入到一个哈希表中,并增加它的出现次数。如果哈希表中已经存在该单词,则只需要增加其出现次数。 最后,我们需要在哈希表中找到出现次数最多的前十个单词。这可以通过对哈希表进行排序并取前十个元素来实现。 以下是一个可能的实现: ```c #include <stdio.h> #include <ctype.h> #include <string.h> #include <stdlib.h> #define MAX_WORD_LEN 100 #define MAX_WORDS 100000 typedef struct { char word[MAX_WORD_LEN + 1]; int count; } word_count; int cmp_word_count(const void *a, const void *b) { return ((word_count*)b)->count - ((word_count*)a)->count; } int main(int argc, char *argv[]) { if (argc != 2) { printf("Usage: %s <filename>\n", argv[0]); return 1; } FILE *fp = fopen(argv[1], "rb"); if (!fp) { printf("Failed to open file: %s\n", argv[1]); return 1; } char *buf = (char*)malloc(MAX_WORDS * MAX_WORD_LEN); if (!buf) { printf("Failed to allocate memory.\n"); return 1; } int buf_size = fread(buf, 1, MAX_WORDS * MAX_WORD_LEN, fp); fclose(fp); if (buf_size == 0) { printf("Failed to read file: %s\n", argv[1]); free(buf); return 1; } word_count *words = (word_count*)malloc(MAX_WORDS * sizeof(word_count)); if (!words) { printf("Failed to allocate memory.\n"); free(buf); return 1; } int word_count = 0; char *word_start = NULL; for (int i = 0; i < buf_size; i++) { if (isalpha(buf[i])) { if (!word_start) { word_start = &buf[i]; } } else if (word_start) { int word_len = &buf[i] - word_start; if (word_len > MAX_WORD_LEN) { word_len = MAX_WORD_LEN; } strncpy(words[word_count].word, word_start, word_len); words[word_count].word[word_len] = '\0'; words[word_count].count = 1; for (int j = 0; j < word_count; j++) { if (strcasecmp(words[j].word, words[word_count].word) == 0) { words[j].count++; word_count--; break; } } word_count++; word_start = NULL; } } qsort(words, word_count, sizeof(word_count), cmp_word_count); printf("Top ten words:\n"); for (int i = 0; i < 10 && i < word_count; i++) { printf("%s: %d\n", words[i].word, words[i].count); } free(words); free(buf); return 0; } ``` 这个程序首先从命令行参数中获取文件名,然后打开该文件并将其读取到一个缓冲区中。接下来,程序对缓冲区中的字符进行逐一扫描,并将单词存储在一个哈希表中。最后,程序对哈希表进行排序,并输出出现次数最多的前十个单词。 请注意,这个程序使用了动态内存分配,因此需要在程序结束时显式地释放分配的内存,以避免内存泄漏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值