为什么输入啥都是wrong呀
#pragma warning(disable:4996)
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
char grade;
char c;
printf("?athematics\n");
scanf("%c", &c);
switch(grade)
{
case'M':printf("right\n"); break;
case'm':printf("right\n"); break;
default:printf("wrong\n");
}
}
fflush(stdin);
scanf("%c", &c);
这样看看
switch(c)啊,grade是啥啊,都是废弃的变量,删掉就行了。
switch(grade)
改成
switch(c)
你对 c 进行输入,c被赋值,但是 grade 一直没有被赋值,switch又对 geade 进行判断,所以一直进行 default:printf("wrong\n");
写代码之前,没学看代码吗
grade是个啥呀,赋值了吗
在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];
//自动跳过一个或多个空格或Tab字符或回车换行,读取下一个字符。
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
算法效率以下两个方面来考虑:
算法时间效率的度量
算法时间效率可以用依据该算法编制的程序在计算机上执行所消耗的时间来度量。
两种度量方法:
事后统计
事前分析
事前分析方法:
每条语句执行一次所需的时间,一般是随机器而异的。取决于机器的指令性能、速度以及编译的代码质量。是由机器本身软硬件环境决定的,它与算法无关。
所以,我们可假设执行每条语句所需的时间均为单位时间。此时对算法的运行时间的讨论就可转化为讨论该算法中所有语句的执行次数,即频度之和了。
例如:求两个n阶矩阵的乘积算法。
for(i=1;i<n;i++){ // 频度为n+1次
for(j=1;j<=n;j++){ // 频度为n*(n+1)次
c[i][j]=0; // 频度为n*n次
for(k=1;k<=n;k++) // 频度为n*n*(n+1)次
c[i][j]=c[i][j]+a[i][k]*b[k][j]; // 频度为n*n*n次
}
}
T(n)=2n3+3n2+2n+1//这是一个关于n的函数 T(n)=2n^3+3n^2+2n+1 // 这是一个关于n的函数 T(n)=2n3+3n2+2n+1//这是一个关于n的函数
为了便于比较不同算法的时间效率,我们仅比较它们的数量级。
例如:两个不同的算法,时间消耗分别是:
若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号),简称时间复杂度。
对于求解矩阵相乘问题,算法耗费时间:
T(n)=2n3+3n2+2n+1 T(n)=2n^3+3n^2+2n+1 T(n)=2n3+3n2+2n+1
n→∞时,T(n)/n3 → 2,这表示n充分大时,T(n)与n2是同阶或同数量级,引入大“O”记号,则T(n)可记作:
T(n)=O(n3) T(n)=O(n^3) T(n)=O(n3)
这就是求解矩阵相乘问题的算法的渐进时间复杂度。
一般情况下,不必计算所有操作的执行次数,而只考虑算法中基本操作执行的次数,它是问题规模n的某个函数,用T(n)表示。
算法中基本语句重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作:
T(n)=O(f(n)) T(n)=O(f(n)) T(n)=O(f(n))
基本语句
问题规模n:n越大算法的执行时间越长。
它表示随着n的增大,算法执行的时间的增长率和f(n)的增长率相|同,称渐近时间复杂度。
若f(n)=amnm+am-1nm-1+……+a1n+a0是m次多项式, 则T(n)=O(nm)。
分析算法时间复杂度的基本方法:
- 1、找出语句频度最大的那条语句作为基本语句;
- 2、计算基本语句的频度得到问题规模n的某个函数f(n);
- 3、取其数量级用符号“O”表示。
时间复杂度是由嵌套最深层语句的频度决定的!!! 时间复杂度是由嵌套最深层语句的频度决定的!!! 时间复杂度是由嵌套最深层语句的频度决定的!!!
设语句②执行次数为x次,由循环条件i<=n,∴2x<=n,∴p<=log2n \begin{aligned} & 设语句②执行次数为x次,\\ & 由循环条件i<=n, \\ & ∴2^x<=n, \\ & ∴p<=log_2n \end{aligned} 设语句②执行次数为x次,由循环条件i<=n,∴2x<=n,∴p<=log2n
2f(n) ≤ n;即f(n) ≤ log2n ,取最大值f(n)= log2n 。
所以该程序段的时间复杂度T(n)=O( log2n )。
请注意:有的情况下,算法中基本操作重复执行的次数还随问题的输入数据集不同而不同。
对于复杂的算法,可以将它分成几个容易估算的部分,然后利用大O加法法则和乘法法则,计算算法的时间复杂度:
T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n))) T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n))) T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))
T(n)=T1(n)×T2(n)=O(f(n))×O(g(n))=O(f(n)×g(n)) T(n)=T1(n)×T2(n)=O(f(n))×O(g(n))=O(f(n)×g(n)) T(n)=T1(n)×T2(n)=O(f(n))×O(g(n))=O(f(n)×g(n))