C语言第二章-算法-程序的灵魂

什么是算法?试从日常生活中找3个例子,描述它们的算法

所谓算法,就是一个问题解决的方法~

例如求解一道数学题,用到的方法就是算法~~~

什么叫结构化的算法?为什么要提倡结构化的算法?

结构化算法:由一些顺序、选择、循环等基本结构按照顺序组成,流程的转移只存在于一个基本的范围之内。

结构化算法便于编写,可读性高,修改和维护起来简单,可以减少程序出错的机会,提高了程序的可靠性,保证了程序的质量,因此提倡结构化的算法。

试述3种基本结构的特点,请另外设计两种基本结构(要符合基类结构的特点)。

结构化程序设计方法主要由以下三种基本结构组成:

顺序结构:顺序结构是一种线性、有序的结构,它依次执行各语句模块

选择结构:选择结构是根据条件成立与否选择程序执行的通路。

循环结构:循环结构是重复执行一个或几个模块,直到满足某一条件位置

重新设计基本结构要满足以下几点:只有一个入口;只有一个出口;结构内的每一部分都有机会执行到;结构内不存在死循环;

因此给出以下复习结构:

while型和until型循环复合、多选择结构

4.用传统流程图表示求解以下问题的算法

(1)有两个瓶子A和B,分别盛放醋和酱油,要求将他们互换(即A瓶原来盛醋,现在盛酱油,B瓶则相反)。

用两个瓶子显然很难实现,可以借助一个空瓶子C作为中转,先将A中醋导入C中,然后将B中的酱油导入A中,最后将C中的醋导入B中即可实现交换。

(2)依次将10个数输入,要求输出其中最大的数。

//依次将10个数输入,要求输出其中最大的数。

#include

int main()

{

int number[10];

int i,j;

char char_value;//用来判断是否按了回车,不然没办法判断输入到什么时候结束

int temp_value;

printf("请依次输入10个数:\n");

do

{

scanf("%d",&number[i]);

i++;

}while(char_value=getchar()!='\n');

for(i=0;i<10;i++)

printf("%d",number[i]);

printf("\n");

//用冒泡排序,为什么用这么复杂的方法,因为冒泡排序是重点的重点,可以解决很多问题

for(i=0;i<9;i++)//比较次数

{

for(j=0;j<9-i;j++)//比较过程

{

if(number[j]>number[j+1]) //比较大小

{

temp_value=number[j];

number[j]=number[j+1];

number[j+1]=temp_value;

}

}

}

printf("排序后:");

for(i=0;i<10;i++)

{

printf("%d ",number[i]);

}

printf("\n");

printf("10个数最大的数值为:%d\n",number[9]);

return 0;

}

(3)有3个数a,b,c, 要求按大小顺序把他们输出

我这里不用书上方法了,这道题和上面这个一样,直接冒泡排序秒杀

#include

//输入一个数组、数组的长度

int bubble_sort(int a[], int len)

