
C语言
文章平均质量分 66
bufanq
这个作者很懒,什么都没留下…
展开
-
C语言字符型数据(二)— 汉字的读写
首先声明:这些内容主要是面向C语言的初学者,尤其是正在学习C语言的学生。在上一篇文章中,我们利用字符型变量处理了文本文件中的英文字符。但是,文本文件中不仅能输入英文字符,更多的时候我们需要处理汉字,如何用C语言程序读写这些汉字呢?大多数的C语言初学者或者已经学过C语言的学生对这个问题并不清楚,主要是因为教材上很少涉及这个问题。实际上汉字的读写是很实用的操作,它是基于汉语的文本搜索、自然语言处理...原创 2016-03-31 17:17:38 · 12945 阅读 · 2 评论 -
大数乘法运算
第8章课后第18题要求“编程计算并输出1~40之间所有数的阶乘”。40的阶乘远远超过了长整型所能表示的范围,因此该题目涉及到大整数的存储和大整数乘法运算问题(也称作高精度运算)。大整数存储的解决方案就是把大整数存储到一个数组中,每个数组元素存储该数的一位(也可以是多位数字)。在阶乘这个问题中,阶乘的值逐渐增大,变成一个大整数,因此我们把阶乘的值存储到一个数组中。比如8的阶乘等于40320,在数组中原创 2016-05-19 16:55:22 · 2074 阅读 · 0 评论 -
C语言实现字符串的查找和替换
常用字处理软件或者编辑器都提供字符串的查找和替换功能,本文描述如何借助C语言的字符串处理函数来实现字符串的查找和替换功能。 先说查找,字符串的查找主要使用strstr函数,其原型为:char * strstr(char * str1, char * str2),函数的功能是在str1中查找str2,如果str2是str1的子串,则返回str2在str1中第一次出现的位置,否则返回空指针。原创 2016-06-02 15:19:42 · 100552 阅读 · 9 评论 -
C语言程序可以没有main函数
学习C语言的同学都知道,每个C程序要有一个main函数,程序从main函数开始执行,在main函数中结束。但事实上,C程序也可以没有main函数,或者说自己可以指定入口函数。下面这篇文章介绍了如何实现这一过程。这篇文章转自:http://www.codeweblog.com,作者不详。学习这个内容对程序设计没啥影响,但能更深入地了解程序编译和链接的原理。 这篇文章主要介绍了C语言之转载 2016-06-12 13:10:27 · 17477 阅读 · 0 评论 -
指针小结
随着课程的深入,知识点越来越多,不少同学开始迷惑了,尤其是学了指针以后,更加混乱了。指针似乎和谁都能扯上关系: 指向变量的指针、指向函数的指针、指向数组的指针、指向字符串的指针、返回指针值的函数、指针数组等等。我在这里把一些重要的概念进行小结,希望能起到理清思路的作用。重点理解不同指针的主要用途和优势。 1.指向变量的指针1.1 定义: int *p, a; p =原创 2016-06-15 08:23:42 · 1091 阅读 · 0 评论 -
编程读取ELF文件头
一个C语言源程序(.c文件)经过汇编以后生成目标文件(.o文件),目标文件再经过链接生成可执行文件。在linux系统中,目标文件和可执行文件都是ELF格式的,了解ELF文件的结构对于理解程序的编译、链接和装载运行至关重要。ELF文件的格式如下图所示,以文件头(ELF Header)开始,后面跟着代码段(.text)、数据段(.data)等。 ELF Header原创 2016-05-29 10:54:03 · 7830 阅读 · 0 评论 -
C语言函数嵌套定义问题
几乎所有的C语言教材上都说C语言函数可以嵌套调用,但不可以嵌套定义。实际上,函数能否嵌套定义与编译器有关,在GCC编译器下嵌套定义没问题,可以正常运行,我在code blocks 和 Dev C++两个IDE(两者都用GCC)下测试了如下两个程序,都没问题:1.main函数中的嵌套定义。#include "stdio.h"int main(){int add(int a,int原创 2017-03-04 21:52:37 · 24383 阅读 · 4 评论 -
Xcode中写C程序的问题
大多数时候,我都在windows和linux下编写c程序,今天换作在Mac OS下写。安装了Xcode,然后用“Command line tool” 模板创建了一个C project。 在main.c中写了一个如下计算圆面积的小程序。#include "stdio.h"int main(){ float r, area; printf("Please inp原创 2017-03-12 22:53:08 · 4172 阅读 · 0 评论 -
C语言fflush函数的移植问题
在C语言程序中,字符数据的输入很容易出错,尤其是和其它类型的数据混在一起时。例如下面的程序:# include “stdio.h”int main(){int a;char c;scanf(“%d”,&a);c= getchar();printf(“c = %c\n”, c); return 0;} 运行时,当输入一个整数后回车,则程序马上原创 2017-03-23 17:55:50 · 793 阅读 · 0 评论 -
数组的灵活应用(二)
题目:(第八章课后题8)假设有40个学生被邀请来给餐厅的饮食和服务质量打分,分数划分为1~10这10个等级(1表示最低分,10表示最高分),编程统计并按如下格式输出餐饮服务质量调查结果。Grade Count Histogram1 5 *****2 10 **********3 7原创 2017-05-04 20:01:52 · 6125 阅读 · 0 评论 -
推荐给喜欢挑战编程的学生
喜欢编写程序的同学可以去北大ACM网站注册(http://poj.org/),里面有几千道编程题目,每道题目都有排名,还有一些在线编程竞赛可以参加。闲来无事,挑战一把。原创 2017-12-12 11:07:27 · 449 阅读 · 0 评论 -
北大在线测试系统(POJ)第1002题
原题请参考:http://poj.org/problem?id=1002 这个题目我写了好几个版本的C程序,虽然都Accepted,但普遍用时较多,还需要进一步优化。下面这个程序是其中的一个,本来是想空间换时间,结果发现用时也超过了700MS。基本思想是:开辟一个大数组,数组元素的下标对应电话号码、元素值为该号码出现的次数。每读一个号码,号码对应的元素值加1。最后依次输出元素值大于1的数组下原创 2018-02-04 21:05:04 · 2011 阅读 · 0 评论 -
C语言练习题
1. 一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?2. 已有一个排好序的整型数组,今输入一个整数,要求按原来排序的规律将它插入数组中。3. 编一程序,将两个字符串连接起来,不要用strcat函数。4. 将一个二维数组行和列元素互换,存到另一个二维数组中。例如,将一个3行4列的二维数组a行列互换后,存到一个4行3列的二维...原创 2017-12-24 18:51:25 · 4166 阅读 · 10 评论 -
简易房贷月供计算器
下面是用C语言编写的简易房贷月供计算器,供参考。#include "stdio.h" #include "math.h"int main(){ double amountOfLoan,annualInterest,repaymentPeriod; //input double monthlyPayments; //output double monthlyInterest,nu...原创 2018-10-12 17:12:17 · 3070 阅读 · 2 评论 -
素数探求
声明:这些内容主要是面向C语言的初学者,尤其是正在学习C语言的学生。 教材第七章的实验题目是素数探求,共包括6个任务,其中第一个任务就是编写函数来判断一个正整数是不是素数。判断一个数是不是素数是一个非常经典的题目,很多教科书上将它作为例题讲解。在上机的时候,发现不少同学在写这个程序时存在问题。因此,本文从学生程序的错误出发,循序渐进,讨论这个函数的几种写法。 下面是某些学原创 2016-04-22 21:14:46 · 6976 阅读 · 0 评论 -
C语言数组元素下标为何从0开始
很多同学可能在学习数组时会有这个疑问,下标为什么不从1开始呢?从1开始不是更符合大家的日常习惯吗?生活中我们通常说第1个,而不是第0个。的确,有些计算机语言如早期的Pascal语言,数组元素的下标是从1开始的。难道是C语言故意要与众不同?要弄清楚这个问题,得先看一下计算机底层是怎样处理数组元素的。我们先编写了一个小程序,然后在visual studio中对其进行了反汇编。源程序和反汇编后的部分原创 2016-05-06 11:24:51 · 23217 阅读 · 4 评论 -
错误与断言
首先声明:这些内容主要是面向C语言的初学者,尤其是正在学习C语言的学生。 在《C语言字符型数据(一)》中,我们对文本文件中的内容进行了简单的加密处理。程序如下所示:#include "stdio.h"int main(){ char ch; freopen("original.txt","r",stdin) ; //输入输出被分别重定向到两个文件。 f原创 2016-03-31 22:08:36 · 788 阅读 · 0 评论 -
位运算—统计文本文件中汉字的个数
声明:这些内容主要是面向C语言的初学者,尤其是正在学习C语言的学生。 C语言进行底层开发时经常会用到位运算,比如操作系统中的各种描述符,不同的位代表着不同的含义,经常需要按位赋值。关于位运算的细节,教材上都有,这里不再重复。这里只是举例来学习位运算的使用。例:统计一个中英文混合的文本文件“maden.txt”中汉字的个数。分析: 文本文件中每个英文字符占一个字节,最高位原创 2016-04-01 09:31:22 · 1727 阅读 · 0 评论 -
C语言字符型数据(一)—简单的恺撒密码
首先声明:这些内容主要是面向C语言的初学者,尤其是正在学习C语言的学生。 学习C语言的字符型数据时,首先需要记住两条重要特性:1.字符型数据存储的是字符的ASCII码值;2. 由于ASCII码值本质上是一个整数,因此字符型数据可以像整数一样做加减运算。光记住这两条只能应付一些简单的考试题,要想利用字符型数据来解决一些实际的应用问题,还需要更多的练习。本文中的例子将结合文本文件的操作...原创 2016-03-31 09:55:53 · 12747 阅读 · 4 评论 -
用switch语句制作菜单
声明:这些内容主要是面向C语言的初学者,尤其是正在学习C语言的学生。switch语句可以用来在字符界面下制作菜单。给每个菜单项指定一个编号,用户通过输入编号来选择菜单项,switch语句判断用户输入的编号并执行相应的任务。下面我们通过一个例子来学习制作的过程。例:编写一个简单程序对某门课的成绩进行统计分析,包括求平均成绩、找出最高成绩、统计不及格的人数和统计80分以上的人数。要求将这些功能...原创 2016-04-02 22:13:27 · 19264 阅读 · 4 评论 -
学会优化你的程序
声明:这些内容主要是面向C语言的初学者,尤其是正在学习C语言的学生。程序优化是个很大的话题,一些经典编程书籍上对此已做过探讨。在这里,我主要是针对学生作业中的一些问题进行讨论,尽量想办法减少程序中的冗余、使程序变得更简练,可以说是比较初级的程序优化。更高级的优化主要是针对编译器进行的,如何写代码使编译出来的程序执行效率更高,以后抽空再讨论。例: 第五章课后第10题:编程从键盘输入某年某月,...原创 2016-04-07 15:05:19 · 698 阅读 · 0 评论 -
调试程序的利器—printf
声明:这些内容主要是面向C语言的初学者,尤其是正在学习C语言的学生。 当排除了所有的语法错误,但运行结果却不正确时,很多初学者往往束手无策,只好求助老师了,“老师,我这个程序没错,但结果不正确”,这是在上机课上经常听到的声音。初学者缺乏经验,也缺乏耐心。殊不知每个程序员都是在不断的和错误斗争的过程中成长起来的,调试程序的过程有时候是很痛苦的,但发现错误原因的那一刻,幸福却是满满的。原创 2016-04-08 11:05:33 · 1988 阅读 · 0 评论 -
在Dev C++中制作和使用静态链接库
C语言提供了大量的库函数,这些库函数以静态链接库的形式存放在安装目录的lib文件夹里(.a为后缀的文件)。这些库函数可以被我们的程序反复使用,比如printf,scanf等。如果你自己定义的函数,在很多程序中要反复使用,或者需要和别人共享,也可以将这些函数制作成静态链接库,然后在其它程序中调用这些函数,就好像使用库函数一样。本文讲述如何在Dev C++平台中制作和使用静态链接库。 一、原创 2016-04-25 22:10:44 · 14962 阅读 · 4 评论 -
指定printf输出域宽
声明:这些内容主要是面向C语言的初学者,尤其是正在学习C语言的学生。 每个有用的C程序中都用到了printf函数,它可以根据我们指定的格式符来输出数据。很多初学者只关心%d,%f,%c等格式符,却忽略了格式修饰符的使用。事实上,合理地使用格式修饰符会给输出带来很多方便。本文只讨论一种格式修饰符,即输出域宽。下面的例子展示了指定输出域宽的好处。 教材第六章课后习题6.1原创 2016-04-14 09:31:44 · 14924 阅读 · 0 评论 -
用switch语句制作菜单 (二)_引入数组
在前面的文章《用switch语句制作菜单》中,我们定义了四个函数分别求平均成绩、找最高成绩、统计不及格人数和统计80分以上人数。在四个函数中,都有打开文件、读文件、关闭文件的操作。当操作次数多,文件中数据量大时,这是一种非常低效率的做法,因为磁盘操作是一种耗时的过程。因此,我们有必要更新程序,找到新的方法来减少文件操作的次数。 在原来程序的每个函数中,只是定义了一个变量score来存储成原创 2016-05-01 09:43:23 · 3122 阅读 · 0 评论 -
break和return
声明:这些内容主要是面向C语言的初学者,尤其是正在学习C语言的学生。 在C语言中,break语句有两个作用:一是终止switch语句,二是终止循环语句。return语句也是两个作用:一是返回值,而是终止函数的执行。在上课的过程中,发现有些同学对这两个语句的使用还不是很熟练。本文以求两个正整数的最小公倍数为例,学习break和return语句的使用。例:编写求两个正整数的最小公倍原创 2016-04-21 10:35:16 · 765 阅读 · 0 评论 -
函数声明
本文将C语言的函数声明在这里做一总结。尤其注意同一工程中多个文件间函数调用和声明的关系,很多C语言的教材上没有涉及此话题。 1.目的: 函数声明的目的是告诉编译器被调用函数的返回值类型、参数个数及参数类型,以便编译器检查函数调用语句的合法性。 2.语法: 函数声明的语法格式通常与函数定义的头部是一致的,我们把函数定义的头部拷贝下来,在后面加个分号就是函数声明语句原创 2016-04-27 11:00:49 · 2944 阅读 · 0 评论 -
数组的灵活应用
数组是一种重要的数据结构,用来存放同类型的若干个数据。由于在内存中这些数据连续存放,所以可以用下标进行快速访问。灵活应用数组经常可以起到简化程序,提高效率的作用。下面我们以教材上的一道课后题为例来说明。 例:在海军节开幕式上,A、B、C三条军舰要同时开始鸣放礼炮各21响。已知A舰每隔5秒放1次,B舰每隔6秒放1次,C舰每隔7秒放1次。假设各炮手对时间的掌握非常准确,请编程计算观众总共听到原创 2016-05-02 11:18:27 · 1361 阅读 · 0 评论 -
位运算与字母大小写转换
声明:这些内容主要是面向C语言的初学者,尤其是正在学习C语言的学生。 在读王爽老师的《汇编语言》时,看到了用and 和or指令处理字母大小写转换的例子。and 和or是汇编语言中按位与和按位或操作的指令,对应C语言中的&和|操作。本文把这个例子的C语言版在这里重复一下,以便理解和扩充位运算的应用。 我们知道大小写字母的ASCII码值差32,因此我们通常采用直接加减32的方法原创 2016-04-21 09:01:21 · 5609 阅读 · 4 评论 -
C语言求余运算符的使用
C语言的算数运算符中最有特点的是求余运算符%,它可以应用到很多问题的求解中,下面是几个例子。例1: 输出1到100的整数,要求每行输出5个。每行输出5个,意味着在5,10,15,20…等5的倍数的数字后面需要输出换行,而这些数的共同的特点是能被5整除,余数为0,描述成条件即为:i%5==0。#include "stdio.h"int main(){ int i; ...原创 2018-10-10 11:55:25 · 54769 阅读 · 0 评论