目录
第一章
1.程序:就是一组计算机能够识别和执行的指令集合,每一条指令使计算机执行特定操作。
程序设计:从确定任务到得到结构、写出文档的全过程。
2.为什么需要计算机语言?
计算机语言解决了人和计算机交流的语言问题,使得人和计算机都能够识别。
高级语言有哪些特点?
C语言、Java、C++、python、GO 高级语言的数据类型比汇编语言更加丰富,高级语言更加亲近自然语言,人们更容易掌握高级语言 高级语言的编写代码需要经过编译才能编程可执行程序;
高级语言和具体的计算机结构是没有很强的关系,机器语言和计算机有较强的关系
3.解释名词含义:
源程序(.c):未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令
目标程序(.obj):源程序经过编译后可直接被计算机运行的机器码集合,在计算机文件上以.obj作扩展名
可执行程序(.exe):将所有编译后得到的目标模块链接装配起来,在与函数库相连接成为一个整体,生成一个可供计算机执行的目标程序
程序编辑:上机输入或编辑源程序代码
程序编译:
1)用C提供的“预处理器”,对程序中的预处理指令进行编译预处理
2)对源程序进行语法检查,判断是否有语法错误,直到没有语法错误为止
3)自动把源程序转换为二进制形式的目标程序
程序链接:将所有编译后得到的目标模块链接装配起来,在与函数库相连接成为一个整体的过程称为程序链接
程序:一组计算机能识别和执行的指令和代码,运行于计算机上,满足人们的某种需求的信息化工具
程序模块:由汇编程序、编译程序、装入程序或翻译程序作为一个整体来处理的一级独立的、可识别的程序指令
程序文件:程序的文件,其存储是程序,包括源程序和可执行程序
函数:将一段经常需要使用的代码封装起来,在需要使用时可以直接调用,来完成一定功能
主函数:main函数,程序执行的起点
被调用函数:由一个函数调用另一个函数,则称第二个函数为被调用函数
库函数:编译器提供的可在C源程序中调用的函数,分为C语言标准规定的库函数和编译器特定的库函数
程序调试:将编译的程序投入到实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程
程序测试:一个完成了全部或部分功能、模块的计算机程序在正式使用前的检测,以确保该程序能按预定的方式正确地运行
4.printf("%s\n","hello world");
5.共4行,打印时可以调用printf函数进行输出并用\n换行
第二章
1.算法:对求解问题地步骤,对特定问题求解步骤地一种描述
2.结构化算法:由一些顺序、选择、循环等基本结构按照顺序组成,在基本结构之间不存在向前或向后地跳转,流程地控制只存在于一个基本地范围之内;
优点:便于编写,可读性高,修改和维护方便简单,可减少程序出错地机会,提高了程序可靠性,保证了程序地质量,因此体长结构化算法
非结构化算法,流程不受限制地随意跳来跳去,使流程图毫无规律,在阅读时难以理解算法地逻辑,难以阅读和修改,其可靠性和可维护性难以保证
3.三种基本结构:
顺序结构:一种线性、有序地结构,依次执行各行各语句模块
选择结构:根据条件成立与否选择程序执行地通路
循环结构:重复执行一个或几个模块,直到满足某一条件为止,只有一个入口,只有一个出口 结构内地每个部分都有机会被执行到 结构内不能出现死循环
4. 辗转相除法: 如果M小于N,交换M和N,M中存储大数,N中存储小数 N不等于0,循环进行下一个操作 r=m%n; m=n; n=r; N等于0,M即为最大公约数
5.略
6.伪代码表示算法
7.结构化程序设计(SP):进行以模块功能和处理过程设计为主地详细设计原则,采用自顶向下、逐步细化的程序设计方法,先把一个复杂的大问题分解为若干个小问题,对每个小问题编写一个功能上的独立的程序快(模块),将各程序块进行组合成完成的程序 自顶向下 逐步细化 模块化设计 结构化编码
8.略
第三章
1.编程题
2.编程题
3.编程题
4.改错题
5.编程题
6.编程题
7.编程题
8.编程题
(以上题目超级简单,详见《C程序设计》(谭浩强)第5版)
第四章
1.算数运算符:
常见的四则运算:
操作:加减乘除、自增、增减、取模(整除取余),优先级:++ / -- / * / % / + / -
关系运算符:在C中关系运算通常被认定为比较运算;
操作:大于、小于、大于等于、小于等于、等于、不等于,优先级:>、<、≥、≤、==、≠
逻辑运算符:在C中逻辑运算实际上是“与或非”,运算符:与(&&)、或(||)、非(!)
优先级:非、与、或 以上所有优先级:自加、自减、非、算数运算符、关系运算符、逻辑运算符
2.真和假的表示:
逻辑常量:0和1,表示两种对立的状态 - 假、真 逻辑变量:任意数字、任意字符、表达式 - 1>2 真和假的判断: 判断:0表示假、非0表示真
3.略
4.求最大
int main()
{
int a, b, c;
printf("input three number:>");
scanf("%d %d %d", &a, &b, &c);
int max;
if (a > b)
{
max = a;
}
else {
max = b;
}if (max < c)
{
max = c;
}
printf("max is :%d\n", max);
system("pause");
return 0;
}
5.判断输入的数据是否小于1000 小于1000->求平方根 不小于1000->重新提示输入 2.得到平方根,打印输出整数部分
#include <math.h>
int main()
{
double num;
printf("请输入一个正数:>");
scanf("%lf", &num);
if (num < 0 || num >= 1000)
{
printf("请输入一个0~999之间的正数:>");
scanf("%lf", &num);
}
double x = sqrt(num);
printf("%.0lf\n", x);
//printf("%.0lf\n", sqrt(num));
system("pause");
return 0;
}
6.如果x<1 则y=x 如果x>=1&&x<10 则y=2x-1 如果x>=10 则y=3x-11
#include <stdio.h>
int main()
{
int x, y;
printf("请输入一个数字x = ");
scanf("%d", &x);
if (x < 1)
{
y = x;
}
else if (x >= 1 && x < 10)
{
y = 2 * x - 1;
}
if(x >= 10)
{
y = 3 * x - 11;
}
printf("y = %d\n", y);
system("pause");
return 0;
}
7.(1)和(2)都不符合
8.根据成绩所在区间,选择不同的分支语句,得到不同的成绩评级 score >= 90 'A' score >= 80 && score <90 'B' score >= 70 && score <80 'C' score >= 60 && score <70 'D' score <60 'E'
#include <stdio.h>
int main()
{
float score;
char result;
printf("请输入成绩:>");
scanf("%d", &score);
if (score >= 90)
{
result = 'A';
}
else if (score >= 80 && score < 90)
{
result = 'B';
}
else if (score >= 70 && score < 80)
{
result = 'C';
}
else if (score >= 60 && score < 70)
{
result = 'D';
}
else
{
result = 'E';
}
printf("%c\n", result);
system("pause");
return 0;
}
8.略
9.求一个整数有多少位 若数据大于99999或数据小于0则不满足要求,提示错误信息并退出 若数据大于等于10000,则是五位数 若数据大于等于1000,且小于10000,则是四位数 若数据大于等于100,且小于1000,则位三位数 若数据大于等于10,且小于100,则是二位数 若数据小于10,则是一位数
#include <stdio.h>
int main()
{
int num;
printf("请输入一个不大于5位的正整数:>");
scanf("%d", &num);
if (num<0 || num>99999)
{
printf("输入的数据不符合规则!\n");
return -1;
}
if (num >= 10000)
{
printf("这个数字是5位数!\n");
}
else if (num >= 1000 && num < 10000)
{
printf("这个数字是4位数!\n");
}
else if (num >= 100 && num < 1000)
{
printf("这个数字是3位数!\n");
}
else if (num >= 10 && num < 100)
{
printf("这个数字是2位数!\n");
}
else
{
printf("这个数字是1位数!\n");
}
printf("%d\n", num);
system("pause");
return 0;
}
2.分别输出每一位数字 num num/10000=第一位数字 num%10000/1000=第二位数字 num%1000/100=第三位数字 num%100/10=第四位数字 num%10=第五位数字
#include <stdio.h>
int main()
{
int num;
printf("请输入一个不大于5位的正整数:>");
scanf("%d", &num);
if (num<0 || num>99999)
{
printf("输入的数据不符合规则!\n");
return -1;
}
if (num > 10000)
{
printf("%d ", num / 10000);
}
if (num > 1000)
{
printf("%d ", num % 10000 / 1000);
}
if (num > 100)
{
printf("%d ", num % 1000 / 100);
}
if (num > 10)
{
printf("%d ", num % 100 / 10);
}
printf("%d \n", num % 10);
system("pause");
return 0;
}
3.逆序输出每一位数字 将第二个问题思想反过来构思
#include <stdio.h>
int main()
{
int num;
printf("请输入一个不大于5位的正整数:>");
scanf("%d", &num);
if (num<0 || num>99999)
{
printf("输入的数据不符合规则!\n");
return -1;
}
printf("%d ", num % 10);
if (num > 10)
{
printf("%d ", num % 100 / 10);
}
if (num > 100)
{
printf("%d ", num % 1000 / 100);
}
if (num > 1000)
{
printf("%d ", num % 10000 / 1000);
}
if (num > 10000)
{
printf("%d ", num / 10000);
}
printf("\n");
system("pause");
return 0;
}
10.奖金=110% i<=10000 10w - 奖金=满额的10万奖金+超出(1+10000)7.5% i>10000&&i<=20000 10w0.1 20w - 奖金 = 满额的20万奖金 + 超出(1 + 20000)5 % i>20000&&i<=40000 10w0.1+10w0.075 40w - 奖金 = 满额的40万奖金 + 超出(1 + 40000) * 5 % i>40000&&i<=60000 10w0.1+10w0.075+20w*0.05 60w - 奖金 = 满额的60万奖金 + 超出(1 + 60000) * 3 % i>60000&&i<=100000 10w0.1+10w0.075+20w0.05+40w0.03 100w - 奖金 = 满额的100万奖金 + 超出(1 + 100000) * 1 % i>100000
使用switch语句 将利润分为10个档次 10 20 30 40 50 60 70 80 90 100 使用利润除以10w得到利润等级 int level=i/100000
#include <stdio.h>
int main()
{
double salary1 = 100000 * 0.1;//10w
double salary2 = salary1 + 100000 * 0.075;//20w
double salary3 = salary2 + 200000 * 0.05;//40w
double salary4 = salary3 + 200000 * 0.03;//60w
double salary5 = salary4 + 400000 * 0.015;//100
double i, salary;
int level = i / 100000;
printf("请输入你所创造的利润:>");
scanf("%lf", &i);
switch (level)
{
case 0:
salary = i*0.01;
break;
case 1:
salary = salary1 + (i - 100000)*0.075;
break;
case 2:
case 3:
salary = salary2 + (i - 200000)*0.05;
break;
case 4:
case 5:
salary = salary3 + (i - 200000)*0.03;
break;
case 6:
case 7:
case 8:
case 9:
salary = salary4 + (i - 200000)*0.015;
break;
default:
salary = salary5 + (i + 1000000)*0.01;
break;
}
printf("%0.2f\n", salary);
system("pause");
return 0;
}
11.四个数字升序输出 1.找出四个数中最大的数字 a与b比较,如果a<b,数据交换,a中存放较大的数据,然后逐次a与c比较,a与d比较 最终a中存放最大的数字 2.在b c d三个数字中找出最大的数字放到b b与c进行交换,然后再d进行比较交换 3.在c d两个数字中找出较大的数字,放到c中 c与d比较交换 最后,a b c d四个数字就从大到小交换了
#include <stdio.h>
int main()
{
int a, b, c, d;
printf("请输入四个数字:>");
scanf("%d %d %d %d", &a, &b, &c, &d);
if (a < b)
{
int tmp = a; a = b; b = tmp;
}
if (a < c)
{
int tmp = a; a = c; c = tmp;
}
if (a < d)
{
int tmp = a; a = d; d = tmp;
}
if (b < c)
{
int tmp = b; b = c; c = tmp;
}
if (b < d)
{
int tmp = b; b = d; d = tmp;
}
if (c < d)
{
int tmp = c; c = d; c = tmp;
}
printf("%d %d %d %d\n", a, b, c, d);
system("pause");
return 0;
}
12.
1.若输入位置在塔的范围之内,则高度为10㎝,范围之外为0㎝
2.若输入的位置相对于圆心的位置,则长度是否大于半径 长度大于半径,则在范围之外 长度小于等于半径,则在范围之内
3.将四个塔化为一个塔的运算 将输入的位置坐标求取绝对值,进行计算 求取绝对值的接口 double fabs(double num) 求取平方根的接口 double sqrt(double num)
1.获取键盘输入的x,y
2.计算坐标值的绝对值 fx,fy
3.计算坐标值距离圆心的长度 输入的坐标值的位置-圆心的坐标位置=相对于圆心的坐标
4.求取两个位置的直线距离的长度 相对于圆心x距离的平方+相对于距离y的平方=1
5.判断直线距离是否大于半径
#include <stdio.h>
#include <math.h>
int main()
{
float x, y;
printf("请输入坐标值x,y:>");
scanf("%f %f", &x, &y);
float fx = fabs(x);
float fy = fabs(y);
float lx = fx - 2;
float ly = fx - 2;
float len = sqrt((lx*lx + ly*ly));
if (len > 1)
{
printf("输入的位置的建筑物高度为0\n");
}
else{
printf("输入的位置的建筑物高度为10㎝\n");
}
system("pause");
return 0;
}
第五章
1.略
2.
#include <stdio.h>
#include <math.h>
int main()
{
int sign=1;
double pi=0.0,n=1.0,term=1.0;
int count=0;
while(fabs(term)>=1e-6)
{
pi=pi+term;
n=n+2;
sign=-sign;
term=sign/n;
count++;
}
pi=pi*4;
printf("pi=%10.8f\n",pi);
printf("count=%d\n",count);
return 0;
}
#include <stdio.h>
#include <math.h>
int main()
{
int sign=1;
double pi=0.0,n=1.0,term=1.0;
int count=0;
while(fabs(term)>=1e-8)
{
pi=pi+term;
n=n+2;
sign=-sign;
term=sign/n;
count++;
}
pi=pi*4;
printf("pi=%10.8f\n",pi);
printf("count=%d\n",count);
return 0;
}
3.输入两个正整数m和n,求其最大公约数和最小公倍数
最大公约数: “辗转相除法”,以除数和余数反复做除法运算,当中余数为0的时候,就取当中的算式当中的除数为最大公约数
最小公倍数: 两个自然数的乘积=最大公约数最小公倍数
1.从标准输入当中获取两个数字
2.区分两个正整数的较大值(较大值%较小值)
3.辗转相除法-->最大公约数
4.两者的乘积/最大公约数=最小公倍数
5.输出
#include <stdio.h>
int main() {
int n, m;
scanf("%d比较两个值中的较大值和较小值%d", &n, &m);
if (n < m)
{
int tmp = n;
n = m;
m = tmp;
} //为最小公倍数保存两者的乘积,因为在 //辗转相除法的时候,n,m当中的值会发生变化
int total = nm; int r = -1;//r 代表余数
while (m != 0)
{ r = n%m; //为下一次做准备
n = m;
m = r;
} //当前最大公约数经过上面计算已经保存在n中了
printf("最大公约数为:> %d\n", n);
printf("最小公倍数为:> %d\n", total / n);
system("pause");
return 0;
}
4.输入一行字符,分别统计字母、空格、数字和其他字符
1.从标准输入当中获取一行字符,对每一个字符进行甄别,判断是字母、数字、空格还是其他字符 2.getchar函数 可以从标准输入中获取一个字符 输入多个字符后,getchar从缓冲区中读取字符 输入多个字符,用getchar来循环读取 输入一行字符串后,尾部以\n结束 意味着当读到\n时就结束了 3.统计 ['a', 'a']或['A','Z']---》英文字符 ''---->空格字符 ['0','9']---->数字字符 其他字符
#include <stdio.h>
int main()
{
int eng_char = 0;//英文字符
int space_char = 0;//空格字符
int digit_char = 0;//数字字符
int other_char = 0;//其他字符
int c;
while ((c = getchar() )!= '\n') { if ((c >= 'a'&&c <= 'z') || (c >= 'A'&&c <= 'Z'))
{
eng_char++;
}
else if (c == ' ')
{
space_char++;
}
else if (c >= '0'&&c <= '9')
{
digit_char++;
}
else
{
other_char++;
}
}
printf("英文字符:%d个,空格字符:%d个,数字字符:%d个,其他字符:%d个\n", eng_char, space_char, digit_char, other_char);
system("pause");
return 0;
}
5.求Sn=a+aa+aaa+aaaa+.........+aaaa.....aa的值。其中a表示一个数字,n表示a的位数,n由键盘输入。
#include <math.h>
#include <string.h>
int main()
{
int n = 0;
double a, single_num = 0.0,total_sum=0.0;
//从标准输入获取数字
scanf("%d %lf", &n, &a);
for (int i = 0; i < n; i++)
{
single_num += a*pow(10, i);
total_sum += single_num;
}
printf("%lf\n", total_sum);
system("pause");
return 0;
}
6.求1-20的阶乘
#include <stdio.h>
int main()
{
//求1-20的阶乘
double total_sum = 0.0;
//遍历获取[1,20]当中的每一个数字
for (int i = 1; i <= 20; i++)
{
//对每一个数字进行阶乘
double single_num = 1.0;
for (int j = i; j > 0; j--)
{
single_num *= j;
}
//对每个数字阶乘的结果进行求和
total_sum += single_num;
}
printf("%lf\n", total_sum);
system("pause");
return 0;
}
7.求各个表达式的的和
第一个表达式:指的是求1-100的和,1+2+3+……+100,求和之后,和为整数,范围为【1,100】
第二个表达式:指的是求1^2+2^2+3^2+……+50^2,求和之后,和为整数,范围为【1,50】
第三个表达式:指的是求1/1+1/2+1/3+……+1/10,求和之后,和为浮点数,范围为【1,10】
#include <stdio.h>
int main()
{
double total_sum = 0.0, sum1 = 0.0, sum2 = 0.0, sum3 = 0.0;
//[1-100]
for (int i = 1; i <= 100; i++)
{
//累加
sum1 += i;
//[1-50]
if (i <= 50)
{
//累加
sum2 += i*i;
}
if (i <= 10)
{
sum3 = 1.0 / i;
}
}
total_sum = sum1 + sum2 + sum3;
printf("%.2lf\n", total_sum);
system("pause");
return 0;
}
8.当前题意中描述的水仙花数是一个三位数,范围【100,999】 求得三位数当中的每一位数字,可以在代码中可以采用%10的方式
#include <stdio.h>
int main()
{
int a, b, c;
//获取[100,999]的数字
for (int i = 100; i <= 999; i++)
{
//获取三位数字中的每一位
a = i / 100;
b = i / 10 % 10;
c = i % 10;
//进行判断
if (a*a*a + b*b*b + c*c*c == i)
{
printf("%d ", i);
}
}
system("pause");
return 0;
}
9.完数:除了自身之外所有因子之和
例如:6=1+2+3 【1,1000】中所有的完数,当然1除外,1的因子本身就是1
1)如何获取【2,1000】之内所有的数字
2)如何获取data这个数字的所有因子之和 什么因子? 如果一个整数a除以整数b(b!=0),余数为0的情况下,我们就称为b是a的因子 如何求data这个数字的所有因子 data % [1,data) data % [1,data/2]==>(data/2,data) 判断 for(int i=1;i<data/2;i++) if(data%[1,data/2]==0) 因子求和
3)判断当前数是否是完数,因子求和的值是否等于该数本身 因子求和==data 如果等于,按照格式输出
int main()
{
for (int data = 2; data <= 1000; data++)
{
int factor_sum = 0;
for (int factor = 1; factor <= data / 2; factor++)
{
if (data%factor == 0)
{
factor_sum += factor;
}
}
//判断
if (factor_sum == data)
{
printf("%d its factors are ", data);
for (int factor = 1; factor < data /2; factor++)
{
if (data%factor == 0)
{
printf("%d,", factor);
}
}
printf("\n");
}
}
system("pause");
return 0;
}
10.对于下一个分式当中的分子 = 上一个分式当中的分子+分母
对于下一个分式当中的分母 = 上一个分式当中的的分子
对于当前的分式,分式的结果并不是一个整数,所以我们应该在代码中使用浮点类型 保存数据的时候使用浮点数
#include <stdio.h>
main()
{
//a代表分子,b代表分母,total_sum代表分式之和
double a = 2.0, b = 1.0, total_sum = 0.0;
for (int i = 0; i < 20; i++)
{
total_sum = a / b;
//更新分子和分母
double tmp = a;
a = a + b;
b = tmp;
}
printf("%lf\n", total_sum);
system("pause");
return 0;
}
11.注意:保存数据的时候,一定不能使用整数,因为会有小数存在,如果有小数存在,我们在代码中用浮点数进行保存
#include <stdio.h>
int main()
{
//定义高度
double total_meter = 100.0;
//定义小球经过的米数
double ball_total_sum = 0.0;
for (int i = 0; i < 10; i++)
{
//下落+回弹
ball_total_sum += total_meter;
//回弹距离等于高度的一半
total_meter /= 2;
ball_total_sum += total_meter;
}
//第十次回弹的距离
ball_total_sum -= total_meter;
printf("小球经过%lf米,第十次回弹的距离为%lf\n", ball_total_sum, total_meter);
system("pause");
return 0;
}
12.下一天的桃子数量 = 上一天的桃子数量/2-1 (下一天桃子的数量+1)*2=上一天桃子的数量
第10天:1个
第9天: 4个
第8天:10个
第7天:22个
最后,第十天猴子没有吃,只吃了九天
#include <stdio.h>
int main()
{
int day = 9;
int cur_day_count = 1;
int prev_day_count;
while (day > 0)
{
prev_day_count = (cur_day_count + 1) * 2;
//更新
cur_day_count = prev_day_c