C实例编程
通过一些C的小实例编程,来学习和体会C的方便以及强大,同时学习一些通过C实现一些小算法,本专栏是跟着《C实例编程》一书,边学习,边编程。每一个实例都能学到新的知识,不仅仅是C语言的,更多的是一些算法的思想,以及如何优雅的写出C程序。
天堂1223
这个作者很懒,什么都没留下…
展开
-
C实现两个文件的内容输出到同一个屏幕
编制一个程序,实现将两个文件的内容同时显示在屏幕上,并且最左边的第1-30列 显示文件1的内容,右边第41-70列显示文件2的内容;第75-76列显示两文件该行字符总和,其余列显示空白符。另外,每输出20行内容后,另输出2行空行。下面看一下我的函数实现:#include <stdio.h>#include <stdlib.h>#define size 31char file1[size];cha原创 2015-09-06 15:27:06 · 1861 阅读 · 0 评论 -
统计文件中字符个数
所谓“文件”是指一组相关数据的有序集合。这个数据集有一个名称 叫做文件名。文件通常是驻留在外部介质上的,在使用的时候才调 入内存中。就文件的分类,有很多种分类方式,在这里我们看一下文件编码方式。 根据文件的编码方式,文件可以分为ASCII码文件和二进制文件。 ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个 字节,用于存放对应的ASCII码。例如,数字5678的存储形式原创 2015-09-02 09:49:22 · 17354 阅读 · 1 评论 -
模拟社会关系
本实例有求设计一个模拟社会关系的数据结构,每个人的信息用结构表示,包含名字,性别和指向父亲,母亲,配偶,子女的指针(设只限两个子女)。要求编写以下函数:增加一个新人的函数 建立人与人之间关系的函数,父子 、母子、配偶等 检查某两人之间是否是堂兄妹该实例的主要目的是联系C中结构体的使用,下面是函数的实现:#include <stdio.h>#include <stdlib.h>#inclu原创 2015-07-11 10:41:08 · 1828 阅读 · 2 评论 -
报数游戏
(1):问题提出设由n个人站成一个圈,分别编号1,2,3,4….n。从第一个人开始报数每次报数为m的人被从圈中推出,其后的人再次从1开始报数,重复上述过程, 直至所有人都从圈中退出。要求程序由用户输入整数m和n,求这n个人从圈中推出的先后顺序。(2):解决思路可利用链表求解这个问题,先由n形成一个有n个表元组成的环,其中n个表元依次置值1~n。然后,从环的第一个表元出发,连续掠过m-1个表元,第m-原创 2015-07-05 12:41:00 · 1015 阅读 · 0 评论 -
使用“结构”统计学生成绩
设学生信息包括学号,姓名和五门功课的成绩,要求编写输入输出 学生信息的函数。在输入一组学生信息后,以学生成绩的总分从高 到低顺序输出学生信息。这个相对来说比较简单,可以创建一个学生的结构体,结构体里面有三个成员:学号,姓名和五门功课的成绩。下面请看一下我的整体代码。这个思路也比较简单,主要是为了练习使用结构体。#include <stdio.h>#include <stdlib.h>#i原创 2015-06-19 01:34:28 · 2185 阅读 · 0 评论 -
扑克牌的结构定义
使用结构定义一副扑克牌,并对变量赋值 扑克牌有四种花色:草花,方块,红心和黑桃,可将花色说明为枚举类型。扑克牌类型为结构类型,包含两个成分:分别存储牌的花色和牌的面值,其中面值为字符数组。下面是代码的实现部分:#include <stdio.h>#include <stdlib.h>#include <string.h>/** * 使用结构定义一副扑克牌, * 并对变量赋值 * * 扑原创 2015-06-16 10:49:44 · 5084 阅读 · 0 评论 -
通讯录的输入输出
在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名为字符型,学号为整型或字符型,年龄为整型,性别为字符型,成绩为整型或实数型别,显然,不能使用一个数组来存放这一组数据。因为数组中各个元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型–结构。他相当于其他高级语言中的记录。“结构”是一种构造类型,他是由若干“成员”组成的。每一个成员可原创 2015-06-15 10:06:02 · 1999 阅读 · 0 评论 -
C实例--判断一个字符串是否是回文数
回文是指顺读和反读内容均相同的字符串,例如”121”,”ABBA”,”X”等。本实例将编写函数判断字符串是否是回文。引入两个指针变量,开始时,两个指针分别指向字符串的首末字符,当两个指针所指字符相等时,两个指针分别向后和向前移动一个字符位置,并继续比较,直到两个指针相遇,说明该字符串是回文,如果比较过程中发现两个指针指向的字符不相等,则判断该字符串不是回文。下面是代码的实现部分:#include <原创 2015-06-10 09:34:17 · 5018 阅读 · 0 评论 -
C实现字符排列
用已知字符串s中的字符,生成由其中n个字符组成的所有字符的排列。设n小于字符串s的字符个数,其中s中的字符在每个排列中最多出现一次。 例如,对于s[]=”abc”,n=2,则所有字符的排列有:ba,ca,ab,cb,ac,bc。算法思想: 使用递归完成该实例。举个例子:s = “abc”,n=2则第一个perm(n,s),即perm(2,”abc”);首先需要判断w中的字符个数是否满足,n原创 2015-06-10 08:58:12 · 1551 阅读 · 3 评论 -
C实现字符行排版
将字符行内单字之间的空白符平均分配插入到单字之间,以实现字符行排版。首先要统计字符行内单字个数,字符行内的空白字符数。然后计算单字之间 应该平均分配的空白字符数,另外约定多余的空白字符插在前面的单字间隔中前面的每个间隔多一个空白符,插完为止。下面是我的代码的实现部分,这个字符行排版代码比较简答,其中的,实现统计单词个数的方法还是值得大家学习一下的。#include <stdio.h>#define原创 2015-05-26 16:55:14 · 1722 阅读 · 0 评论 -
从键盘读入实数
编制一个从键盘读入实数的函数readreal(double *rp)。函数将读入的实数字符列换成实数后,利用指针参数rp,将实数存于指针所指向的变量*rp。解析: 函数在返回之前,将最后读入的结束实数字符列的字符返还给系统,以便随后读字符时能再次读入该字符。函数若能正常读入实数,函数返回整数1,如果函数在读入过程中,未遇到数字符之前,遇到不能构成数字的情况,函数返回-1,表示为读到实数。在输入实数原创 2015-05-18 01:33:11 · 2166 阅读 · 0 评论 -
字符替换
编制一个字符替换函数rep(char *s,char *s1,char *s2),实现将已知字符串s中所有属于字符串s1中的字符都用字符串s2中的对应字符代替。这里使用指针实现。举个例子: char s[] = “ABCABC”;char s1[] = “AB”;char s2[] = “XY”;运行该函数之后,变为”XBYXBY”那么可以这么想,s1和s2分别位于两个数组中,从s的第一个原创 2015-05-16 15:42:30 · 1153 阅读 · 0 评论 -
整数转换成罗马数字
编写一个将整数n(1 <= n <= 9999)转换成罗马数字。整数n(1<=n<=9999)与罗马数字表示有以下对应关系 1000 - m,有几个1000就有几个m对应900 - 两个字符cm500 - 一个字符d400 - 两个字符cd100 - 一个字符c,有几个100就用几个c表示90 - 两个字符xc50 - 一个字符l40 - 两个字符xl10 - 一个字符x,有一个原创 2015-05-15 21:16:36 · 1976 阅读 · 0 评论 -
寻找相同元素的指针
此实例的要求是在两个已经摆好顺序的数组寻找第一个相同的元素在第一个数组中的指针。这个实例的思想比较好,如果我来做的话,就是先从第一个数组的第一个元素开始,每次取出一个元素,与第二个数组的每一个元素进行比较,当元素值相等的时候,返回元素的指针。但是在此实例中,使用了另外一种思想,在我看来降低了程序的时间复杂度。其思想为:由于两个数组都已经排好顺序,则分别从两个数组的第一个元素开始,比较大小,将较小的元原创 2015-05-14 13:48:30 · 1085 阅读 · 0 评论 -
寻找指定元素
在已知数表中找出第一个与指定值相等的元素的下标和指针。这个实例还是比价简单的。我的思路是,首先创建一个struct结构,该结构中有两个成员变量,一个是数组元素的下标,一个是数组元素的指针值,当程序进程查找的时候,将找到的结果保存到该结构上。下面是我的程序的实现部分:#include <stdio.h>#define SIZE 100/** * @brief The element struct原创 2015-05-11 20:39:06 · 871 阅读 · 0 评论 -
指向数组的指针
指向数组的指针变量成为数组指针变量。一个数组是由连续的一块内存单元组成的。数组名就是这块连续内存单元的首地址。该实例我们实现了使用数组的指针引用数组,利用数组名以及下标引用数组等。其中,使用数组的指针和数组的下标来遍历数组的时候可能不太容易理解,但是我已经在注释中说明清楚了。下面附上我的代码:#include <stdio.h>/** * 本实例实现通过指向数组的指针引用数组, * 利用数组名以原创 2015-05-10 00:18:12 · 1474 阅读 · 0 评论 -
使用指针比较整型数据的大小
该C实例是一个比较简单的实例,但是在该实例中,重点介绍了C语言中比较常用的也是容易出错的指针变量,其中包括指针变量的赋值,指针变量的运算等等。该实例实现了通过使用指针变量来比较3个整形数据,使其从小到大排列,实现比较简单,下面附上我的代码:#include <stdio.h>/** * 通过指针比较三个整数的大小 * @brief main * @return *//** * 指针,即为变原创 2015-05-09 23:34:29 · 4581 阅读 · 0 评论 -
钢材切割问题
已知钢材的总长,订单数和各订单需要的长度编制程序从订单中选择一组订单对钢材作切割加工, 使得钢材得到最佳应用,约定,每次切割损耗固定长度的钢材。下面写一下我的思路,刚开始没有想明白应该怎么使用递归去做,但是,看了他们的代码之后,走了一遍,才明白,其实思路不太好想,但是实现起来还是比较容易的。假设,我们有一段钢材,长度为12米,其中有3个订单,分别需要的长度为5,6,9米,每次切割总会有2米的损耗,求原创 2015-05-08 02:43:00 · 4976 阅读 · 0 评论 -
C使用递归实现前N个元素的和
递归函数,也就是不断的调用自身的函数,使用递归能够比较方便的解决一些比较难使用循环解决的问题。就在这个例子中,求一个数组a[]的前n项和,也就是求a[n-1]+a[n-2]+…+a[0],那么如果一个函数sum是用来求数组前n项和的,sum定义为sum(int a[],int n),则使用递归的方式就是 a[n-1]+sum(a,n-1)。使用代码来表述可能更好一些:#include <stdio原创 2015-04-29 16:17:58 · 2382 阅读 · 0 评论 -
C判断一个正整数n的d进制数是否是回文数
所有的有关于回文数的定义和如何判断一个n的d进制数是否是回文数的方法都在我的代码注释当中,直接上代码:#include <stdio.h>int circle(int n,int d);/** * @brief main 判断正整数n的d进制表示是否是回文数 * @return */int main(void){ /** * 回文数,就是顺着看和倒着看相同的书,例如n=原创 2015-04-26 03:48:22 · 3092 阅读 · 0 评论 -
C实现任意进制数的转化
该实例要求使用C实现一个无符号整数到[2,16]进制数的转换。这个还是比较好想的,就是对该无符号整数不断的斤进制数d取余数,取商,一直做这样的运算,直到商为0为止,将所有的余数按照从后往前的顺序穿起来,就是转换后的进制数。下面上我的代码:#include <stdio.h>/** 用于声明char数组的长度 **/#define M (sizeof(unsigned int) * 8)int tr原创 2015-04-24 14:19:47 · 5540 阅读 · 0 评论 -
C实现数组中元素的排序
使用C实现数组中元素的排序,使得数组中的元素从小到大排列。只不过在这个过程中出了一点小问题,在C中进行数字交换的时候,必须要使用指针的,不能使用引用。在后面的文章中,我要学习一个在C中的引用和指针的区别。下面看一下我的代码吧。#include <stdio.h>void swap(int *a,int *b);void rest(int lels[],int count);/** * 该实例用于原创 2015-04-24 02:03:59 · 2434 阅读 · 7 评论 -
C实现万年历
要求:输入年份输出这一年的日历 注意:公元1900年一月一日是星期一,这一年是平年 思路:获取输入的年份y,首先获取从公元1900年到(y-1)年 的天数,然后获得该年份的第一天是星期几,进行输出。这次实例,我花费了很长的时间,最后发现错误的原因出在在求某一年是闰年还是平年的时候,我没有田间return语句,也就是没有返回值,真是醉了。我感觉这次我写代码的时候一点感觉都没有。哎,真是的,一颗老原创 2015-04-20 01:43:18 · 4739 阅读 · 6 评论 -
利用数组求前n个质数
我的算法思想和实现方式都在代码和注释当中呢,这样的方式确实使算法复杂度降低一个等级,很好啊。#include <stdio.h>#include <time.h>/** * 利用数组求前n个质数 * 确定一个数m是否为质数,可以用已求出的质数对m * 的整除性来确定 *///如果不知道质数的特性和想不到优化思路的方法void getNPrimes_normal();//优化之后的方法v原创 2015-04-18 02:58:31 · 2820 阅读 · 0 评论 -
C二维数组练习
这次实例的要求是:* 在n行n列的二维整数数组中,* 按照以下要求选出两个数。 * 首先从每行中选出最大数,在从选出的n个最大数中选出最小数;* * 其次,从每行选出最小数,再从选出的n个小数中选出最大数。*下面就是我的代码,在注释中可以看到我的想法:#include <stdio.h>/** * 实例要求: * 在n行n列的二维整数数组中, * 按照以下要求选出两个数。 * 首原创 2015-04-17 23:29:28 · 2178 阅读 · 0 评论 -
C数组实现矩阵的转置
直接上代码,在代码中有对矩阵的学习,包括初始化学习以及如何使用等。#include <stdio.h>/** * 给出提示,要求输入数组A * ,通过二维数组,进行数组的转置 * 得出数组B,输出结果 * * 该实例主要是为了进行学习二维数组 * @brief main * @return */int main(void){ /** * 二维数组的初始化:原创 2015-04-14 17:41:48 · 3248 阅读 · 0 评论 -
记录一个班级的成绩练习一维数组
直接上代码,mark一下:嘿嘿#include <stdio.h>/** * 记录并统计一个班的学生的成绩来 * 练习一维数组的使用 */int main(void){ int count; printf("How many students are in your class?\n"); scanf("%d",&count); //获取班级中学生的数量 /*原创 2015-04-08 17:05:27 · 1808 阅读 · 0 评论 -
使用C模拟ATM练习switch..case用法
这个实例很简单,看一下就能明白,至于我已经对C比较熟悉了,为什么还要从这么简单的例子入手,这个需要再详细的说明一下。由于之前学习C的时候,就是急功近利,没有仔细的去品味C中,特别是指针中的一些乐趣,所以我选择从基础再学习一遍,就这样咯。#include <stdio.h>/** * 实现自动取款机界面的模拟来学习使用switch语句 * switch...case语句的结构 * switch(原创 2015-04-08 15:43:31 · 1539 阅读 · 0 评论 -
C实现一个比较简单的猜数游戏
为了练习使用do..while和while,特地使用此实例,一个简单的猜数游戏对while循环进行的练习使用。所有的东西都在注释当中:#include <stdio.h>#include <conio.h>/********************************** * 该实例用于实现一个简单的猜数字的游戏 * 主要用于练习使用while循环 * 开始的时候需要用户输入游戏密码(1原创 2015-04-07 14:03:59 · 2226 阅读 · 0 评论 -
C实现的九九乘法表
为了加深对C语言中for循环的理解,学习实例写出了九九乘法表,相对来说比较简单。#include <stdio.h>/************************************** * 本实例用于输出一个九九乘法表 * 用于继续练习for语句 **************************************/int main(void){ /**原创 2015-04-07 13:19:42 · 1260 阅读 · 0 评论 -
C学习if条件判断和for循环
通过学习if条件判断和for循环之后,做了一个实例。实现的实例都在代码中有详细的注释。#include <stdio.h>/****************************************************** * 输入一个数字n,求 * 1+1+2+1+2+3+1+2+3+4...+n * 该实例主要为了练习if语句和for语句 *******************原创 2015-04-07 13:07:17 · 1515 阅读 · 0 评论 -
自增/自减学习
在这里学习了C中的自增和自减,但是后面学习了前缀和后缀及其混合之后,发现使用不同的编译器,其中的规则是不一样的,而且平时我们书写程序的时候也不会写这样复杂的代码,例如i+++i+++i++等,这样一方面在可读性方面很差,另一方面就是在移植性方面,不同的编译器就会出现不同的结果,所以这样写是不理想的。#include <stdio.h>/** * 自增/自减运算的应用 * @brief main原创 2015-04-01 23:17:12 · 844 阅读 · 1 评论 -
sizeof()保留字获取类型的大小
学习了sizeof保留字来获取不同变量所占的字节数。不过该字节数是跟机器相关的。#include <stdio.h>/** * 输出常用变量的大小 * @brief main * @return */int main(void){ printf("%s\n","Now We will print the size of the variable."); /**输出short原创 2015-04-01 19:42:06 · 793 阅读 · 0 评论 -
实数比较
要求用户输入两个实数,程序通过比较之后,输出最大的数。 在这里学习到了三目运算符。#include <stdio.h>/** * 用户输入两个实数,输出最大的实数 * @brief main * @return */int main(void){ float x,y; float c; printf("%s\n","please input two number(原创 2015-04-01 19:25:36 · 847 阅读 · 0 评论 -
scanf函数学习
直接上代码,因为我的所有的学习过程都在注释里面呢。#include/** * 这篇主要学习的是scanf函数 * 经过查阅资料才会发现 * scanf函数里面还是有很多东西的 * * @brief main * @return */int main(void){ int a; //int类型 char b;原创 2015-04-01 16:08:25 · 710 阅读 · 0 评论 -
实例一:HelloWorld
作为C语言来说,我是用的是QT Creator作为开发工具。其实使用什么工具无所谓,重要的是学到有用的知识。第一个实例程序就是HelloWorld程序,上代码:/**包含进printf函数所在的库,以便程序编译的* 时候能够找到其中的函数定义*/#include /** * 在C语言的程序开发中,main函数是不可缺少的 * main函数就是程序的原创 2015-04-01 16:02:31 · 931 阅读 · 0 评论