{

int temp_value,i,j;

//冒泡排序

for(i=0;i

{

for(j=0;j

{

if(a[j]>a[j+1]) //比较大小,大的冒泡

{

temp_value=a[j];

a[j]=a[j+1];

a[j+1]=temp_value;

}

}

}

}

int main()

{

int a=8,b=7,c=9;

int number[3];

int len_number = 3;

int i,j;

number[0] = a;

number[1] = b;

number[2] = c;

printf("排序前:");

for(i=0;i

printf("%d ",number[i]);

printf("\n");

bubble_sort(number,len_number); //调用冒泡排序

printf("排序后:");

for(i=0;i

printf("%d ",number[i]);

printf("\n");

return 0;

}

(4)求1 + 2 + 3 + … + 100

#include

int main()

{

int i,sum=0;

for(i=1;i<=100;i++)

sum = sum+i;

printf("sum:%d\n",sum);

return 0;

}

(5)判断一个数n能否同时被3和5整除

#include

int main()

{

int digit=22;

if((digit%3)==0 && (digit%5)==0)

printf("数%d能同时被3和5整除\n",digit);

else if((digit%3)==0)

printf("数%d能被3整除\n",digit);

else if((digit%5)==0)

printf("数%d能被5整除\n",digit);

else

printf("数%d既不能被3整除,也不能被5整除\n",digit);

return 0;

}

(6)将100~200之间的素数输出

素数:即数学中的质数,因子只有1和其本身的数字称为质数。

错误的代码,不知道为什么错,没想明白?

#include

int judge_a_prime_number(int a_number)

{

int input_number = a_number;

int i;

int prime_state=1;//0状态为不是,1状态为是素数

for(i=2;i

{

if((input_number%i)==0)

{

prime_state = 0;

}

}

//打印

if(input_number==1)

printf("数字%d既不是素数/质数,也不是合数\n",input_number);

else if(prime_state)

printf("数字%d是素数/质数\n",input_number);

else

printf("数字%d不是素数/质数\n",input_number);

return prime_state;

}

int main()

{

int number,i,flag;

printf("100-200之间的素数为:\n");

for(i=100;i<=200;i++)

flag = judge_a_prime_number(i);

printf("%d\n",flag);

if(flag);

printf("%d ",i);

return 0;

}

正确的代码:

#include

int judge_a_prime_number(int a_number)

{

int input_number = a_number;

int i;

int prime_state=1;//0状态为不是,1状态为是素数

for(i=2;i

{

if((input_number%i)==0)

{

prime_state = 0;

}

}

//打印

if(prime_state)

printf("%d \n",input_number);

return prime_state;

}

int main()

{

int number,i;

printf("100-200之间的素数为:\n");

for(i=100;i<=200;i++)

judge_a_prime_number(i);

return 0;

}

(7)求两个数m和n的最大公约数

#include

//输入两个整数,求两个数的最大公约数__使用的是辗转相除法

int gcd(int m, int n)

{

int temp;

int mod;

printf("m=%d,n=%d\n",m,n);

//保证m最大

if(m

{

temp = m;

m = n;

n = temp;

}

printf("m=%d,n=%d\n",m,n);

//用辗转相除法求最大公约数

while (n!=0)

{

mod = m%n;

m = n;

n = mod;

}

printf("最大公约数为:%d\n",m);

return m;

}

//输入两个整数,求两个数的最小公倍数

//注意:两个数相乘 = 两数最大公约数 * 两数最小公倍数

int lcm(int m, int n)

{

int gcd_value;

int lcm_value;

gcd_value = gcd(m, n);

lcm_value = (m*n)/gcd_value;

printf("最小公倍数为:%d\n",lcm_value);

return 0;

}

//输人两个正整数m和n,求其最大公约数和最小公倍数

int main()

{

int m,n;

int gcd_value;

printf("请输入整数m和n,用空格隔开:\n");

scanf("%d %d",&m,&n);

gcd(m, n);

lcm(m, n);

return 0;

}

求方程ax^2+bx+c=0的根。分别考虑:

有两个不相等的实根;

有两个相等的实根;

#include

#include

int main()

{

float judge_value;

float a = 2;

float b = 1;

float c = -15;

float x1, x2;

judge_value = b*b - 4*a*c;

printf("judge_value:%f\n",judge_value);

if(judge_value<0)

printf("没有实根\n");

else if(judge_value==0)

{

x1 = -b/(2*a);

printf("方程有一个实根:%f\n",x1);

}

else

{

x1 = (-b+sqrt(judge_value))/(2*a);

x2 = (-b-sqrt(judge_value))/(2*a);

printf("方程有2个实根:\nx1=%f\n",x1);

printf("x2=%f\n",x2);

}

return 0;

}

(1)有两个瓶子A和B,分别盛放醋和酱油,要求将他们互换(即A瓶原来盛醋,现在盛酱油,B瓶则相反)。

#include

#include

int main()

{

int a=99,b=66,temp_value;

printf("交换顺序前:a=%d,b=%d\n",a,b);

temp_value = a;

a = b;

b = temp_value;

printf("交换顺序后:a=%d,b=%d\n",a,b);

return 0;

}

其它题目和上面一样。

6.也和上面一样

7.什么叫结构化程序设计,它的主要内容是什么

结构化程序设计(structured programming,简称SP)是进行以模块功能和处理过程设计为主的详细设计的基本原则。其概念最早由E.W.Dijikstra在1965年提出的。结构化程序设计思想确实使程序执行效率提高 ,是软件发展的一个重要的里程碑。

它的主要观点是采用自顶向下、逐步求精的程序设计方法;各个模块通过“顺序、选择、循环”的控制结构进行连接,并且只有一个入口、一个出口 。

8.采用自顶向下、逐步细化的方法进行以下算法的设计

(1)输出1900—2000年中是软黏的年份,符合下面两个条件之一的年份是闰年:

能被4整除但不能被100整除

能被100整除且能被400整除。

#include

int condition1(int year_value)

{

int flag1=0;

int year = year_value;

if (((year%4)==0)&&((year%100)!=0))//能被4整除但不能被100整除

{

flag1=1;

}

return flag1;

}

int condition2(int year_value2)

{

int flag2=0;

int year2 = year_value2;

if (((year2%100)==0)&&((year2%400)==0))//能被100整除且能被400整除

{

flag2=1;

}

return flag2;

}

int main()

{

int i;

int state1,state2;

printf("1900-2000之间的闰年有:\n");

for(i=1900;i<=2000;i++)

{

state1=condition1(i);

state2=condition1(i);

if(state1||state2)

printf("%d年\n",i);

}

return 0;

}

2.和上面一样

3.和上面一样

完毕!

2025-08-08 12:09:53