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

  1. 什么是算法?试从日常生活中找3个例子,描述它们的算法
    所谓算法,就是一个问题解决的方法~
    例如求解一道数学题,用到的方法就是算法~~~

  2. 什么叫结构化的算法?为什么要提倡结构化的算法?
    结构化算法:由一些顺序、选择、循环等基本结构按照顺序组成,流程的转移只存在于一个基本的范围之内。
    结构化算法便于编写,可读性高,修改和维护起来简单,可以减少程序出错的机会,提高了程序的可靠性,保证了程序的质量,因此提倡结构化的算法。

  3. 试述3种基本结构的特点,请另外设计两种基本结构(要符合基类结构的特点)。
    结构化程序设计方法主要由以下三种基本结构组成:

顺序结构:顺序结构是一种线性、有序的结构,它依次执行各语句模块
选择结构:选择结构是根据条件成立与否选择程序执行的通路。
循环结构:循环结构是重复执行一个或几个模块,直到满足某一条件位置

重新设计基本结构要满足以下几点:只有一个入口;只有一个出口;结构内的每一部分都有机会执行到;结构内不存在死循环;
因此给出以下复习结构:
while型和until型循环复合、多选择结构
image

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

(1)有两个瓶子A和B,分别盛放醋和酱油,要求将他们互换(即A瓶原来盛醋,现在盛酱油,B瓶则相反)。
用两个瓶子显然很难实现,可以借助一个空瓶子C作为中转,先将A中醋导入C中,然后将B中的酱油导入A中,最后将C中的醋导入B中即可实现交换。

image

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

//依次将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;
}

image

(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;
}

image

(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;
}

image

(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;
}

image

(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;
}

image

正确的代码:

#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;
}

image

(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;
}

image

求方程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;
}

image

(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;
}

image

其它题目和上面一样。

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;
}

image

2.和上面一样

3.和上面一样

完毕!

posted @ 2022-04-02 19:57  JaxonYe  阅读(77)  评论(0编辑  收藏  举报