1. 从键盘输入3个整数,求其中的最大数和最小数,并输出结果。
分析题目任务一:要求是求其中的最大数和最小数,这里需要两个变量,分别定义为max,min,
任务二:输出结果。
完成任务所需要的材料:3个输入的整数,分别定义为x,y,z。
#include<stdio.h>
void main()
{
int x,y,z,max,min; //这里的变量我们没有给它们初始化
printf("Please input three integer number: ");
scanf("%d %d %d", &x, &y, &z);
if((x>y)&&(x>z))
{ max=x;
if(y>z) min=z;
else min=y;
}
else if((y>x)&&(y>z))
{ max=y;
if(x>z) min=z;
else min=x;
}
else if((z>x)&&(z>y))
{ max=z;
if(x>y) min=y;
else min=x;
}
}
以上的编程的思路是分别假设了x,y,z是最大的,然后去找最小的,看上去合理,其实是错误的。这里首先要区分任务与材料的关系,我们的任务是从材料中找到最大和最小的数,但有一个问题,材料中到底有没有最大与最小的数了?有几个这样的最大,最小的数了?如果有最大和最小的数,我们的这种假设的编程可能还有对的余地,但如果本身提供的材料中就没有最大与最小的数,那么我们的假设就是错误的,我们基于这种假设的编程也不会是正确的。这里我们的材料可以是有两个数是相同的,如5,5,4,也可以是都相同的,如3,3,3。显然我们的编程是错误的。
我们错在哪里?首先不提倡用假设的方法去编程,因为人能假设出来的情况可能只是所有情况的子集。另外我们即使用假设的思路编程,我们假设的对象也是错误的,不应该从任务去假设,而是从获得的材料去假设。我们知道一点就是我们要完成的任务是什么,但我们分析这个任务要从材料开始,如x,y,z有么有数学关联?有没有逻辑要求?等等。
# include "stdio.h"
void main()
{
int x, y, z, max, min; //这里的变量我们没有给它们初始化
printf("Please input three integer number:");
scanf("%d %d %d", &x, &y, &z);//x,y,z变量赋值了,max, min在何时赋值了?
min = max = x; //对材料进行假设
if(x==y && y==z) //以材料进行分类
printf("x = y = z, max=min=%d\n", max);
else
{
if (y>max) max = y;
if (z>max) max = z;
if (y<min) min = y;
if (z<min) min = z;
printf("max=%d, min=%d\n", max, min);
}
}
2.求
这里最想说的就一点,算术中的1/k在程序里要是不改成1.0/k,后面的结果就不对了。整数相除小数点会舍去取整。
#include <stdio.h>
void main()
{
int i,sum1=0,sum2=0;
double sum3;
for(i=1;i<=100;i++)
sum1 +=i;
for(i=1;i<=50;i++)
sum2 +=i*i;
for(i=1;i<=10;i++)
sum3 +=1.0/i; //注意这里
printf(“The result is %.2f”,sum1+sum2+sum3);
}
3.任意输入10个整数,打印出10个数中的最大值
首选我们还是要分析任务与材料。回忆过去的编程中涉及到的数据获取后的处理,可分为两类:一种是所获取的数据要存储后在处理,一种是获取数据后不需要存储立即处理数据。前一种如果数据量很大的话,存储数据就要花销不少的时间,优点是实时性要求不是很高,后一种是没有存储数据的时间开销,缺点是对实时性要求较高。而数据的处理上通常是找出符合要求的数或者对数据进行符合要求的排序。
处理方法一:实时处理,不去存储数据。
#include <stdio.h>
void main()
{
int n, max, i;
scanf("%d", &max);
for (i = 1; i < 10; i ++)
{
scanf("%d", &n);
if (n > max)
{
max = n;
}
}
printf("max=%d", max);
}
处理方法二:先存储数据,然后在处理。
#include <stdio.h>
void main()
{
int num[10], max, i;
for (i = 0; i < 10; i ++)
{
scanf("%d",&num[i]);//容易丢掉&运算符
}
max =num[0];
for (i = 1; i < 10; i ++)
{
if(num[i]>max) max=num[i]; //这里还需要注意,没有涉及到数组的排序。实际应用中可能不仅要找到最大的数,
//还要知道这样的最大的数有多少个?
}
}
for (i = 0; i < n-1; i++)
for (j = 0; j < n-1- i; j++)
if (a[j] < a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
{ int temp;
uchar i,j;
for(j=0;j<length-1;j++)
for(i=0;i<length-1-j;i++)
{
if(*(p+i)>*(p+1+i))
{
temp = *(p+i);
*(p+i) = *(p+1+i);
*(p+1+i) = temp;
}
}
}