代码
#include <stdio.h>
int main()
{
int a = 0, b = 0, c = 0;
scanf_s("%d %d\n", & a, & b);
c = a * b;
printf("%d\n", c);
return 0;
}
代码中scanf_s函数的格式字符串中包含了一个回车符(\n),这会导致scanf_s函数在读取a和b的值后停留在输入缓冲区中,直到读取下一个非空白字符。如果想要让这段代码正常工作,可以将scanf_s函数的格式字符串修改为"%d %d",去掉回车符就可以了!
#include <stdio.h>
int main()
{
int a = 0, b = 0, c = 0;
scanf_s("%d %d", &a, &b);
c = a * b;
printf("%d\n", c);
return 0;
}
这样子就应该欧克了!
scanf_s语句格式有问题,
&和变量名之间不能有空格;
scanf_s的格式化字串末尾不要留换行符\n,跟printf相似但是是有差别的,新手容易搞不清楚。
应该是这样
scanf_s("%d%d",&a,&b);
先构建出待排序序列:
typedef struct {
int key;
}ElemType;
typedef struct{
ElemType *n;
int length;
}SSTable;
SSTable CreateTable(){
SSTable st;
st.n = (ElemType*) malloc(sizeof(ElemType) * 7);
st.length = 6;
st.n[1].key = 21;
st.n[2].key = 25;
st.n[3].key = 49;
st.n[4].key = 25;
st.n[5].key = 16;
st.n[6].key = 8;
return st;
}
冒泡排序算法如下:
void BubbleSort(SSTable t){
int i,j;
ElemType temp;
//比较length - 1轮
for(i = 1;i <= t.length - 1;++i){
//每轮比较length - i次
for(j = 1;j <= t.length - i;++j){
if(t.n[j].key > t.n[j + 1].key){
//交换
temp = t.n[j];
t.n[j] = t.n[j + 1];
t.n[j + 1] = temp;
}
}
}
}
我们还可以在此基础上进行一个效率的优化,比如这样的一个序列:
第一轮排序后的结果为:
第二轮排序后的结果为:
第三轮排序后的结果为:
第四轮排序后的结果为:
第五轮排序后的结果为:
可以看到,该序列经过五轮排序后就有序了,但经过上面的分析,该长度为8的序列需要七轮比较,显然后面的两轮就是在做无用功了,那么该如何避免无用的比较呢?
为此,我们可以设置一个标志域,用于标注当前一轮的比较是否进行了交换,若在某轮比较中未发生元素之间的交换,则说明序列已经有序,可以结束操作了。
改进后的算法如下:
void BubbleSort(SSTable t){
int i,j;
int flag = 1; //增设一个标志域,为1表示元素间发生了交换,为0表示未发生交换
ElemType temp;
//比较length - 1轮
for(i = 1;i <= t.length - 1 && flag == 1;++i){
flag = 0; //将flag置为0
//每轮比较length - i次
for(j = 1;j <= t.length - i;++j){
if(t.n[j].key > t.n[j + 1].key){
flag = 1; //元素发生交换,flag置为1
//交换
temp = t.n[j];
t.n[j] = t.n[j + 1];
t.n[j + 1] = temp;
}
}
}
}