C语言第二章-算法-程序的灵魂
-
什么是算法?试从日常生活中找3个例子,描述它们的算法
所谓算法,就是一个问题解决的方法~
例如求解一道数学题,用到的方法就是算法~~~ -
什么叫结构化的算法?为什么要提倡结构化的算法?
结构化算法:由一些顺序、选择、循环等基本结构按照顺序组成,流程的转移只存在于一个基本的范围之内。
结构化算法便于编写,可读性高,修改和维护起来简单,可以减少程序出错的机会,提高了程序的可靠性,保证了程序的质量,因此提倡结构化的算法。 -
试述3种基本结构的特点,请另外设计两种基本结构(要符合基类结构的特点)。
结构化程序设计方法主要由以下三种基本结构组成:
顺序结构:顺序结构是一种线性、有序的结构,它依次执行各语句模块
选择结构:选择结构是根据条件成立与否选择程序执行的通路。
循环结构:循环结构是重复执行一个或几个模块,直到满足某一条件位置
重新设计基本结构要满足以下几点:只有一个入口;只有一个出口;结构内的每一部分都有机会执行到;结构内不存在死循环;
因此给出以下复习结构:
while型和until型循环复合、多选择结构
4.用传统流程图表示求解以下问题的算法
(1)有两个瓶子A和B,分别盛放醋和酱油,要求将他们互换(即A瓶原来盛醋,现在盛酱油,B瓶则相反)。
用两个瓶子显然很难实现,可以借助一个空瓶子C作为中转,先将A中醋导入C中,然后将B中的酱油导入A中,最后将C中的醋导入B中即可实现交换。
(2)依次将10个数输入,要求输出其中最大的数。
//依次将10个数输入,要求输出其中最大的数。
#include<stdio.h>
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<stdio.h>
//输入一个数组、数组的长度
int bubble_sort(int a[], int len)
{
int temp_value,i,j;
//冒泡排序
for(i=0;i<len-1;i++)//扫描轮数,(len-1)次就足够,这里是9轮。
{
for(j=0;j<len-1-i;j++)//比较次数len-1-i。例如len=10时:第一轮比较了9次,第二轮比较了8次,...,第9轮比较了1次
{
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<len_number;i++)
printf("%d ",number[i]);
printf("\n");
bubble_sort(number,len_number); //调用冒泡排序
printf("排序后:");
for(i=0;i<len_number;i++)
printf("%d ",number[i]);
printf("\n");
return 0;
}
(4)求1 + 2 + 3 + … + 100
#include<stdio.h>
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<stdio.h>
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<stdio.h>
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<input_number;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<stdio.h>
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<input_number;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 <stdio.h>
//输入两个整数,求两个数的最大公约数__使用的是辗转相除法
int gcd(int m, int n)
{
int temp;
int mod;
printf("m=%d,n=%d\n",m,n);
//保证m最大
if(m<n)
{
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<stdio.h>
#include<math.h>
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<stdio.h>
#include<math.h>
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<stdio.h>
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.和上面一样
完毕!
本文来自博客园,作者:JaxonYe,转载请注明原文链接:https://www.cnblogs.com/yechangxin/articles/16093743.html
侵权必究