参考书籍:C程序设计(第五版 谭浩强著作)
程序有错误的话,欢迎指正哦
第二章的主要内容是用几种方式来表示算法。
1、自然语言(不推荐,方便理解,但是可读性比较差)
2、流程图(代码简单的时候推荐,可以帮助自己理清思路)
3、N-S流程图(代码简单的时候推荐,可以帮助自己理清思路)
4、伪代码
5、计算机语言
这里画流程图的工具推荐如下(适合电脑),当然也可以直接在本子上画。
iodraw
例题2-1 求1x2x3x4x5
当我们用流程图书写完毕后,思路就会变得更加清晰。
当然用N-S图表示也是可以的。
好了,既然思路有了,就开始写代码吧。
#include <stdio.h>
int main(void)
{
int t = 1;
int num = 1;
while(num<5)
{
num = num + 1;
t = t * num;
}
printf("1x2x3x4x5 = %d",t);
return 0;
}
例题2-2 有50个学生,要求输出程序在80分以上的学生的学号和成绩。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int num = 0;
int a[50] = {0};
int b[50] = {0};
srand((unsigned)time(NULL));
while(num<=49)
{
a[num] = num + 1;
b[num] = rand() % 101; //产生0~100的随机数
num = num + 1;
}
num = 0;
while(num<=49)
{
if(b[num]>80)
printf("学生的学号为:%d,学生的成绩为:%d\n",a[num],b[num]);
else
{}
num = num + 1;
}
return 0;
}
例题2-3 判断2000-2500年中的每一年是否为闰年,并将结果输出。
(1)能被4整除,但是不能被100整除。
(2)能被400整除。
这里有一点需要说明,当year%4=0为假的时候,既不符合第一条,也不符合第二条(不能被4整除的数,在2000-2500之间,也同样没办法400整除)。
#include <stdio.h>
unsigned int year = 2000;
unsigned int count = 0;
int main(void)
{
while(year<=2500)
{
if(year % 4 != 0)
{}
else
{
if(year % 100 != 0)
{
printf("%d是闰年\n",year);
count = count + 1;
}
else
{
if(year % 400 == 0)
{
printf("%d是闰年\n",year);
count = count + 1;
}
}
}
year = year + 1;
}
printf("2000-2500之前是闰年的个数为:%d",count);
return 0;
}
例题2-4 求1-1/2+1/3-1/4+…+1/99-1/100
#include <stdio.h>
double sign = 1;
int i = 1;
double sum = 0.0;
int main(void)
{
while(i <= 100)
{
sum = sum + sign/i; //两个实数相除结果是双精度实数,两个整数相除结果是整数
printf("%0.6f\n",sign/i);
sign = (-1)*sign;
i = i + 1;
}
printf("1-1/2+1/3-1/4+…+1/99-1/100=%f",sum);
return 0;
}
例题2-5给出一个大于或等于3的正整数,判断它是不是一个素数。
素数,是指除了1和该数本身,不能被其他任意整数的数整除。
#include <stdio.h>
unsigned int number = 0;
unsigned int i = 2;
int main(void)
{
printf("请输入一个正整数\n");
scanf("%d",&number);
while(i<=number-1)
{
if(number % i == 0)
{
printf("%d不是素数\n",number);
break;
}
i = i + 1;
}
if(i == number)
{
printf("%d是素数\n",number);
}
return 0;
}
下面需要讲解的是测试环境,也就是验证程序的可靠性。
思路:准备1-100的已知素数。
2,3,5,7,11,13,17,19,23,29,31,37,41,43,53,59,61,67,71,73,79,83,89,97
下面修改后的代码。
#include <stdio.h>
unsigned int number = 0;
unsigned int i = 2, j = 0;
unsigned int a[24] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,53,59,61,67,71,73,79,83,89,97};
unsigned int count = 0; // count是指的是1-100的素数的个数
int main(void)
{
//printf("请输入一个正整数\n");
//scanf("%d",&number);
//---------------待测试的部分--------------//
while(j<=23)
{
number = a[j];
i = 2;
while(i<=number-1)
{
if(number % i == 0)
{
printf("%d不是素数\n",number);
break;
}
i = i + 1;
}
if(i == number)
{
printf("%d是素数\n",number);
count = count + 1;
}
j = j + 1;
}
printf("1-100中素数的个数为%d",count);
//-----------------------------------------//
return 0;
}
接着还可以在上述的尝试中加入一个错误项,看程序能否抓出。
思路:准备1-100的已知素数。
2,3,4,5,7,11,13,17,19,23,29,31,37,41,43,53,59,61,67,71,73,79,83,89,97,98,99,100
#include <stdio.h>
unsigned int number = 0;
unsigned int i = 2, j = 0;
unsigned int a[28] = {2,3,4,5,7,11,13,17,19,23,29,31,37,41,43,53,59,61,67,71,73,79,83,89,97,98,99,100};
unsigned int count = 0; // count是指的是1-100的素数的个数
int main(void)
{
//printf("请输入一个正整数\n");
//scanf("%d",&number);
//---------------待测试的部分--------------//
while(j<=27)
{
number = a[j];
i = 2;
while(i<=number-1)
{
if(number % i == 0)
{
printf("%d不是素数\n",number);
break;
}
i = i + 1;
}
if(i == number)
{
printf("%d是素数\n",number);
count = count + 1;
}
j = j + 1;
}
printf("1-100中素数的个数为%d",count);
//-----------------------------------------//
return 0;
}
课后4-1 有两个瓶子A和B,分别盛放醋和酱油,将他们互换一下。
#include <stdio.h>
int A = 1,B = 2;
//这里的A盛放的是醋(1),2表示盛放的酱油(2)
int empty_bottle = 0;//空瓶
int main(void)
{
printf("change before: A = %d, B = %d\n", A, B);
empty_bottle = A;
A = B;
B = empty_bottle;
printf("change after: A = %d, B = %d\n", A, B);
return 0;
}
课后4-2 依次将10个数输入,求得输入得最大的数。
#include <stdio.h>
int a[10] = {0};
unsigned int i = 0;
int empty_bottle = 0;
int main(void)
{
for(i = 0;i <= 9;i++)
{
printf("请输入第%d个数\n",i+1);
scanf("%d",&a[i]);
}
for(i = 0;i <= 8;i++)
{
if(a[i]>a[i+1])
{
empty_bottle = a[i];
a[i] = a[i+1];
a[i+1] = empty_bottle;
}
}
printf("输入的10个数中最大的值为%d",a[9]);
return 0;
}
课后4-3 有三个数a,b,c,要求按照大小顺序把他们输出。
#include <stdio.h>
int a = -1,b = 1,c = -2;
int empty_bottle = 0;
int main(void)
{
printf("change before: a = %d,b = %d,b = %d\n",a,b,c);
//冒泡排序法
if(a>b)
{
empty_bottle = a;
a = b;
b = empty_bottle;
}
if(b>c)
{
empty_bottle = b;
b = c;
c = empty_bottle;
}
if(a>b)
{
empty_bottle = a;
a = b;
b = empty_bottle;
}
printf("change after: a = %d,b = %d,b = %d\n",a,b,c);
return 0;
}
课后4-4 求1+2+3+…+100
#include <stdio.h>
unsigned int sum = 0;
int main(void)
{
for(int i = 1;i<=100;i++)
{
sum = sum + i;
}
printf("1+2+3+...+100 = %d\n",sum);
return 0;
}
课后4-5 判断一个数n能否同时被3和5整除
#include <stdio.h>
unsigned int n = 0;
int main(void)
{
printf("请输入一个数\n");
scanf("%d",&n);
if(n % 3 == 0 && n % 5 == 0)
printf("输入的数n=%d能同时被3和5整除",n);
else
printf("输入的数n=%d不能同时被3和5整除",n);
return 0;
}
课后4-6 将100-200之间的素数输出
#include <stdio.h>
unsigned int number = 0;
unsigned int i = 2;
unsigned int j = 100;
unsigned int count = 0; // count是指的是100-200的素数的个数
int main(void)
{
while(j<=200)
{
number = j;
i = 2;
while(i<=number-1)
{
if(number % i == 0)
{
//printf("%d不是素数\n",number);
break;
}
i = i + 1;
}
if(i == number)
{
printf("%d是素数\n",number);
count = count + 1;
}
j = j + 1;
}
printf("100-200中素数的个数为%d",count);
//-----------------------------------------//
return 0;
}
课后4-7 将两个数m和n的最大公约数。
#include <stdio.h>
unsigned int m = 0;
unsigned int n = 0;
int main(void)
{
printf("请输入两个数m与n\n");
scanf("%d%d",&m,&n);
unsigned int m_value = 0;
if(m > n)
m_value = m;
else
m_value = n;
//根据输入的数据创建相应大小的数组
unsigned int a[m_value];
unsigned int b[m_value];
for(int i = 1;i <= m_value;i++)
{
if(m % i == 0)
a [i-1] = i;
else
a [i-1] = 0;
printf("a[%d]=%d\n",i-1,a[i-1]);
}
for(int i = 1;i <= m_value;i++)
{
if(n % i == 0)
b [i-1] = i;
else
b [i-1] = 0;
printf("b[%d]=%d\n",i-1,b[i-1]);
}
for(int i= m_value; i >=1; i--)
{
for(int j= m_value; j >=1;j--)
{
if(a[i-1]!= 0 && b[j-1]!=0)
{
if(a[i-1] == b[j-1])
{
printf("最大公因数为%d\n",a[i-1]);
goto final; //找到直接结束,不再继续寻找
}
}
}
}
final:
return 0;
}
课后4-8 求方程式ax^2+bx+c=0的根,需要分别考虑有两个不等的实根以及两个相等的实根。
#include <stdio.h>
#include <math.h>
double a = 0,b = 0,c = 0;
double dela = 0;
double x1 = 0,x2 =0;
int main(void)
{
printf("请输入二次方程式的a、b、c的值,注意a不能为0\n");
scanf("%lf%lf%lf",&a,&b,&c);
dela = b*b-4*a*c;
if(dela == 0) //有相同实根
{
x1 = x2 = -b/(2*a);
}
else if(dela > 0) //有不同实根
{
x1 = (-b + sqrt(dela))/(2*a);
x2 = (-b - sqrt(dela))/(2*a);
}
else //
{ }
printf("dela=%f\n",dela);
printf("x1=%f,x2=%f\n",x1,x2);
return 0;
}
课后8-1 输入1900-2000年中的闰年的年份。
要求:1、能被4整除但不能被100整除。2、能被100整除且被400整除。
#include <stdio.h>
unsigned int year = 1900;
int main(void)
{
while(year <= 2000)
{
if(year % 4 == 0)
{
if(year % 100 != 0)
printf("%d是闰年\n",year);
else
{
if(year % 400 == 0)
printf("%d是闰年\n",year);
}
}
year = year + 1;
}
return 0;
}
课后8-2 求方程式ax^2+bx+c=0的根,需要分别考虑有两个不等的实根以及两个相等的实根以及根不存在的情况。
#include <stdio.h>
#include <math.h>
double a = 0,b = 0,c = 0;
double dela = 0;
double x1 = 0,x2 =0;
double real = 0, imaginary = 0;
int main(void)
{
printf("请输入二次方程式的a、b、c的值,注意a不能为0\n");
scanf("%lf%lf%lf",&a,&b,&c);
dela = b*b-4*a*c;
if(dela == 0) //有相同实根
{
x1 = x2 = -b/(2*a);
printf("dela=%f\n",dela);
printf("x1=%f,x2=%f\n",x1,x2);
}
else if(dela > 0) //有不同实根
{
x1 = (-b + sqrt(dela))/(2*a);
x2 = (-b - sqrt(dela))/(2*a);
printf("dela=%f\n",dela);
printf("x1=%f,x2=%f\n",x1,x2);
}
else
{
printf("该方程无实根,但是存在复数根\n");
real = -b/(2*a);
imaginary = sqrt(fabs(dela))/(2*a);
printf("x1 = %f + %fi,x2 = %f -%fi",real,imaginary,real,imaginary);
}
return 0;
}
课后8-3 由于上面已经写过代码,这里省略。