1、假设变量x和n是两个正整数,我们知道x/n这个表达式的结果是取Floor(取下限),
例如x是17,n是4,则结果是4。如果希望结果取Ceiling(取上限)应该怎么写表达式呢?
例如x是17,n是4,则结果是5,而x是16,n是4,则结果是4。
#include <stdio.h>
int ceiling(int a, int b)
{
int tmp = 0;
tmp = a / b;
if (a % b > 0)
{
tmp += 1;
}
return tmp;
}
int flooring(int a, int b)
{
return (int)(a / b);
}
int main(int argc, char *argv[])
{
printf("%d\n", ceiling(7, 3));
printf("%d\n", flooring(7, 3));
return 0;
}
2、递归求解n的阶乘。
#include <stdio.h>
unsigned int factorial(unsigned int n)
{
if (0 == n)
{
return 1;
}
return n * factorial(n - 1);
}
int main(int argc, char *argv[])
{
printf("0! = %u\n", factorial(0));
printf("3! = %u\n", factorial(3));
printf("5! = %u\n", factorial(5));
printf("6! = %u\n", factorial(6));
return 0;
}
3、编写递归函数求两个正整数a和b的最大公约数(GCD,Greatest Common Divisor),
使用Euclid算法:
1. 如果a除以b能整除,则最大公约数是b。
2. 否则,最大公约数等于b和a%b的最大公约数。
Euclid算法是很容易证明的,请读者自己证明一下为什么这么算就能算出最大公约数。
#include <stdio.h>
int max_common_divisor(int a, int b)
{
if (0 == a % b)
{
return b;
}
else
{
return max_common_divisor(b, a % b);
}
}
int main(int argc, char *argv[])
{
printf("%d\n", max_common_divisor(6, 18));
printf("%d\n", max_common_divisor(13, 18));
printf("%d\n", max_common_divisor(36, 18));
printf("%d\n", max_common_divisor(9, 6));
return 0;
}
4、编写程序数一下1到100的所有整数中出现多少次数字9。在写程序之前先把这些问题考虑清楚:
1. 这个问题中的循环变量是什么?
2. 这个问题中的累加器是什么?用加法还是用乘法累积?
3. 取一个整数的个位和十位在第 2 节 “if/else语句”的练习中已经练过了,这两个表达
式应该怎样用在程序中?
#include <stdio.h>
int calc_num(void)
{
int i = 0;
int decade_bit = 0;
int unit_bit = 0;
int cnt = 0;
for (i = 1; i < 100; i++)
{
decade_bit = i / 10;
unit_bit = i % 10;
if (9 == decade_bit)
{
cnt++;
}
if (9 == unit_bit)
{
cnt++;
}
}
return cnt;
}
int main(int argc, char *argv[])
{
printf("%d\n", calc_num());
return 0;
}
5、编写程序打印乘法口诀表。
#include <stdio.h>
void print_multi_table(void)
{
int i = 0;
int j = 0;
for (i = 1; i < 10; i++)
{
for (j = 1; j <= i; j++)
{
printf("%d * %d = %d ",j, i, j*i);
}
printf("\n");
}
}
int main(int argc, char *argv[])
{
print_multi_table();
return 0;
}
6、编写程序打印菱形。
#include <stdio.h>
#include <stdlib.h>
void print_rhombus(int n)
{
int i = 0;
int j = 0;
for (i = 1; i < 2*n; i++)
{
for (j = 1; j < 2*n; j++)
{
if (abs(i - n) + abs(j - n) < n)
{
printf("*");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
int main(int argc, char *argv[])
{
print_rhombus(5);
print_rhombus(9);
return 0;
}
7、编写程序使cpu占用率为%100 %50 和波形呈正弦波形
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <sys/time.h>
/*波形周期,单位ms*/
#define WAVE_T 10*1000
/*采样次数*/
#define SAMPLE_CNT 10000
/*采样间隔,单位us*/
#define SAMPLE_GAP 1*1000
/*圆周率PI*/
#define PI 3.14
void cpu_usage_100(void)
{
while (1);
}
void cpu_usage_50(void)
{
struct timeval time;/*{{{*/
long long start_t = 0;
long long end_t = 0;
while (1)
{
gettimeofday(&time, NULL);
start_t = time.tv_sec * 1000000 + time.tv_usec;
end_t = start_t;
while (end_t - start_t < 60000)
{
gettimeofday(&time, NULL);
end_t = time.tv_sec * 1000000 + time.tv_usec;
}
usleep(60000);
}/*}}}*/
}
void cpu_usage_sine(void)
{
struct timeval time;
long long start_t = 0;
long long end_t = 0;
long long busy_t[SAMPLE_CNT];
long long idle_t[SAMPLE_CNT];
int i = 0;
for (i = 0; i < SAMPLE_CNT; i++)
{
busy_t[i] = SAMPLE_GAP * 0.5 * (1 + sin(2 * PI / SAMPLE_CNT * i));
idle_t[i] = SAMPLE_GAP - busy_t[i];
//printf(" busy_t[%d] = %lld\n", i, busy_t[i]);
//printf(" idle_t[%d] = %lld\n", i, idle_t[i]);
}
i = 0;
while (1)
{
gettimeofday(&time, NULL);
start_t = time.tv_sec * 1000000 + time.tv_usec;
end_t = start_t;
while (end_t - start_t < busy_t[i])
{
gettimeofday(&time, NULL);
end_t = time.tv_sec * 1000000 + time.tv_usec;
}
usleep(idle_t[i]);
i = (i+1) % SAMPLE_CNT;
}
}
int main(int argc, char *argv[])
{
//cpu_usage_100();
//cpu_usage_50();
cpu_usage_sine();
return 0;
}
8、设计一个函数返回一个数组指针。
#include <stdio.h>
int swap(int *a, int *b)
{
if (*a == *b)
{
return 0;
}
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
return 0;
}
int (*fun(void))[3]
{
static int a[3] = {1, 7, 5};
return &a;
}
int main(int argc, char *argv[])
{
int (*p)[3] = NULL;
int i = 0;
int j = 0;
p = fun();
for (i = 0; i < 3; i++)
{
printf("%d\n", (*p)[i]);
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
if ((*p)[j] <= (*p)[j+1])
{
swap(&(*p)[j], &(*p)[j+1]);
}
}
}
for (i = 0; i < 3; i++)
{
printf("%d\n", (*p)[i]);
}
return 0;
}
9、将下面的代码,只改变一个字符输出10个*。
#include <stdio.h>
int main(int argc, char **argv)
{
int cnt = 10;
int i = 0;
for (i = 0; i < cnt; i--)
{
printf("*");
}
return 0;
}
1、 for (i = 0; -i < cnt; i--)
{
printf("*");
}
2、 for (i = 0; i < cnt; cnt--)
{
printf("*");
}
3、 for (i = 0; i + cnt; i--)
{
printf("*");
}
10、不使用if for switch while ? : 语句,也不使用* / 运算符,求1+2+3+… +100?
#include <stdio.h>
int calc_sum(int a)
{
static int sum = 0;
sum += a;
(a--) && calc_sum(a);
return sum;
}
int main(int argc, char *argv[])
{
printf("%d\n", calc_sum(100));
return 0;
}
相关推荐
文件“C语言趣味程序百例精解.pdf”很可能是本书的完整电子版,其中包含详细的实例解析、代码示例和可能的解题思路。而“说明.txt”文件则可能包含了作者对本书的使用指导、注意事项或者一些额外的补充信息,比如...
《C语言趣味程序百例精解》是一本旨在帮助初学者和进阶者深入理解C语言编程的书籍,通过丰富的实例解析,使学习过程更具趣味性。这本书的PDF扫描版提供了一个方便的电子形式,让读者可以随时随地进行学习。下面我们...
### C语言趣味程序知识点解析 #### 知识点一:组合数学与循环结构的应用(程序1) **背景介绍** 在《C语言趣味程序百例》这本书中,第一个例子通过简单的数学问题介绍了如何使用嵌套循环解决实际问题。题目要求找...
### C语言趣味程序设计编程知识点精解 #### 绘制余弦曲线 **知识点解析:** 1. **问题背景及目的:** 在不使用数组的情况下,利用C语言绘制0到360度之间的余弦曲线。目的是理解并掌握C语言处理图形的基本方法,特别...
《C语言趣味程序百例精解》是一本深入浅出的C语言学习指南,它将枯燥的编程概念与趣味性的实例相结合,旨在帮助初学者更好地理解和掌握C语言的基础及高级特性。这本书涵盖了从基本语法、数据类型到控制结构,再到...
《C语言趣味程序百例精解.pdf》作为配套的电子书,应该详细解析了每一个实例的思路、实现过程和解题技巧,同时可能还包括了一些编程陷阱和注意事项,帮助读者避免常见错误,提高代码质量。 总的来说,这本书是一个...
《C语言趣味程序百例精解》是一本深入浅出的C语言学习指南,它以丰富的实例和详尽的解析,帮助读者理解并掌握C语言的核心概念和编程技巧。本书的特点在于将理论与实践相结合,通过趣味性的程序设计,使学习过程更为...
每个实例的解析都是《C语言趣味编程百例静解》的亮点,作者精心设计了详尽的步骤说明,从代码逻辑的构建到程序执行的流程,都一一详细解释。这种对程序细节的深入剖析有助于学习者更深入地理解程序的运行机制,而...
标题中的“电子通信毕业设计资料_0428、C语言趣味程序百例精解.rar”表明这是一份与电子通信专业毕业设计相关的资源,其中包含C语言编程的学习材料,特别是关于C语言趣味程序的实例解析。这个压缩包可能是为了帮助...
《C语言趣味程序百例精选》是一本专为C语言初学者及爱好者设计的学习资源,旨在通过丰富的实例激发学习兴趣,提升编程技能。C语言作为基础的编程语言,以其高效、灵活的特点,广泛应用于系统开发、软件工程、嵌入式...
"C语言趣味程序,进阶教程"是一本专门针对C语言进阶学习者设计的教材,旨在帮助读者通过实践和趣味性的编程例子提升编程技能,特别适合那些参与ACM(国际大学生程序设计竞赛)或其他编程竞赛的学员。 本书可能涵盖...
《C语言趣味程序百例精解》是一本深入浅出介绍C语言编程实践的书籍,适合电子设计、电子竞赛以及毕业设计等领域的初学者和爱好者。C语言作为基础且强大的编程语言,对于理解和掌握硬件控制、系统编程以及嵌入式开发...