已完结:C语言经典100题目(满足所有C程序基础)_c语言练习题
C 练习实例1 - 组无重复数字的数
题目:有 1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
程序分析:可填在百位、十位、个位的数字都是 1、2、3、4,组成所有的排列后再去掉不满足条件的排列。
#include#define MAX 5int main() { int i,j,k; int count = 0; for (int i = 1; i < MAX; i++) { for (int j = 1; j < MAX; j++) { for (int k = 1; k < MAX; k++) { //一步将三个位置数不重复的条件满足 if(i != j && i != k && j != k) { printf(\"%d%d%d\\n\",i,j,k); count++; } } } } printf(\"%d\",count);}
C 练习实例2 - 阶段利润提成
题目:企业发放的奖金根据利润提成。
- 利润(I)低于或等于10万元时,奖金可提10%;
- 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
- 20万到40万之间时,高于20万元的部分,可提成5%;
- 40万到60万之间时高于40万元的部分,可提成3%;
- 60万到100万之间时,高于60万元的部分,可提成1.5%;
- 高于100万元时,超过100万元的部分按1%提成。
从键盘输入当月利润I,求应发放奖金总数?
程序分析:定义时需把奖金定义成双精度浮点(double)型。
#include#define LAC 100000 //将10w定义为一个常用数int main() { double i,bonus,bonus_0_10,bonus_10_20,bonus_20_40,bonus_40_60,bonus_60_100,bonus_100_; //先计算好各自区间的奖金,避免重复输入公式 bonus_0_10 = LAC * 0.1; bonus_10_20 = LAC * 0.075; bonus_20_40 = LAC * 2 * 0.05; bonus_40_60 = LAC * 2 * 0.03; bonus_60_100 = LAC * 4 * 0.015; printf(\"从键盘输入当月利润I,求应发放奖金总数:\\n\"); scanf(\"%lf\",&i); if(i<=LAC) { bonus = i * 0.1; } else if(i<=LAC*2){ bonus = bonus_0_10 + (i - LAC) * 0.075; } else if(i<=LAC*4){ bonus = bonus_0_10 + bonus_10_20 + (i - LAC * 2) * 0.05; } else if(i<=LAC*6){ bonus = bonus_0_10 + bonus_10_20 + bonus_20_40 + (i - LAC * 4) * 0.03; } else if(i<=LAC*10){ bonus = bonus_0_10 + bonus_10_20 + bonus_20_40 + bonus_40_60 + (i - LAC * 6) * 0.015; } else { bonus = bonus_0_10 + bonus_10_20 + bonus_20_40 + bonus_40_60 + bonus_60_100 + (i - LAC * 10) * 0.01; } printf(\"求应发放奖金总数为%lf\",bonus);}
C 练习实例3 - 完全平方数
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
程序分析:
假设该数为 x。
1、则:x + 100 = n^2, x + 100 + 168 = m^2;
2、计算等式:m^2 - n^2 = (m + n)(m - n) = 168;
3、设置: m + n = i,m - n = j,i * j =168,i 和 j 至少一个是偶数;
4、可得: m = (i + j) / 2, n = (i - j) / 2,i 和 j 要么都是偶数,要么都是奇数;
5、从 3 和 4 推导可知道,i 与 j 均是大于等于 2 的偶数;
6、由于 i * j = 168, j>=2,则 1 <= i <= 168 / 2 ;
7、接下来将 i 的所有数字循环计算即可。x即为100-n^2。
#includeint main() { int i,j,x,m,n; printf(\"---------------------------------------\\n\"); for (i = 2; i j if(i>j && (i+j)%2 == 0 && (i-j)%2 == 0) { m = (i+j)/2; n = (i-j)/2; x = n*n -100; printf(\"%d + 100 = %d ^ 2\\n\",x,n); printf(\"%d + 100 + 168 = %d ^ 2\\n\",x,m); printf(\"---------------------------------------\\n\"); } } }}
C 练习实例4 - 判断当年第几天
题目:输入某年某月某日,判断这一天是这一年的第几天?
程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。
#includeint main() { int year,month,day,leap; printf(\"请输入 年,月,日 可判断这一天是该年第几天(包含逗号):\\n\"); scanf(\"%d,%d,%d\",&year,&month,&day); int sum = 0; switch (month) { case 1: sum = 0; break; case 2: sum = 31; break; case 3: sum = 59; break; case 4: sum = 90; break; case 5: sum = 120; break; case 6: sum = 151; break; case 7: sum = 181; break; case 8: sum = 212; break; case 9: sum = 243; break; case 10: sum = 273; break; case 11: sum = 304; break; case 12: sum = 334; break; } //case中的sum是在本月前所有月份的天数之和 sum = sum + day; // 判断是否为闰年,leap根据其为0或1 if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) { leap = 1; } else { leap = 0; } //如果月份不在2月之后只是1,2月;则2月是否闰月不影响天数 if(leap == 1 && month>2) { sum++; } printf(\"第%d天\",sum);}
C 练习实例5 - 三个数由小到大
题目:输入三个整数 x、y、z,请把这三个数由小到大输出。
程序分析:我们想办法把最小的数放到 x 上,先将 x 与 y 进行比较,如果 x>y 则将 x 与 y 的值进行交换,然后再用 x 与 z 进行比较,如果 x>z 则将 x 与 z 的值进行交换,这样能使 x 最小。
#includevoid swap(int *a,int *b) { int t; t = *a; *a = *b; *b = t;}int main() { int x,y,z; printf(\"输入三个整数 x,y,z,请把这三个数由小到大输出:\\n\"); scanf(\"%d,%d,%d\",&x,&y,&z); //输入三个整数 x、y、z,请把这三个数由小到大输出 if(x>y){ swap(&x,&y); } else if(x>z){ swap(&x,&z); } else if(y>z){ swap(&y,&z); } printf(\"%d %d %d\",x,y,z);}
C 练习实例6 - 输出字母C图案
题目:用*号输出字母C的图案。
程序分析:可先用\'*\'号在纸上写出字母C,再分行输出。
#includeint main() { printf(\"用 * 号输出字母 C!\\n\"); printf(\" ****\\n\"); printf(\" *\\n\"); printf(\"*\\n\"); printf(\" *\\n\"); printf(\" ****\\n\");}
C 练习实例7 - 特殊图案
题目:输出特殊图案,请在c环境中运行,看一看,Very Beautiful!
程序分析:字符共有256个。不同字符,图形不一样。
VC6.0下出现中文乱码(原因+解决方法):
176的16进制是B0,219的16进制是DB,0xB0DB是\"佰\"字的内码,所以输出的就是\"佰\"了。
主要原因是文件信息的代码页不同,我们所使用的操作系统中文状态下的代码页,要显示扩展的ASCII码需要在437 OEM-美国这个下面显示,这样就可以显示出你所希望的。具体修改控制台的默认代码页步骤如下:
- 1.点击运行界面左上角标题栏图标【c:\\】,选择默认值一项
- 2.修改默认代码页,936(ANSI/OEM-简体中文GBK)为437 OEM-美国
- 3、关闭后重新运行一下即可
#includeint main(){ char a=176,b=219; printf(\"%c%c%c%c%c\\n\",b,a,a,a,b); printf(\"%c%c%c%c%c\\n\",a,b,a,b,a); printf(\"%c%c%c%c%c\\n\",a,a,b,a,a); printf(\"%c%c%c%c%c\\n\",a,b,a,b,a); printf(\"%c%c%c%c%c\\n\",b,a,a,a,b); return 0;}
C 练习实例8 - 9*9 乘法表
题目:输出 9*9 口诀。
程序分析:分行与列考虑,共 9 行 9 列,i 控制行,j 控制列。
#include#define MAX 9int main() { int i,j,result; for (i = 1; i <= MAX; ++i) { for (j = 1; j <= i; ++j) { result = i*j; printf(\"%d * %d = %d \",i,j,result); } printf(\"\\n\"); }}
C 练习实例9 - 国际象棋棋盘
题目:要求输出国际象棋棋盘。
程序分析:国际象棋棋盘由64个黑白相间的格子组成,分为8行*8列。用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格。
如果出现乱码情况请参考本博客【C 练习实例7】的解决方法。
#include int main(){ int i,j; for(i=0;i<8;i++) { for(j=0;j<8;j++) if((i+j)%2==0) printf(\"%c%c\",219,219); else printf(\" \"); printf(\"\\n\"); } return 0;}
C 练习实例10 - 打印笑脸
题目:打印楼梯,同时在楼梯上方打印两个笑脸。
程序分析:用 ASCII 1 来输出笑脸;用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数。
如果出现乱码情况请参考【C 练习实例7】的解决方法。
#includeint main(){ int i,j; printf(\"\\1\\1\\n\"); /*输出两个笑脸*/ for(i=1;i<11;i++) { for(j=1;j<=i;j++) printf(\"%c%c\",219,219); printf(\"\\n\"); } return 0;}
C 练习实例11 - 斐波那契
题目:古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)
程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....,即下个月是上两个月之和(从第三个月开始)。
#includeint fibonacci(int n) { if(n<2) { return n; } return fibonacci(n-1)+fibonacci(n-2);}int main(){ int n,result; printf(\"输入一个大于0的数字,求斐波那契数列第n项\\n\"); scanf(\"%d\",&n); result = fibonacci(n); printf(\"结果是:%d\",result);}
C 练习实例12 - 101到200的素数
题目:判断 101 到 200 之间的素数。
程序分析:判断素数的方法:用一个数分别去除 2 到 sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
#include #includebool isPrime(int num) { if(num <= 1) return false; // 小于1的都不是素数 if (num == 2) return true; // 2是素数 if(num%2 == 0) return false; //能被2整除说明不是素数 for (int i = 3; i * i <= num; i += 2) { if(num%i == 0) return false; // 能有非1的数i整除说明不是素数 } return true; // 通过了重重考验,说明是素数}int main(){ int count = 0; for (int i = 101; i <= 200; ++i) { if(isPrime(i)) { count++; printf(\"%d\\n\",i); } } printf(\"一共有%d个素数\",count);}
C 练习实例13 - 水仙花数
题目:打印出所有的\"水仙花数\",所谓\"水仙花数\"是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个\"水仙花数\",因为153=1的三次方+5的三次方+3的三次方。
程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
#include #include#define MAX 1000int main(){ int i,g,s,b;// 分别是 个 十 百 位; for (int i = 100; i < MAX; ++i) { b = i / 100; s = (i%100)/10; g = (i%100)%10; if( i == g*g*g+ s*s*s + b*b*b ) { printf(\"%d\\n\",i); } }}
C 练习实例14 - 分解质因数
题目:将一个正整数分解质因数。例如:输入 90,打印出 90=2*3*3*5。
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
- (1)如果这个质数恰等于(小于的时候,继续执行循环)n,则说明分解质因数的过程已经结束,另外 打印出即可。
- (2)但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n.重复执行第二步。
- (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。
#include //一个数n,从2开始除以。如果2能一直整除就没有4,6,8...的事情了//不能除以2则试3,以此类推5,7...void Prime_Factors(int n) { int prime = 2;// 除了1的最小素数 printf(\"%d =\",n); while (n>1) { if(n%prime == 0) { n = n/prime; printf(\" %d\",prime); if(n>1) { printf(\" *\"); } } else { prime++; // 3,5,7... } }}int main() { int num; printf(\"请输入一个整数:\\n\"); scanf(\"%d\",&num); Prime_Factors(num);}
C 练习实例15 - (a>b)?a:b
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
程序分析:(a>b)?a:b这是条件运算符的基本例子。
#include int main() { int num; char grade; printf(\"请输入一个分数:\\n\"); scanf(\"%d\",&num); grade = ((num >= 90)?\'A\':(num>60)?\'B\':\'C\'); printf(\"评价是%c\",grade);}
C 练习实例16 - 公约数&公倍数
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
程序分析:
(1)最小公倍数=输入的两个数之积除于它们的最大公约数,关键是求出最大公约数;
(2)求最大公约数用辗转相除法(又名欧几里德算法)
#include int gcd(int a,int b) { while (b != 0) { int temp = b; // 把b存进temp里面 b = a % b; // 一直到b = 0 a = temp; } return a;}int lcm(int a,int b) { return (a*b)/gcd(a,b);}int main() { int m, n; printf(\"请输入两个正整数 m 和 n: \\n\"); scanf(\"%d,%d\", &m, &n); // 计算最大公约数和最小公倍数 int gcd_value = gcd(m, n); int lcm_value = lcm(m, n); // 打印结果 printf(\"最大公约数 (GCD) = %d\\n\", gcd_value); printf(\"最小公倍数 (LCM) = %d\\n\", lcm_value);}
C 练习实例17 - 统计字母、数字等
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
程序分析:利用while语句,条件为输入的字符不为\'\\n\'。
#include int main() { char c; int letterCount = 0, spaceCount = 0, digitCount = 0, otherCount = 0; printf(\"请输入一些字符:\\n\"); while ((c = getchar()) != \'\\n\') { if ((c >= \'a\' && c = \'A\' && c = \'0\' && c <= \'9\') { digitCount++; } else if (c == \' \') { spaceCount++; } else { otherCount++; } } printf(\"字母 = %d, 数字 = %d, 空格 = %d, 其他 = %d\\n\", letterCount, digitCount, spaceCount, otherCount); return 0;}
C 练习实例18 - s=a+aa+aaa...
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
程序分析:关键是计算出每一项的值。
#include int Zz(int a,int n) { int zzz = 0; for (int i = 0; i < n; i++) { zzz = zzz * 10 + a; } return zzz;}int main() { int a,n; printf(\"请输入一个数字 a 和 一直到 222...22 多少个 n: \\n\"); scanf(\"%d,%d\", &a,&n); int sum = 0; for (int i = 1; i <= n; ++i) { int result = Zz(a,i); sum += result; } printf(\"结果是 = %d\",sum);}
C 练习实例19 - 完数
题目:一个数如果恰好等于它的因子之和,这个数就称为\"完数\",例如 6=1+2+3 ,请编程找出 1000 以内的所有完数。
程序分析:请参照:C 练习实例14。
#include int SumFactors(int n) { int sum = 1; for (int i = 2; i*i < n; ++i) { if(n%i == 0) { sum += i; if(n/i != i) { sum += n/i;//既然i是,那么n/i肯定也是(一对) } } } return sum;}int main() { int limit = 1000; printf(\"1000以内的完数有:\\n\"); for (int num = 2; num <= limit; num++) { if (SumFactors(num) == num) { printf(\"%d\\n\", num); } }}
C 练习实例20 - 球落下反弹
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
程序分析:见下面注释。
#include int main() { double height = 100.0; // 初始高度 double total_distance = 0.0; // 总经过的距离 double rebound_height = height; // 反弹的高度 // 第一次下落的距离 total_distance += height; // 计算第2次到第10次的总经过距离 for (int i = 1; i <= 9; i++) { rebound_height /= 2; // 每次反弹高度是上次的一半 total_distance += 2 * rebound_height; // 每次反弹后下落的距离(上下各一次) } // 第10次反弹的高度 rebound_height /= 2; // 第10次反弹的高度是第9次反弹高度的一半 // 输出结果 printf(\"总经过的距离: %.2f 米\\n\", total_distance); printf(\"第10次反弹的高度: %.2f 米\\n\", rebound_height); return 0;}
C 练习实例21 - 猴子吃桃
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
程序分析:采取逆向思维的方法,从后往前推断。
1) 设x1为前一天桃子数,设x2为第二天桃子数, 则:
x2=x1/2-1, x1=(x2+1)*2
x3=x2/2-1, x2=(x3+1)*2
以此类推: x前=(x后+1)*2
2) 从第10天可以类推到第1天,是一个循环过程。
#includeint main() { int peach = 1;//第10天的桃子数 for (int i = 10; i > 1; i--) { peach = (peach + 1) * 2;//循环9次即可,十个数之间九个空 } printf(\"第一天摘了 %d 个桃子\\n\", peach);}
C 练习实例22 - 乒乓球推理
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
#includeint main() { char i, j, k; // i, j, k分别代表甲队队员a, b, c的对手,即乙队的x, y, z for (i = \'x\'; i <= \'z\'; i++) { // 遍历乙队队员x到z for (j = \'x\'; j <= \'z\'; j++) { // 遍历乙队队员x到z,确保j不等于i(避免a与x比赛) if (i != j) { // 确保不重复 for (k = \'x\'; k <= \'z\'; k++) { // 遍历乙队队员x到z,确保k不等于i和j(避免c与x或z比赛) if (i != k && j != k) { // 确保不重复且满足条件 printf(\"赛手名单是 a-%c\\tb- %c\\tc- %c\\n\", i, j, k); // 输出满足条件的比赛名单 } } } } } return 0; // 程序结束}
C 练习实例23 - 打印图案
题目:打印出如下图案(菱形)。
* *** ************ ***** *** *
#include int main() { int n = 4; // 这是中间行的星号数量的一半 // 打印菱形的上半部分(包括中间行) for (int i = 0; i < n; i++) { // 打印空格 for (int j = 0; j < n - i - 1; j++) { printf(\" \"); } // 打印星号 for (int k = 0; k = 0; i--) { // 打印空格 for (int j = 0; j < n - i - 1; j++) { printf(\" \"); } // 打印星号 for (int k = 0; k < 2 * i + 1; k++) { printf(\"*\"); } printf(\"\\n\"); } return 0;}
C 练习实例24 - 2/1+3/2+5/3...
题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
程序分析:请抓住分子与分母的变化规律。
#includeint fibonacci(int n) { if(n<2) { return n; } return fibonacci(n-1)+fibonacci(n-2);}//有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。int main() { int arr[30];//为了合适,弄了个30个数的数组 double sum = 0.0; double fenshu = 0.0; for (int i = 0; i < 30; ++i) { arr[i] = fibonacci(i); }//1,1,2,3,5,8,13,21....(从0开始) for (int i = 3; i < 23; ++i) { int fenzi = arr[i]; int fenmu = arr[i-1]; fenshu = (double)fenzi/fenmu; sum += fenshu; } printf(\"%f\",sum);}
C 练习实例25 - 求阶乘的和
题目:求 1 + 2! + 3! + ... + 20! 的和。
程序分析:此程序只是把累加变成了累乘。
#includeunsigned long long factorial(int n) { unsigned long long result = 1; for (int i = 1; i <= n; ++i) { result *= i; } return result;}int main() { unsigned long long sum = 0; // 计算1 + 2! + 3! + ... + 20! for(int i = 1; i <= 20; i++) { sum += factorial(i); } // 输出结果 printf(\"1 + 2! + 3! + ... + 20!的和是: %llu\\n\", sum); return 0;}
C 练习实例26 - 递归求阶乘
题目:利用递归方法求5!。
程序分析:
在C语言中,可以使用递归方法来计算阶乘。阶乘的定义是一个正整数 n
的阶乘 n!
等于 n
乘以 n-1
的阶乘。例如,5 的阶乘是 5! = 5 × 4 × 3 × 2 × 1
。
递归的方法是通过函数调用自身来解决问题。计算 n!
的递归方法可以定义如下:
- 基本情况:
0!
和1!
都是1
。 - 递归情况:
n! = n × (n-1)!
。
#includeint factorial(int n) { if(n == 0 || n == 1) { return 1; } else { return n * factorial(n-1); }}int main() { int result = factorial(5); // 计算5! printf(\"5! = %d\\n\", result); // 输出结果 return 0;}
C 练习实例27 - 逆序打印字符
题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
程序分析:在C语言中,scanf
函数可以用来从标准输入读取字符。当使用\"%5s\"
格式说明符时,scanf
会读取最多5个字符,并自动在输入的末尾加上一个空字符(\'\\0\'
),形成一个C字符串。
#includeint reverse(int index, char str[]) { if(index >= 0) { printf(\"%c\",str[index]); reverse(index - 1,str); }}int main() { char str[6];// 自动有一个\'\\n\' int num = 5; printf(\"请输入5个字符:\"); scanf(\"%5s\",str); reverse(num - 1,str);}
C 练习实例28 - 岁数推理
题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。
#includeint getAge(int age) { if(age == 1) { return 10; } else { age = getAge(age - 1) + 2; }}int main() { printf(\"%d\\n\",getAge(5));}
C 练习实例29 - 逆序打印各位数字
题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
程序分析:学会分解出每一位数,如下解释。
#include int main( ){ long a,b,c,d,e,x; printf(\"请输入 5 位数字:\"); scanf(\"%ld\",&x); a=x/10000; /*分解出万位*/ b=x%10000/1000; /*分解出千位*/ c=x%1000/100; /*分解出百位*/ d=x%100/10; /*分解出十位*/ e=x%10; /*分解出个位*/ if (a!=0){ printf(\"为 5 位数,逆序为: %ld %ld %ld %ld %ld\\n\",e,d,c,b,a); } else if(b!=0) { printf(\"为 4 位数,逆序为: %ld %ld %ld %ld\\n\",e,d,c,b); } else if(c!=0) { printf(\"为 3 位数,逆序为:%ld %ld %ld\\n\",e,d,c); } else if(d!=0) { printf(\"为 2 位数,逆序为: %ld %ld\\n\",e,d); } else if(e!=0) { printf(\"为 1 位数,逆序为:%ld\\n\",e); }}
C 练习实例30 - 判断是否回文数
题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
程序分析:学会分解出每一位数。
#includeint main() { int ge,shi,qian,wan,x; printf(\"请输入 5 位数字:\"); scanf(\"%d\",&x); wan = x/10000; qian = x%10000/1000; shi = x%10000%1000%100/10; ge = x%10; if (ge==wan&&shi==qian) { /*个位等于万位并且十位等于千位*/ printf(\"这是回文数\\n\"); } else { printf(\"这不是回文数\\n\"); }}
C 练习实例31 - 判断星期几
题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。
#include int main(){ char i,j; printf(\"请输入第一个字母:\\n\"); scanf(\"%c\",&i); getchar();//scanf(\"%c\",&j);的问题,第二次是读入的一个换行符,而不是输入的字符,因此需要加一个getchar() 吃掉换行符 switch(i) { case \'m\': printf(\"monday\\n\"); break; case \'w\': printf(\"wednesday\\n\"); break; case \'f\': printf(\"friday\\n\"); break; case \'t\': printf(\"请输入下一个字母\\n\"); scanf(\"%c\",&j); if (j==\'u\') {printf(\"tuesday\\n\");break;} if (j==\'h\') {printf(\"thursday\\n\");break;} case \'s\': printf(\"请输入下一个字母\\n\"); scanf(\"%c\",&j); if (j==\'a\') {printf(\"saturday\\n\");break;} if (j==\'u\') {printf(\"sunday\\n\"); break;} default : printf(\"error\\n\"); break; } return 0;}
C 练习实例32 - 删字符串指定字母
题目:删除一个字符串中的指定字母,如:字符串 \"aca\",删除其中的 a 字母。
程序分析:
-
removeChar
函数:- 该函数接受一个字符串
str
和一个要删除的字符charToRemove
。 - 使用两个指针
src
和dst
。src
指向字符串的当前位置,dst
用于保存不需要删除的字符。 - 遍历字符串,如果当前字符不是要删除的字符,则将其复制到
dst
指向的位置,并移动dst
指针。 - 最后,给
dst
指针指向的位置添加字符串终止符\'\\0\'
,完成删除操作。
- 该函数接受一个字符串
-
main
函数:- 定义了一个示例字符串
\"aca\"
和一个要删除的字符\'a\'
。 - 调用
removeChar
函数处理字符串,并打印删除后的结果。
- 定义了一个示例字符串
#include#includevoid RemoveChar(char *str,char removeChar) { int i,j = 0; int len = strlen(str); for (i = 0; i < len; i++) { if(str[i] != removeChar) { str[j] = str[i]; j++; } } str[j] = \'\\0\';}int main() { char str[] = \"aca\"; char removeChar = \'a\'; printf(\"Original string: %s\\n\", str); printf(\"Removed char: %c\\n\", removeChar); RemoveChar(str,removeChar); printf(\"Modified string: %s\\n\", str);}
C 练习实例33 - 判断是否质数
题目:判断一个数字是否为质数。
程序分析:质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除。
#include#includebool isPrime(int number) { if(number <= 1) { return false; } if(number == 2) { return true; } if(number%2 == 0) { return false; } for (int i = 3; i*i <= number; i += 2) { if(number%i == 0){ return false; } } return true;}int main() { int number; printf(\"请输入一个整数: \\n\"); scanf(\"%d\", &number); if (isPrime(number)) { printf(\"%d 是质数。\\n\", number); } else { printf(\"%d 不是质数。\\n\", number); }}
C 练习实例34 - 练习函数调用
题目:练习函数调用。
程序分析:轻松一下 ~ ~ ~
#include void hello_world(void){ printf(\"Hello, world!\\n\");}void three_hellos(void){ int counter; for (counter = 1; counter <= 3; counter++) hello_world();/*调用此函数*/}int main(void){ three_hellos();/*调用此函数*/}
C 练习实例35 - 字符串反转
题目:字符串反转,如将字符串 \"www.csdn.net\" 反转为 \"ten.ndcs.www\"。
程序分析:
reverseString
函数:
- 计算字符串的长度。
- 使用两个指针,一个指向字符串的开始,另一个指向字符串的末尾。
while
循环中,交换两个指针所指向的字符,然后移动指针向中间靠拢,直到两个指针交叉。
#include#include#include reverseString(char str[]) { int length = strlen(str); int start = 0; int end = length - 1; while (start<end) { int temp = str[start]; str[start] = str[end]; str[end] = temp; start++; end--; }}int main() { char str[] = \"www.csdn.net\"; printf(\"原字符串: %s\\n\", str); reverseString(str); printf(\"反转后的字符串: %s\\n\", str); return 0;}
C 练习实例36 - 100内素数
题目:求100之内的素数。
程序分析:质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除。
#include#includeint main(){ int i,j,k,n=0; for(i=2;i<=100;i++) { k=(int)sqrt(i); for(j=2;jk) { printf(\"%d \",i); n++; if(n%5==0) printf(\"\\n\"); } } return 0;}
C 练习实例37 - 各种排序
题目:对10个数进行排序。
程序分析:插入排序,选择排序,冒泡排序。
#include// 插入排序 --从小到大void insertionSort(int arr[],int arrayLength) { int key; for (int i = 1; i =0 && arr[j] > key) { arr[j+1] = arr[j]; j--; } arr[j+1] = key; }}// 选择排序 --从小到大void selectionSort(int arr[],int arrayLength) { int minIndex,temp; // 排好前面n-1个数,最后一个不需要排了 for (int i = 0; i < arrayLength-1; ++i) { minIndex = i; // 此刻正在排第i个索引位置的数,应该放什么数 // j从i的下一个数开始 for (int j = i+1; j < arrayLength; ++j) { if(arr[j]<arr[minIndex]) { minIndex = j; } } temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; }}// 冒泡排序 --从小到大void bubbleSort(int arr[],int arrayLength) { int temp; // i表示轮次, for (int i = 0; i < arrayLength-1; ++i) { // j表示交换位置的索引,因为一共索引就到了arrayLength-1,并且是交换前面arrayLength-1-i个数 for (int j = 0; j < arrayLength-1-i; ++j) { } }}// 打印数组的函数void printArray(int arr[], int n) { int i; for (i = 0; i < n; i++) { printf(\"%d \", arr[i]); } printf(\"\\n\");}int main() { int arr[] = {4,3,5,4,7,5,2,9}; int arrayLength = sizeof(arr) / sizeof(arr[0]); // 获取数组的长度 insertionSort(arr, arrayLength); printf(\"Sorted array: \\n\"); printArray(arr, arrayLength);}
C 练习实例38 - 矩阵对角元素和
题目:求一个3*3矩阵对角线元素之和
程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。
#include#define N 3int main(){ int i,j,a[N][N],sum=0; printf(\"请输入矩阵(3*3):\\n\"); for(i=0;i<N;i++) for(j=0;j<N;j++) scanf(\"%d\",&a[i][j]); for(i=0;i<N;i++) sum+=a[i][i]; printf(\"对角线之和为:%d\\n\",sum); return 0;}
C 练习实例39 - 一个数插入数组
题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。
#include void insert_into_sorted(int brr[], int n, int num) { int i; for (i = n - 1; i >= 0 && brr[i] > num; i--) { brr[i + 1] = brr[i]; } brr[i + 1] = num;}int main() { int arr[] = {1, 3, 5, 6, 7, 9}; int n = sizeof(arr) / sizeof(arr[0]); printf(\"原数组:\\n\"); for (int i = 0; i < n; i++) { printf(\"%d \", arr[i]); } int brr[n+1]; //由于数组长度不可变,故复刻一个比原来数组arr长度大1的数组brr for (int i = 0; i < n; ++i) { brr[i] = arr[i]; } int num = 4; // 要插入的数 insert_into_sorted(brr, n, num); // 打印结果 printf(\"\\n\"); printf(\"新数组:\\n\"); for (int i = 0; i < n+1; i++) { printf(\"%d \", brr[i]); } return 0;}
C 练习实例40 - 数组逆序输出
题目:将一个数组逆序输出。
程序分析:用第一个与最后一个交换。
#include#define N 10int main(){ int a[N]={0,1,2,3,4,5,6,7,8,9}; int i,t; printf(\"原始数组是:\\n\"); for(i=0;i<N;i++) printf(\"%d \",a[i]); for (i = 0; i < N/2; ++i) { t = a[i]; a[i] = a[N-i-1]; a[N-i-1] = t; } printf(\"\\n排序后的数组:\\n\"); for(i=0;i<N;i++) printf(\"%d \",a[i]); printf(\"\\n\"); return 0;}
C 练习实例41 - static用法1
题目:学习 static 定义静态变量的用法。
在 C 语言中,static 关键字用于声明静态变量。静态变量与普通变量不同,它们的生存期和作用域是不同的。静态变量在声明时被初始化,只被初始化一次,而且在整个程序的生命周期内都保持存在。在函数内声明的静态变量只能在该函数内访问,而在函数外声明的静态变量则只能在该文件内访问。
程序分析:以下实例中 x() 函数声明了一个静态变量 x,并将其初始化为 0。每次调用 x() 数时,x 的值都会加 1,并打印出新的值。由于 x 是静态变量,它在程序的整个生命周期中都存在,而不仅仅是在函数调用时存在。因此,每次调用 static_x() 时,它都可以记住 x 的值,并在此基础上递增。
#include#includevoid x(){int x = 0;x++;printf(\"%d\\n\",x);}void static_x(){static int x = 0;x++;printf(\"%d\\n\",x);}int main(){x();x();static_x();static_x();}
C 练习实例42 - auto用法
题目:学习使用auto定义变量的用法。
程序分析:无。
#include int main(){ int i,num; num=2; for(i=0;i<3;i++) { printf(\"num 变量为 %d \\n\",num); num++; { auto int num=1; printf(\"内置模块 num 变量为 %d \\n\",num); num++; } } return 0;}
C 练习实例43 - static用法2
题目:学习使用static的另一用法。
程序分析:无。
#include#includeint main(){int i,num =3;for(i=0;i<3;i++){printf(\"num的值为: %d\\n\",num);num--;{static int num = 1;printf(\"内部模块num的值为: %d\\n\",num);num++;}}}
C 练习实例44 - 调用外部函数
题目:学习使用如何调用外部函数。
程序分析:无。
#include int a,b,c;void add(){ int a; a=3; c=a+b;}int main(){ a=b=4; add(); printf(\"c 的值为 %d\\n\",c); return 0;}
C 练习实例45 - register用法
题目:学习使用register定义变量的方法。
程序分析:无。
#include int main(){ register int i; int tmp=0; for(i=1;i<=100;i++) tmp+=i; printf(\"总和为 %d\\n\",tmp); return 0;}
C 练习实例46 - 宏#define练习1
题目:宏#define命令练习1。
程序分析:无。
#include#define mul(x) x*xint main() { int a = 2; printf(\"%d\",mul(a));}
C 练习实例47 - 宏#define练习2
题目:宏#define命令练习2。
程序分析:无。
#include#define sw(x,y) {int t;t=x;x=y;y=t;}int main(){ int a = 1; int b = 2; printf(\"交换前 %d,%d\\n\",a,b); sw(a,b); printf(\"交换后 %d,%d\\n\",a,b);}
C 练习实例48 - 宏#define练习3
题目:宏#define命令练习3。
程序分析:无。
#define LAG >#define SMA <#define EQ ==#include int main(){ int i,j; printf(\"请输入两个数字:\\n\"); scanf(\"%d %d\",&i,&j); if(i LAG j) printf(\"%d 大于 %d \\n\",i,j); else if(i EQ j) printf(\"%d 等于 %d \\n\",i,j); else if(i SMA j) printf(\"%d 小于 %d \\n\",i,j); else printf(\"没有值。\\n\"); return 0;}
C 练习实例49 - #if,#ifdef,#ifndef
题目:#if #ifdef和#ifndef的综合应用。
程序分析:无。
// #if// #if 指令用于根据表达式的值来决定是否编译某一段代码。表达式的值必须是常量表达式(即在编译时可以确定的值),通常用于定义的常量或宏。/*#define VERSION 2#if VERSION >= 2 // 这段代码只有在 VERSION >= 2 时才会被编译 printf(\"Version 2 or higher\\n\");#else// 这段代码只有在 VERSION < 2 时才会被编译printf(\"Version less than 2\\n\");#endif*/// #ifdef// #ifdef 是 \"if defined\" 的缩写,用于检查一个宏是否已经被定义。如果宏已经被定义,紧随其后的代码块会被编译;如果宏未被定义,这段代码块则会被忽略。/*#define DEBUG#ifdef DEBUG // 只有在 DEBUG 被定义时,这段代码才会被编译 printf(\"Debug mode is enabled\\n\");#endif*/// #ifndef// #ifndef 是 \"if not defined\" 的缩写,用于检查一个宏是否未被定义。如果宏未被定义,紧随其后的代码块会被编译;如果宏已经被定义,这段代码块则会被忽略。/*#ifndef VERSION // 只有在 VERSION 没有被定义时,这段代码才会被编译 #define VERSION 1#endif*/#include#define MAX#define MAXIMUM(x,y)(x>y)?x:y#define MINIMUM(x,y) (x>y)?y:xint main(){ int a=10,b=20;#ifdef MAX printf(\"更大的数字是 %d\\n\",MAXIMUM(a,b));#else printf(\"更小的数字是 %d\\n\",MINIMUM(a,b));#endif#ifndef MIN printf(\"更小的数字是 %d\\n\",MINIMUM(a,b));#else printf(\"更大的数字是 %d\\n\",MAXIMUM(a,b));#endif#undef MAX#ifdef MAX printf(\"更大的数字是 %d\\n\",MAXIMUM(a,b));#else printf(\"更小的数字是 %d\\n\",MINIMUM(a,b));#endif#define MIN#ifndef MIN printf(\"更小的数字是 %d\\n\",MINIMUM(a,b));#else printf(\"更大的数字是 %d\\n\",MAXIMUM(a,b));#endif return 0;}
C 练习实例50 - #include练习
题目:#include 的应用练习。
程序分析:无。
//test.h 文件代码如下:#define LAG >#define SMA <#define EQ ==//主文件代码:#include \"test.h\" #include int main(){ int i=10; int j=20; if(i LAG j) printf(\"%d 大于 %d \\n\",i,j); else if(i EQ j) printf(\"%d 等于 %d \\n\",i,j); else if(i SMA j) printf(\"%d 小于 %d \\n\",i,j); else printf(\"没有值。\\n\"); return 0;}
C 练习实例51 - 按位与 & 使用
题目:学习使用按位与 &。
程序分析:0&0=0; 0&1=0; 1&0=0; 1&1=1 。
#include int main(){ int a,b; a=077; b=a&3; printf(\"a & b(decimal) 为 %d \\n\",b); b&=7; printf(\"a & b(decimal) 为 %d \\n\",b); return 0;}//a = 077;八进制 077 转换为十进制是 63/*00111111 (63 的二进制)&00000011 (3 的二进制)----------00000011 (结果是 3)*/
a & b(decimal) 为 3 a & b(decimal) 为 3
C 练习实例52 - 按位或 | 使用
题目:学习使用按位或 |。
程序分析:0|0=0; 0|1=1; 1|0=1; 1|1=1 。
#includeint main(){ int a,b; a=077; b=a|3; printf(\"b 的值为 %d \\n\",b); b|=7; printf(\"b 的值为 %d \\n\",b); return 0;}
b 的值为 63 b 的值为 63
C 练习实例53 - 按位异或 ^ 使用
题目:学习使用按位异或 ^。
程序分析:0^0=0; 0^1=1; 1^0=1; 1^1=0 。
#include int main(){ int a,b; a=077; b=a^3; printf(\"b 的值为 %d \\n\",b); b^=7; printf(\"b 的值为 %d \\n\",b); return 0;}
b 的值为 60 b 的值为 59
C 练习实例 54 - 取数右端4~7位
题目:取一个整数 a 从右端开始的 4~7 位。
程序分析:可以这样考虑:
要从一个整数 a
的右端提取出第 4 到第 7 位(二进制位),可以通过以下步骤完成:
- 右移操作:首先将整数右移,使得我们想要的位数对齐到最低位。
- 掩码操作:然后使用掩码来提取这些位。
假设我们要提取的是第 4 到第 7 位(从右端开始计数,最低位为第 0 位),可以使用掩码和右移操作完成。以下是详细步骤和代码示例:
解释
-
右移:将整数右移 4 位,使得我们想要提取的位对齐到最低位(右端)。
-
掩码:使用掩码
0x0F
来提取这四位。0x0F
的二进制表示是00001111
,它能保留最低的 4 位,而将其他位清零。
#include int main() { int a = 0xABCD1234; // 示例整数,十六进制表示 int result; // 右移 4 位,使得我们需要的位对齐到最低位 result = (a >> 4) & 0x0F; printf(\"The bits from position 4 to 7 are: %X\\n\", result); return 0;}
C 练习实例55 - 按位取反~
题目:学习使用按位取反~。
程序分析:~0=-1; ~1=-2;
按位取反的基本原理
按位取反运算符用 ~
表示,它将一个整数的每一个二进制位都反转。即,将二进制位中的 0
变为 1
,将 1
变为 0
。例如:
- 对于二进制数
0000 1110
(十进制 14),按位取反的结果是1111 0001
(十进制 -15)。
如何计算按位取反
-
将数字转换为二进制形式:
- 首先,将数字转换为其二进制表示形式。在计算机中,整数通常以补码形式存储。
-
对每一位进行取反:
- 将每一个二进制位反转,
0
变成1
,1
变成0
。
- 将每一个二进制位反转,
-
补码表示法:
- 在计算机中,整数通常使用补码表示。补码表示法中,按位取反的结果是
-(x + 1)
,其中x
是原始的十进制数。
- 在计算机中,整数通常使用补码表示。补码表示法中,按位取反的结果是
实例
以 a = 234
为例,假设计算机使用 32 位整数:
-
转换为二进制:
- 十进制数
234
的二进制表示是0000 0000 0000 0000 0000 0000 1110 1010
。
- 十进制数
-
按位取反:
- 取反后得到的二进制数是
1111 1111 1111 1111 1111 1111 0001 0101
。
- 取反后得到的二进制数是
-
转换回十进制:
- 这个二进制数表示的是
-235
(十进制)。这是因为按位取反运算结果是-(a + 1)
。
- 这个二进制数表示的是
#include int main(){ int a,b; a=234; b=~a; printf(\"a 的按位取反值为(十进制) %d \\n\",b); a=~a; printf(\"a 的按位取反值为(十六进制) %x \\n\",a); return 0;}
C 练习实例56 - circle画圆形
题目:画图,学用circle画圆形。
程序分析:无。
#include //VC6.0中是不能运行的,要在Turbo2.0/3.0中 int main() { int driver,mode,i; float j=1,k=1; driver=VGA; mode=VGAHI; initgraph(&driver,&mode,\"\"); setbkcolor(YELLOW); for(i=0;i<=25;i++) { setcolor(8); circle(310,250,k); k=k+j; j=j+0.3; } return 0; }
C 练习实例57 - line画直线
题目:画图,学用line画直线(在TC中实现)。
程序分析:无。
#include \"graphics.h\"int main(){ int driver,mode,i; float x0,y0,y1,x1; float j=12,k; driver=VGA;mode=VGAHI; initgraph(&driver,&mode,\"\"); setbkcolor(GREEN); x0=263;y0=263;y1=275;x1=275; for(i=0;i<=18;i++) { setcolor(5); line(x0,y0,x0,y1); x0=x0-5; y0=y0-5; x1=x1+5; y1=y1+5; j=j+10; }}
C 练习实例58 - rectangle画方形
题目:学用rectangle画方形。(在TC中实现)。
程序分析:无。
#include \"graphics.h\"int main(){ int x0,y0,y1,x1,driver,mode,i; driver=VGA;mode=VGAHI; initgraph(&driver,&mode,\"\"); setbkcolor(YELLOW); x0=263;y0=263;y1=275;x1=275; for(i=0;i<=18;i++) { setcolor(1); rectangle(x0,y0,x1,y1); x0=x0-5; y0=y0-5; x1=x1+5; y1=y1+5; } settextstyle(DEFAULT_FONT,HORIZ_DIR,2); outtextxy(150,40,\"How beautiful it is!\"); line(130,60,480,60); setcolor(2); circle(269,269,137);}
C 练习实例59 - 综合画图1
题目:画图,综合例子。(在TC中实现)。
程序分析:无。
# define PAI 3.1415926# define B 0.809# include \"graphics.h\"#include \"math.h\"int main(){ int i,j,k,x0,y0,x,y,driver,mode; float a; driver=CGA;mode=CGAC0; initgraph(&driver,&mode,\"\"); setcolor(3); setbkcolor(GREEN); x0=150;y0=100; circle(x0,y0,10); circle(x0,y0,20); circle(x0,y0,50); for(i=0;i<16;i++) { a=(2*PAI/16)*i; x=ceil(x0+48*cos(a)); y=ceil(y0+48*sin(a)*B); setcolor(2); line(x0,y0,x,y); } setcolor(3);circle(x0,y0,60); /* Make 0 time normal size letters */ settextstyle(DEFAULT_FONT,HORIZ_DIR,0); outtextxy(10,170,\"press a key\"); getch(); setfillstyle(HATCH_FILL,YELLOW); floodfill(202,100,WHITE); getch(); for(k=0;k<=500;k++) { setcolor(3); for(i=0;i<=16;i++) { a=(2*PAI/16)*i+(2*PAI/180)*k; x=ceil(x0+48*cos(a)); y=ceil(y0+48+sin(a)*B); setcolor(2); line(x0,y0,x,y); } for(j=1;j<=50;j++) { a=(2*PAI/16)*i+(2*PAI/180)*k-1; x=ceil(x0+48*cos(a)); y=ceil(y0+48*sin(a)*B); line(x0,y0,x,y); } } restorecrtmode();}
C 练习实例60 - 综合画图2
题目:画图,综合例子2。(在TC中实现)。
程序分析:无。
#include \"graphics.h\"#define LEFT 0#define TOP 0#define RIGHT 639#define BOTTOM 479#define LINES 400#define MAXCOLOR 15int main(){ int driver,mode,error; int x1,y1; int x2,y2; int dx1,dy1,dx2,dy2,i=1; int count=0; int color=0; driver=VGA; mode=VGAHI; initgraph(&driver,&mode,\"\"); x1=x2=y1=y2=10; dx1=dy1=2; dx2=dy2=3; while(!kbhit()) { line(x1,y1,x2,y2); x1+=dx1;y1+=dy1; x2+=dx2;y2+dy2; if(x1=RIGHT) dx1=-dx1; if(y1=BOTTOM) dy1=-dy1; if(x2=RIGHT) dx2=-dx2; if(y2=BOTTOM) dy2=-dy2; if(++count>LINES) { setcolor(color); color=(color>=MAXCOLOR)?0:++color; } } closegraph();}
C 练习实例61 - 杨辉三角形
题目:打印出杨辉三角形(要求打印出10行)。
程序分析:
结构如下所示:
11 11 2 11 3 3 11 4 6 4 1
#include #define MAX_ROWS 10int main() { int triangle[MAX_ROWS][MAX_ROWS]; int i, j; // 初始化杨辉三角数组 for (i = 0; i < MAX_ROWS; i++) { for (j = 0; j <= i; j++) { if (j == 0 || j == i) { // 边界条件:每行的第一个和最后一个元素都是1 triangle[i][j] = 1; } else { // 计算当前元素值:等于上方两个元素之和 triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j]; } } } // 打印杨辉三角 for (i = 0; i < MAX_ROWS; i++) { // 打印前导空格以对齐三角形 for (j = 0; j < MAX_ROWS - i - 1; j++) { printf(\" \"); } // 打印每行的元素 for (j = 0; j <= i; j++) { printf(\"%d \", triangle[i][j]); } printf(\"\\n\"); } return 0;}
C 练习实例62 - putpixel画点
题目:学习putpixel画点,(在TC中实现)。
程序分析:无。
#include \"stdio.h\"#include \"graphics.h\"int main(){ int i,j,driver=VGA,mode=VGAHI; initgraph(&driver,&mode,\"\"); setbkcolor(YELLOW); for(i=50;i<=230;i+=20) for(j=50;j<=230;j++) putpixel(i,j,1); for(j=50;j<=230;j+=20) for(i=50;i<=230;i++) putpixel(i,j,1);}
C 练习实例63 - 画椭圆ellipse
题目:画椭圆ellipse(在TC中实现)。
程序分析:无。
#include \"stdio.h\"#include \"graphics.h\"#include \"conio.h\"int main(){ int x=360,y=160,driver=VGA,mode=VGAHI; int num=20,i; int top,bottom; initgraph(&driver,&mode,\"\"); top=y-30; bottom=y-30; for(i=0;i<num;i++) { ellipse(250,250,0,360,top,bottom); top-=5; bottom+=5; } getch();}
C 练习实例64 - 画图
题目:利用ellipse and rectangle 画图(在TC中实现)。
程序分析:无。
#include \"stdio.h\"#include \"graphics.h\"#include \"conio.h\"main(){ int driver=VGA,mode=VGAHI; int i,num=15,top=50; int left=20,right=50; initgraph(&driver,&mode,\"\"); for(i=0;i<num;i++) { ellipse(250,250,0,360,right,left); ellipse(250,250,0,360,20,top); rectangle(20-2*i,20-2*i,10*(i+2),10*(i+2)); right+=5; left+=5; top+=10; } getch();}
C 练习实例65 - 画优美的图案
题目:一个最优美的图案(在TC中实现)。
程序分析:无。
#include \"graphics.h\"#include \"math.h\"#include \"dos.h\"#include \"conio.h\"#include \"stdlib.h\"#include \"stdio.h\"#include \"stdarg.h\"#define MAXPTS 15#define PI 3.1415926struct PTS { int x,y;};double AspectRatio=0.85;void LineToDemo(void){ struct viewporttype vp; struct PTS points[MAXPTS]; int i, j, h, w, xcenter, ycenter; int radius, angle, step; double rads; printf(\" MoveTo / LineTo Demonstration\" ); getviewsettings( &vp ); h = vp.bottom - vp.top; w = vp.right - vp.left; xcenter = w / 2; /* Determine the center of circle */ ycenter = h / 2; radius = (h - 30) / (AspectRatio * 2); step = 360 / MAXPTS; /* Determine # of increments */ angle = 0; /* Begin at zero degrees */ for( i=0 ; i<MAXPTS ; ++i ){ /* Determine circle intercepts */ rads = (double)angle * PI / 180.0; /* Convert angle to radians */ points[i].x = xcenter + (int)( cos(rads) * radius ); points[i].y = ycenter - (int)( sin(rads) * radius * AspectRatio ); angle += step; /* Move to next increment */ } circle( xcenter, ycenter, radius ); /* Draw bounding circle */ for( i=0 ; i<MAXPTS ; ++i ){ /* Draw the cords to the circle */ for( j=i ; j<MAXPTS ; ++j ){ /* For each remaining intersect */ moveto(points[i].x, points[i].y); /* Move to beginning of cord */ lineto(points[j].x, points[j].y); /* Draw the cord */ } }}int main(){ int driver,mode; driver=CGA;mode=CGAC0; initgraph(&driver,&mode,\"\"); setcolor(3); setbkcolor(GREEN); LineToDemo();}
C 练习实例66 - 用指针大小排序
题目:输入3个数a,b,c,按大小顺序输出。
程序分析:利用指针方法。
# includevoid swap(int *, int *);int main(void){ int a, b, c; int *p1, *p2, *p3; printf(\"输入 a, b ,c:\\n\"); scanf(\"%d %d %d\", &a, &b, &c); p1 = &a; p2 = &b; p3 = &c; if(a>b) swap(p1, p2); if(a>c) swap(p1, p3); if(b>c) swap(p2, p3); printf(\"%d %d %d\\n\", a, b, c);}void swap(int *s1, int *s2){ int t; t = *s1; *s1 = *s2; *s2 = t;}
C 练习实例67 - 数组交换位置
题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
程序分析:如下。
#include void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp;}int main() { int n; // 输入数组大小 printf(\"请输入数组的大小:\"); scanf(\"%d\", &n); int arr[n]; // 输入数组元素 printf(\"请输入 %d 个数组元素:\\n\", n); for (int i = 0; i < n; i++) { scanf(\"%d\", &arr[i]); } // 找到最大值和最小值的索引 int maxIndex = 0; int minIndex = 0; for (int i = 1; i arr[maxIndex]) { maxIndex = i; } if (arr[i] < arr[minIndex]) { minIndex = i; } } // 交换最大值与第一个元素 swap(&arr[0], &arr[maxIndex]); // 交换最小值与最后一个元素 // 注意:如果最小值和最大值可能是同一个元素,且其位置是相同的,交换需要特殊处理 if (minIndex == 0) { minIndex = maxIndex; // 避免交换第一个元素与自己 } swap(&arr[n-1], &arr[minIndex]); // 输出修改后的数组 printf(\"修改后的数组是:\\n\"); for (int i = 0; i < n; i++) { printf(\"%d \", arr[i]); } printf(\"\\n\"); return 0;}
C 练习实例68 - n个数放前面
题目:有 n 个整数,使其前面各数顺序向后移 m 个位置,最后m个数变成最前面的 m 个数。
程序分析:可以使用一个辅助数组来保存需要移动的元素,然后再将元素按照要求移动到正确的位置。
#include // 函数用于交换数组中的两个部分void reverse(int arr[], int start, int end) { int temp; while (start < end) { temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; start++; end--; }}// 主函数int main() { int n, m; // 输入数组的大小 printf(\"输入数组的大小: \"); scanf(\"%d\", &n); int arr[n]; // 输入数组元素 printf(\"输入数组元素:\\n\", n); for (int i = 0; i < n; i++) { scanf(\"%d\", &arr[i]); } // 输入旋转的位置 printf(\"输入旋转的位置(即需要最后多少个数放前面来): \"); scanf(\"%d\", &m); // 旋转数组 // 步骤 1: 反转整个数组 reverse(arr, 0, n - 1); // 步骤 2: 反转前 m 个元素 reverse(arr, 0, m - 1); // 步骤 3: 反转后 n - m 个元素 reverse(arr, m, n - 1); // 输出旋转后的数组 printf(\"输出旋转后的数组:\\n\"); for (int i = 0; i < n; i++) { printf(\"%d \", arr[i]); } printf(\"\\n\"); return 0;}
C 练习实例69 - 约瑟夫环
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
程序分析:无。
#include // 计算最后剩下的人的原始编号int josephus(int n, int k) { if (n == 1) { return 1; // 只有一个人时,返回编号1 } else { // 递归求解 return (josephus(n - 1, k) + k - 1) % n + 1; }}int main() { int n = 10; // 总人数 int k = 3; // 每报数到3的人退出 printf(\"最后那位是 is: %d\\n\", josephus(n, k)); return 0;}
C 练习实例70 - 求字符串长度
题目:写一个函数,求一个字符串的长度,在 main 函数中输入字符串,并输出其长度。
程序分析:无。
#include #include int length(char *s); int main() { char str[100]; // 可以根据实际情况增大数组长度 printf(\"请输入字符串:\\n\"); scanf(\"%s\", str); int len = length(str); // 调用 length 函数计算字符串长度 printf(\"字符串有 %d 个字符。\\n\", len); return EXIT_SUCCESS;} //求字符串长度 int length(char *s) { int i = 0; while (*s != \'\\0\') { i++; s++; } return i; }
C 练习实例71 - 结构体学生数据
题目:编写input()和output()函数输入,输出5个学生的数据记录。
程序分析:运用结构体。
#include // 定义学生结构体typedef struct { int id; // 学号 char name[50]; // 姓名 float score; // 成绩} Student;// 函数声明void input(Student students[], int count);void output(Student students[], int count);int main() { Student students[5]; // 输入学生数据 input(students, 5); // 输出学生数据 output(students, 5); return 0;}// 输入学生数据的函数void input(Student students[], int count) { for (int i = 0; i < count; i++) { printf(\"请输入第 %d 个学生的学号: \", i + 1); scanf(\"%d\", &students[i].id); printf(\"请输入第 %d 个学生的姓名: \", i + 1); scanf(\"%s\", students[i].name); printf(\"请输入第 %d 个学生的成绩: \", i + 1); scanf(\"%f\", &students[i].score); }}// 输出学生数据的函数void output(Student students[], int count) { printf(\"\\n学生数据记录:\\n\"); printf(\"学号\\t姓名\\t成绩\\n\"); for (int i = 0; i < count; i++) { printf(\"%d\\t%s\\t%.2f\\n\", students[i].id, students[i].name, students[i].score); }}
C 练习实例72 - 创建链表
题目:创建一个链表。
程序分析:无。
#include #include // 定义节点结构体typedef struct Node { int data; // 数据部分 struct Node* next; // 指向下一个节点的指针} Node;// 创建新节点Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); // 分配内存 if (newNode == NULL) { printf(\"Error allocating memory!\\n\"); exit(1); } newNode->data = data; // 设置数据 newNode->next = NULL; // 初始化下一个节点指针为NULL return newNode;}// 在链表头部插入新节点void insertAtHead(Node** head, int data) { Node* newNode = createNode(data); // 创建新节点 newNode->next = *head; // 将新节点的next指向当前链表的头部 *head = newNode; // 更新链表头部为新节点}// 打印链表void printList(Node* head) { Node* current = head; // 从链表头部开始 while (current != NULL) { printf(\"%d -> \", current->data); current = current->next; // 移动到下一个节点 } printf(\"NULL\\n\");}// 释放链表内存void freeList(Node* head) { Node* current = head; Node* nextNode; while (current != NULL) { nextNode = current->next; // 保存下一个节点的指针 free(current); // 释放当前节点 current = nextNode; // 移动到下一个节点 }}int main() { Node* head = NULL; // 初始化链表头部为空 // 向链表中插入数据 insertAtHead(&head, 10); insertAtHead(&head, 20); insertAtHead(&head, 30); // 打印链表 printf(\"Linked List: \"); printList(head); // 释放链表内存 freeList(head); return 0;}
C 练习实例73 - 反向输出链表
题目:反向输出一个链表。
程序分析:无。
#include #include // 定义链表节点typedef struct Node { int data; struct Node* next;} Node;// 创建新节点Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = NULL; return newNode;}// 反向输出链表void reversePrint(Node* head) { Node* current = head; Node* stack[100]; // 假设链表长度不会超过100 int top = -1; // 将链表节点压入栈 while (current != NULL) { stack[++top] = current; current = current->next; } // 依次弹出栈中节点并打印数据 while (top >= 0) { printf(\"%d \", stack[top--]->data); } printf(\"\\n\");}// 打印链表void printList(Node* head) { Node* current = head; while (current != NULL) { printf(\"%d -> \", current->data); current = current->next; } printf(\"NULL\\n\");}int main() { // 创建链表: 1 -> 2 -> 3 -> 4 -> NULL Node* head = createNode(1); head->next = createNode(2); head->next->next = createNode(3); head->next->next->next = createNode(4); printf(\"Original list:\\n\"); printList(head); printf(\"Reversed list:\\n\"); reversePrint(head); // 释放链表节点 Node* temp; while (head != NULL) { temp = head; head = head->next; free(temp); } return 0;}
C 练习实例74 - 链接两个链表
题目:连接两个链表。
程序分析:无。
#include #include // 定义链表节点typedef struct Node { int data; struct Node* next;} Node;// 连接两个链表void concatenateLists(Node* list1, Node* list2) { if (list1 == NULL) { list1 = list2; return; } Node* temp = list1; while (temp->next != NULL) { temp = temp->next; } temp->next = list2;}// 辅助函数:打印链表void printList(Node* head) { while (head != NULL) { printf(\"%d -> \", head->data); head = head->next; } printf(\"NULL\\n\");}// 主函数示例int main() { // 示例代码省略链表创建部分 // 创建和连接两个链表后,可以用以下代码进行测试: Node* list1 = /* 创建第一个链表 */; Node* list2 = /* 创建第二个链表 */; concatenateLists(list1, list2); printList(list1); // 打印连接后的链表 return 0;}
C 练习实例75 - 整数反转输出
题目:输入一个整数,并将其反转后输出。
程序分析:无。
#include int main() { int num, reversed = 0, original; // 读取整数 printf(\"请输入一个整数: \"); scanf(\"%d\", &num); original = num; // 保存原始值用于输出 // 处理负数情况 int is_negative = (num < 0); if (is_negative) { num = -num; // 反转时将负号移除 } // 反转整数 while (num != 0) { int digit = num % 10; // 获取最后一位数字 reversed = reversed * 10 + digit; // 将其添加到反转结果的末尾 num /= 10; // 去掉最后一位数字 } // 如果原始整数是负数,反转后的结果也应为负数 if (is_negative) { reversed = -reversed; } // 输出反转后的结果 printf(\"反转后的整数是: %d\\n\", reversed); return 0;}
C 练习实例76 - 1/2+1/4+...+1/n
题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)。
程序分析:无。
#include // 函数:计算偶数和// 输入:n - 偶数// 输出:result - 指向结果的指针void sum_even(int n, double *result) { *result = 0.0; // 初始化结果为0 // 遍历2到n之间的偶数 for (int i = 2; i <= n; i += 2) { *result += 1.0 / i; // 累加每个偶数的倒数 }}// 函数:计算奇数和// 输入:n - 奇数// 输出:result - 指向结果的指针void sum_odd(int n, double *result) { *result = 0.0; // 初始化结果为0 // 遍历1到n之间的奇数 for (int i = 1; i <= n; i += 2) { *result += 1.0 / i; // 累加每个奇数的倒数 }}int main() { int n; // 声明整数n printf(\"请输入一个整数 n: \"); scanf(\"%d\", &n); // 从用户输入读取n double result; // 声明结果变量 // 判断n是偶数还是奇数 if (n % 2 == 0) { sum_even(n, &result); // 如果是偶数,调用sum_even函数 } else { sum_odd(n, &result); // 如果是奇数,调用sum_odd函数 } // 输出结果 printf(\"结果是: %lf\\n\", result); return 0; // 程序结束}
manwomangirlboysister
C 练习实例77 - 指针的指针练习
题目:填空练习(指向指针的指针)。
程序分析:无。
#include#includeint main(){ const char *s[]={\"man\",\"woman\",\"girl\",\"boy\",\"sister\"}; const char **q; int k; for(k=0;k<5;k++) { q=&s[k]; /*在这里填入内容*/ printf(\"%s\\n\",*q); } return 0;}
manwomangirlboysister
C 练习实例78 - 结构体找年龄最大
题目:找到年龄最大的人,并输出。请找出程序中有什么问题。
程序分析:无。
#include#includestruct man{ char name[20]; int age;}person[3]={\"li\",18,\"wang\",25,\"sun\",22};int main(){ struct man *q,*p; int i,m=0; p=person; for(i=0;i<3;i++) { if(mage) { m=p->age; q=p; } p++; } printf(\"%s %d\\n\",q->name,q->age); return 0;}
wang 25
C 练习实例79 - 字符串排序
题目:字符串排序。
程序分析:无。
#include #include #define MAX_STRINGS 100#define MAX_LENGTH 100int main() { char strings[MAX_STRINGS][MAX_LENGTH]; int n, i, j; char temp[MAX_LENGTH]; printf(\"输入字符串数量: \"); scanf(\"%d\", &n); printf(\"输入字符串:\\n\"); for (i = 0; i < n; i++) { scanf(\"%s\", strings[i]); } // 冒泡排序 for (i = 0; i < n - 1; i++) { for (j = i + 1; j 0) { strcpy(temp, strings[i]); strcpy(strings[i], strings[j]); strcpy(strings[j], temp); } } } printf(\"排序后的字符串:\\n\"); for (i = 0; i < n; i++) { printf(\"%s\\n\", strings[i]); } return 0;}
C 练习实例80 - 猴子桃子
题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只 猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了 一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的, 问海滩上原来最少有多少个桃子?
程序分析:
- 从1开始循环尝试不同的桃子数量。
- 使用一个循环模拟五只猴子分桃子的过程。
- 在每轮中检查当前桃子数量是否能够满足条件(即能被5分且多一个)。
- 如果最后桃子数为0且所有条件满足,打印出结果并退出循环。
#include int main() { int peaches = 1; // 从1开始尝试 while (1) { int temp = peaches; // 临时变量保存当前桃子数 int valid = 1; // 标记是否有效 for (int i = 0; i < 5; i++) { if (temp % 5 == 1) { // 判断是否多一个 temp = temp - (temp / 5 + 1); // 扔掉一个,拿走一份 } else { valid = 0; // 如果不能被5分而多一个,标记无效 break; } } if (valid && temp == 0) { // 如果有效并且最后桃子数为0 printf(\"最少有桃子数: %d\\n\", peaches); break; // 找到答案,退出循环 } peaches++; // 增加桃子数 } return 0;}
C 练习实例81 - 求??数
题目:809*??=800*??+9*?? 其中??代表的两位数, 809*??为四位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。
程序分析:
- 循环范围:程序循环遍历所有两位数(10到99)。
- 计算结果:分别计算 809×??809 \\times ??809×??、8×??8 \\times ??8×?? 和 9×??9 \\times ??9×??。
- 条件检查:检查结果是否符合题目中的条件。
- 输出结果:如果条件满足,打印出 ?????? 的值以及 809×??809 \\times ??809×?? 的结果。
#include int main() { for (int num = 10; num = 1000 && result1 = 10 && result2 = 100 && result3 < 1000) { // 9 * ?? 是三位数 printf(\"?? = %d\\n\", num); printf(\"809 * ?? = %d\\n\", result1); } } return 0;}
C 练习实例82 - 八转十进制
题目:八进制转换为十进制
程序分析:
-
- 使用
while
循环迭代处理每一位八进制数。 - 通过取余操作获取最后一位(
octal % 10
)。 - 将该位乘以当前的基数(初始为1,之后每次乘以8)。
- 更新八进制数,去掉最后一位。
- 使用
- 输出结果:最后输出转换后的十进制数。
假设用户输入的八进制数是 17
,程序将输出其对应的十进制数 15
。
#include #include int main() { long octal, decimal = 0, remainder, base = 1; printf(\"请输入一个八进制数: \"); scanf(\"%lo\", &octal); // 读取八进制数,使用%lo格式符 while (octal != 0) { remainder = octal % 10; // 获取八进制的最后一位 decimal = decimal + remainder * base; // 计算十进制值 octal = octal / 10; // 去掉八进制的最后一位 base = base * 8; // 八进制的基数为8 } printf(\"转换后的十进制数是: %ld\\n\", decimal); return 0;}
C 练习实例83 - 组成的奇数个数
题目:求0—7所能组成的奇数个数。
程序分析:
- 首先定义一个变量
count
来统计奇数的总数。 - 对于每种位数的情况,依次计算所有可能的组合。
- 对于每一位数的组合,最后一位必须是奇数(4种选择),而其他位数可以从可用的数字中选择(首位不能为0)。
- 最后输出结果。
#include int main() { int count = 0; // 1位数 count += 4; // 1, 3, 5, 7 // 2位数 count += 4 * 7; // (1, 3, 5, 7) * (0, 2, 4, 6) // 3位数 count += 4 * 8 * 7; // (1, 3, 5, 7) * (0-7) * (0, 2, 4, 6) // 4位数 count += 4 * 8 * 8 * 7; // (1, 3, 5, 7) * (0-7) * (0-7) * (0, 2, 4, 6) // 5位数 count += 4 * 8 * 8 * 8 * 7; // (1, 3, 5, 7) * (0-7) * (0-7) * (0-7) * (0, 2, 4, 6) // 6位数 count += 4 * 8 * 8 * 8 * 8 * 7; // (1, 3, 5, 7) * (0-7) * (0-7) * (0-7) * (0-7) * (0, 2, 4, 6) // 7位数 count += 4 * 8 * 8 * 8 * 8 * 8 * 7; // (1, 3, 5, 7) * (0-7) * (0-7) * (0-7) * (0-7) * (0-7) * (0, 2, 4, 6) // 8位数 count += 4 * 8 * 8 * 8 * 8 * 8 * 8 * 7; // (1, 3, 5, 7) * (0-7) * (0-7) * (0-7) * (0-7) * (0-7) * (0-7) * (0, 2, 4, 6) printf(\"0-7所能组成的奇数个数为: %d\\n\", count); return 0;}
C 练习实例84 - 哥德巴赫猜想
题目:一个偶数总能表示为两个素数之和。
程序分析:
is_prime
函数:这个函数用于检查一个数字是否为素数。它从 2 开始检查,直到该数字的平方根。- 主函数:
- 提示用户输入一个偶数,并检查输入的有效性。
- 如果输入的偶数有效,程序将遍历从 2 到该偶数一半的所有数字。
- 对于每个数字,检查其与
n - i
是否均为素数,如果是,则输出这个组合。
#include #include #define MAX 1000 // 可以根据需要调整最大范围// 检查是否为素数bool is_prime(int num) { if (num < 2) return false; for (int i = 2; i * i <= num; i++) { if (num % i == 0) return false; } return true;}// 主函数int main() { int n; printf(\"请输入一个偶数 (大于 2): \"); scanf(\"%d\", &n); // 检查输入的偶数有效性 if (n <= 2 || n % 2 != 0) { printf(\"输入无效,请输入一个大于 2 的偶数。\\n\"); return 1; } printf(\"%d 可以表示为以下素数之和:\\n\", n); for (int i = 2; i <= n / 2; i++) { if (is_prime(i) && is_prime(n - i)) { printf(\"%d + %d\\n\", i, n - i); } } return 0;}
C 练习实例85 - 素数被几个9整除
题目:判断一个素数能被几个9整除
程序分析:要判断一个素数能被多少个 9 整除,我们可以通过不断地用 9 除以该素数,直到无法整除为止。我们需要注意的是,素数是大于 1 的自然数,并且只能被 1 和它本身整除。
#include #include // 检查是否为素数bool is_prime(int num) { if (num < 2) return false; for (int i = 2; i * i <= num; i++) { if (num % i == 0) return false; } return true;}// 主函数int main() { int prime; int count = 0; printf(\"请输入一个素数: \"); scanf(\"%d\", &prime); // 检查输入的数是否为素数 if (!is_prime(prime)) { printf(\"%d 不是一个素数。\\n\", prime); return 1; } // 判断能被多少个9整除 while (prime % 9 == 0) { count++; prime /= 9; } printf(\"该素数能被 9 整除的次数: %d\\n\", count); return 0;}
C 练习实例86 - 字符串连接程序
题目:两个字符串连接程序 。
程序分析:无。
#include #include#include char* strconnect(char *str1,char *str2); int main(){ char str1[20],str2[20]; char *str; puts(\"请输入两个字符串,用回车分开:\"); scanf(\"%s%s\", str1, str2); str=strconnect(str1,str2); puts(\"连接后的字符串为:\"); puts(str); return 0;}char* strconnect(char *str1,char *str2){ char*str; str=(char*)malloc(strlen(str1)+strlen(str2)+1); str[0]=\'\\0\'; strcat(str,str1); strcat(str,str2); return str;}
C 练习实例87 - 结构体变量传递
题目:回答结果(结构体变量传递)。
#include struct student{ int x; char c;} a; int main(){ a.x=3; a.c=\'a\'; f(a); printf(\"%d,%c\",a.x,a.c);}f(struct student b){ b.x=20; b.c=\'y\';}
结果:3,a
C 练习实例88 - 打印出该值个数*
题目:读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的 *。
#include#includeint main(){ int n,i,j; printf(\"请输入数字:\\n\");i--; for(i=0;i50){ printf(\"请重新输入:\\n\");i--; } else { for(j=0;j<n;j++) printf(\"*\"); } printf(\"\\n\"); } return 0;}
C 练习实例89 - 加密密码
题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下: 每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。
#include int main(){ int a,i,aa[4],t; printf(\"请输入四位数字:\"); scanf(\"%d\",&a); aa[0]=a%10; aa[1]=a%100/10; aa[2]=a%1000/100; aa[3]=a/1000; for(i=0;i<=3;i++) { aa[i]+=5; aa[i]%=10; } for(i=0;i=0;i--) printf(\"%d\",aa[i]); printf(\"\\n\");}
C 练习实例90 - 读结果
题目:专升本一题,读结果。
#include#include#define M 5int main(){ int a[M]={1,2,3,4,5}; int i,j,t; i=0;j=M-1; while(i<j) { t=*(a+i); *(a+i)=*(a+j); *(a+j)=t; i++;j--; } for(i=0;i<M;i++) { printf(\"%d\\n\",*(a+i)); } }
54321
C 练习实例91 - 时间函数库1
题目:时间函数举例1
程序分析:
-
#include
和#include
: 这两行包含了必要的库文件。stdio.h
是用来进行输入输出操作的标准库,time.h
则提供了处理时间和日期的功能。 -
time_t rawtime;
:time_t
是一个数据类型,用于表示时间。rawtime
变量将用来存储当前的原始时间(即从某个时间点(通常是 1970 年 1 月 1 日 00:00:00 UTC)开始的秒数)。 -
struct tm * timeinfo;
:tm
是一个结构体,用于表示时间和日期的具体组成部分。timeinfo
是一个指向tm
结构体的指针,用于存储本地时间的详细信息。 -
time(&rawtime);
: 调用time
函数获取当前时间,并将其存储在rawtime
中。time
函数的参数是一个time_t
类型的指针,它将会被填充当前的时间值。 -
timeinfo = localtime(&rawtime);
: 将rawtime
转换为本地时间的tm
结构体,并将其指针赋值给timeinfo
。localtime
函数将时间转换为本地时间,并返回一个指向tm
结构体的指针。 -
printf(\"当前本地时间为: %s\", asctime(timeinfo));
:asctime
函数将tm
结构体转换为一个人类可读的字符串形式的时间,然后使用printf
函数将其输出到屏幕上。 -
return 0;
: 程序执行完毕,正常退出,返回值 0 表示程序成功结束。
#include // 引入标准输入输出库,用于使用 printf 函数#include // 引入时间库,用于处理时间和日期int main (){ time_t rawtime; // 声明一个变量,用于存储原始时间 struct tm * timeinfo; // 声明一个指针,指向 tm 结构体,用于存储本地时间信息 time(&rawtime); // 获取当前时间,并将其存储在 rawtime 中 timeinfo = localtime(&rawtime); // 将原始时间转换为本地时间的结构体 tm,并将指针存储在 timeinfo 中 // 使用 asctime 函数将 tm 结构体转换为字符串,并使用 printf 输出 printf(\"当前本地时间为: %s\", asctime(timeinfo)); return 0; // 程序正常结束}
C 练习实例92 - 时间函数库2
题目:时间函数举例1
程序分析:
代码目的是测量一个循环的执行时间,但循环中每次打印一个换行符可能会导致I/O操作时间被包含在测量中,从而影响结果。如果你只想测量计算时间,建议将循环中的I/O操作去掉。下面是一个修改后的例子,用于测量计算操作的时间。
#include #include int main(){ clock_t start, end; double cpu_time_used; int i; start = clock(); for(i = 0; i < 300000; i++) { // 这里做一些计算而不是打印 volatile int dummy = i * i; // 使用 volatile 防止优化 } end = clock(); cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; // 输出执行时间 printf(\"时间间隔为 %6.3f 秒\\n\", cpu_time_used); return 0;}
C 练习实例93 - 时间函数库3
题目:时间函数举例3
程序分析:
#include #include #include int main(){ long i=10000000L; clock_t start,finish; double TheTimes; printf(\"做%ld次空循环需要的时间为\",i); start=clock(); while(i--); finish=clock(); TheTimes=(double)(finish-start)/CLOCKS_PER_SEC; printf(\"%f秒。\\n\",TheTimes); return 0;}
C 练习实例94 - 猜数字
题目:猜谜游戏。
程序分析:无。
#include #include #include void caizi(void){ int n; char begin; int count = 1; srand((int)time(NULL)); int m = (rand() % 100) + 1; puts(\"游戏开始,请输入数字:\"); while (1) { scanf(\"%d\", &n); if (n == m) { printf(\"猜中了,使用了 %d 次!\\n\", count); if (count == 1) { printf(\"你是神级人物了!膜拜\\n\"); getchar(); printf(\"你已经达到最高级别,还需要玩吗?Y/N \\n\"); scanf(\"%c\", &begin); if (begin == \'Y\' || begin == \'y\') //重复玩的一个嵌套循环 { caizi(); } else { printf(\"谢谢,再见!\\n\"); } } else if (count <= 5) { printf(\"你是王级人物了!非常赞\\n\"); getchar(); printf(\"需要挑战最高级别不?Y/N \\n\"); scanf(\"%c\", &begin); if (begin == \'Y\' || begin == \'y\') { caizi(); } else { printf(\"谢谢,再见!\\n\"); } } else if (count <= 10) { printf(\"你是大师级人物了!狂赞\\n\"); getchar(); printf(\"需要挑战最高级别不?Y/N \\n\"); scanf(\"%c\", &begin); if (begin == \'Y\' || begin == \'y\') { caizi(); } else { printf(\"谢谢,再见!\\n\"); } } else if (count <= 15) { printf(\"你是钻石级人物了!怒赞\\n\"); getchar(); printf(\"需要挑战最高级别不?Y/N \\n\"); scanf(\"%c\", &begin); if (begin == \'Y\' || begin == \'y\') { caizi(); } else { printf(\"谢谢,再见!\\n\"); } } else { getchar(); printf(\"你的技术还有待提高哦!重玩? Y/N\\n\"); scanf(\"%c\",&begin); if (begin == \'Y\' || begin == \'y\') { caizi(); } else { printf(\"谢谢,再见!\\n\"); } } break; } else if (n < m) { puts(\"太小了!\"); puts(\"重新输入:\"); } else { puts(\"太大了!\"); puts(\"重新输入:\"); } count++;//计数器 }} int main(void){ caizi(); system(\"pause\"); return 0;}
C 练习实例95 - 结构体实例
题目:简单的结构体应用实例。
程序分析:无。
#include struct programming{ float constant; char *pointer;};int main(){ struct programming variable; char string[] = \"www.baidu.com\"; variable.constant = 1.23; variable.pointer = string; printf(\"%f\\n\", variable.constant); printf(\"%s\\n\", variable.pointer); return 0;}
C 练习实例96 - 子串出现次数
题目:计算字符串中子串出现的次数 。
程序分析:无。
#include#include int countSubString(char *str,char *substr){int count = 0;char *temp = str;while((temp = strstr(temp,substr) )!= NULL){count++;temp++;}return count;}int main(){char *str = \"abcakfjaabcaf\";char *substr = \"abc\";int count = countSubString(str,substr);printf(\"%d\",count);}
C 练习实例97 - 保存到txt
题目:从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止。
程序分析:无。
#include#includeint main(){FILE *file;char ch;file = fopen(\"C:\\Users\\Administrator\\Desktop\\output.txt\",\"w\");if(file == NULL){perror(\"Error-------\");return 1;}printf(\"输入字符,到#为止\");while((ch= getchar()) != \'#\'){fputc(ch,file);}fclose(file);return 0;}
C 练习实例98 - 字母大小写转换
题目:从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件\"test\"中保存。 输入的字符串以!结束。
程序分析:无。
#include#includeint main(){char str[100];printf(\"请输入:\\n\");fgets(str,sizeof(str),stdin);for(int i=0; str[i]!=\'\\0\'; i++){if(islower(str[i])){str[i] = toupper(str[i]);}else if(isupper(str[i])){str[i] = tolower(str[i]);}}printf(\"%s\",str);}
C 练习实例99 - A.txt 与 B.txt
题目:有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件C中。
程序分析:你需要先创建 A.txt 与 B.txt。
A.txt文件内容:
123
B.txt文件内容:
456
#include#include#includeint main(){ FILE*fa,*fb,*fc; int i,j,k; char str[100],str1[100]; char tem; if((fa=fopen(\"A.txt\",\"r\"))==NULL) // A.txt 文件需要存在 { printf(\"error: cannot open A file!\\n\"); exit(0); } fgets(str,99,fa); fclose(fa); if((fb=fopen(\"B.txt\",\"r\"))==NULL) // B.txt 文件需要存在 { printf(\"error: cannot open B file!\\n\"); exit(0); } fgets(str1,100,fb); fclose(fb); strcat(str,str1); for(i=strlen(str)-1;i>1;i--) for(j=0;jstr[j+1]) { tem=str[j]; str[j]=str[j+1]; str[j+1]=tem; } if((fc=fopen(\"C.txt\",\"w\"))==NULL) // 合并为 C.txt { printf(\"error: cannot open C file!\\n\"); exit(0); } fputs(str,fc); fclose(fc); system(\"pause\"); return 0;}
C 练习实例100 - 结构体与磁盘
题目:有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,原有的数据和计算出的平均分数存放在磁盘文件\"stud\"中。
程序分析:无。
#include#includetypedef struct{ int ID; int math; int English; int C; int avargrade; char name[20];}Stu;int main(){ FILE*fp; Stu stu[5]; int i,avargrade=0; printf(\"请输入5个同学的信息:学生号,姓名,3门成绩:\\n\"); for(i=0;i<5;i++) { scanf(\"%d %s %d %d %d\",&(stu[i].ID),stu[i].name,&(stu[i].math),&(stu[i].English),&(stu[i].C)); stu[i].avargrade=(stu[i].math+stu[i].English+stu[i].C)/3; } if((fp=fopen(\"stud\",\"w\"))==NULL) { printf(\"error :cannot open file!\\n\"); exit(0); } for(i=0;i<5;i++) fprintf(fp,\"%d %s %d %d %d %d\\n\",stu[i].ID,stu[i].name,stu[i].math,stu[i].English, stu[i].C,stu[i].avargrade); fclose(fp); // system(\"pause\"); return 0;}
目录
C 练习实例1 - 组无重复数字的数
C 练习实例2 - 阶段利润提成
C 练习实例3 - 完全平方数
C 练习实例4 - 判断当年第几天
C 练习实例5 - 三个数由小到大
C 练习实例6 - 输出字母C图案
C 练习实例7 - 特殊图案
C 练习实例8 - 9*9 乘法表
C 练习实例9 - 国际象棋棋盘
C 练习实例10 - 打印笑脸
C 练习实例11 - 斐波那契
C 练习实例12 - 101到200的素数
C 练习实例13 - 水仙花数
C 练习实例14 - 分解质因数
C 练习实例15 - (a>b)?a:b
C 练习实例16 - 公约数&公倍数
C 练习实例17 - 统计字母、数字等
C 练习实例18 - s=a+aa+aaa...
C 练习实例19 - 完数
C 练习实例20 - 球落下反弹
C 练习实例21 - 猴子吃桃
C 练习实例22 - 乒乓球推理
C 练习实例23 - 打印图案
C 练习实例24 - 2/1+3/2+5/3...
C 练习实例25 - 求阶乘的和
C 练习实例26 - 递归求阶乘
C 练习实例27 - 逆序打印字符
C 练习实例28 - 岁数推理
C 练习实例29 - 逆序打印各位数字
C 练习实例30 - 判断是否回文数
C 练习实例31 - 判断星期几
C 练习实例32 - 删字符串指定字母
C 练习实例33 - 判断是否质数
C 练习实例34 - 练习函数调用
C 练习实例35 - 字符串反转
C 练习实例36 - 100内素数
C 练习实例37 - 各种排序
C 练习实例38 - 矩阵对角元素和
C 练习实例39 - 一个数插入数组
C 练习实例40 - 数组逆序输出
C 练习实例41 - static用法1
C 练习实例42 - auto用法
C 练习实例43 - static用法2
C 练习实例44 - 调用外部函数
C 练习实例45 - register用法
C 练习实例46 - 宏#define练习1
C 练习实例47 - 宏#define练习2
C 练习实例48 - 宏#define练习3
C 练习实例49 - #if,#ifdef,#ifndef
C 练习实例50 - #include练习
C 练习实例51 - 按位与 & 使用
C 练习实例52 - 按位或 | 使用
C 练习实例53 - 按位异或 ^ 使用
C 练习实例 54 - 取数右端4~7位
C 练习实例55 - 按位取反~
C 练习实例56 - circle画圆形
C 练习实例57 - line画直线
C 练习实例58 - rectangle画方形
C 练习实例59 - 综合画图1
C 练习实例60 - 综合画图2
C 练习实例61 - 杨辉三角形
C 练习实例62 - putpixel画点
C 练习实例63 - 画椭圆ellipse
C 练习实例64 - 画图
C 练习实例65 - 画优美的图案
C 练习实例66 - 用指针大小排序
C 练习实例67 - 数组交换位置
C 练习实例68 - n个数放前面
C 练习实例69 - 约瑟夫环
C 练习实例70 - 求字符串长度
C 练习实例71 - 结构体学生数据
C 练习实例72 - 创建链表
C 练习实例73 - 反向输出链表
C 练习实例74 - 链接两个链表
C 练习实例75 - 整数反转输出
C 练习实例76 - 1/2+1/4+...+1/n
C 练习实例77 - 指针的指针练习
C 练习实例78 - 结构体找年龄最大
C 练习实例79 - 字符串排序
C 练习实例80 - 猴子桃子
C 练习实例81 - 求??数
C 练习实例82 - 八转十进制
C 练习实例83 - 组成的奇数个数
C 练习实例84 - 哥德巴赫猜想
C 练习实例85 - 素数被几个9整除
C 练习实例86 - 字符串连接程序
C 练习实例87 - 结构体变量传递
C 练习实例88 - 打印出该值个数*
C 练习实例89 - 加密密码
C 练习实例90 - 读结果
C 练习实例91 - 时间函数库1
C 练习实例92 - 时间函数库2
C 练习实例93 - 时间函数库3
C 练习实例94 - 猜数字
C 练习实例95 - 结构体实例
C 练习实例96 - 子串出现次数
C 练习实例97 - 保存到txt
C 练习实例98 - 字母大小写转换
C 练习实例99 - A.txt 与 B.txt
C 练习实例100 - 结构体与磁盘