定义操做数num1,num2,结果result=0.运算符ch。 输入num1 while (ch=getchar())!='=' 输入num2 switch(ch) + 运算 result=num1+num2 break - 运算 result=num1-num2 break * 运算 result=num1*num2 break / if num2==0,输出错误 break else 运算 result=num1/num2 break default 输出错误 break num1=result 再下一次循环 输出num1
1. 部分正确 :讨论ch等于'/'及非法符号时答案错误
错误代码:数组
case '/': //当运算符为'/'时分出数位0的特殊状况 if(num2==0){ printf("ERROR\n");//若分母为0,输出错误 ,并跳出循环 break; } else{ result=num1/num2;break; //不然正常运算 default: printf("ERROR\n"); break; //除以上状况所有输出错误
我发现:当switch判断到是'/'号而且除数为0时,尽管已经输出错误信息“ERROR,但break只能结束上面的while循环,循环外面的输出num1的语句仍是会执行,致使答案错误。函数
- 测试非法符号:
我发现:和上面那个是同样的,当输出错误信息“ERROR后,程序还在继续执行,并无要中止致使答案错误。性能
2. 部分正确 :最小表达式错误,即只有一个操做数并没有运算的状况。
学习
错误代码:测试
num1=result;//把每一次的结果放入num1中进行下一次的运算 } printf("%d",result); //输出结果 return 0;
调试过程:
即当没有运算符时,程序不会进入进入while循环,致使输出result时结果为result的初始值0.spa
解决办法:原本想在循环再加一句将num1的值赋给result的语句,后来想到既然num1里每次都存放着result来进入每一次的运算,那么结束时直接输出num1也是同样的效果。设计
3. 本题小结 :
return语句做用:3d
return 0放在main函数里头的中间,程序就提早结束不执行日后的代码了;
return语句在函数中的功能就是退出当前函数并提供一个返回值,函数被终止了,后面的语句就不会被执行了;
若是主函数的类型是 int main(){},那么就须要 return 0;
若是主函数的类型是 void main(){},那么就不须要返回值 ;
上面的状况一样也适用于自定义的函数,可是自定义函数是返回一个具体变量或值。调试
-- 引用自百度知道code
同时也搞清楚break的做用范围:
break语句的调用,起到跳出循环或者分支语句做用。
也就是说,break只有两种使用环境:
1 用于循环体内,包括for, while和do-while循环,做用为跳出break所在循环体。注意,若是是循环嵌套,而break出如今内层,那么只能跳出内层循环,没法跳出外层循环。
2 用于开关语句,即switch - case语句,起到跳出开关语句做用。用于switch嵌套时,与上述循环嵌套效果相同,只能够跳出所在开关语句。
-- 引用自百度知道
主函数: 定义数组a[80].i循环变量,repeat次数。 输入repeat for i=1 to i<=repeat 共repeat次 gets()读入一行字符串。 调用all(a) if 返回值为1 输出YES else 输出NO int all(char a[ ])自定义判断函数: 定义m循环变量 if (a[0] !(下划线,字母)) 返回0 else for i=1 to a[i]!='\000' if (a[i] !(下划线,字母,数字) 返回0 i++ 直到a[i]='\000' 返回1
1. 运行超时:刚开始没用数组,感受是由于这个致使没在规定时间内运行结束,因此后面使用了数组。
2. 答案错误:其实这题兜兜转转用了好多种方法,最后我使用了数组与函数结合的方法解决,这里面最复杂的问题是讨论遇到空格时的状况。
错误缘由:当我输入有空格的字符时,它进入函数直到读到空格时返回0,输出了No,可是它下一次读入的是空格后的字符。
解决办法:当得知是%s的问题之后,我去百度查资料怎样解决%s遇空格结束的问题,因此我将字符串的读取改成gets(),解决了这个问题。
用scanf只能录入连续的字符串,遇到空格就结束,若是你要把空格也吞了,推荐用gets()就可把接收带空格的字符串,它遇回车才结束的。
定义n,i放循环变量,space放空格,xing放* for i=1 to n/2+1 上半部分 for space=1 to space<=n/2+1-i 输出空格。space++,end for xing=1 to xing<=2i-1 输出*空格。xing++,end 换行i++,end for i=1 to i<=n/2 下半部分 for space=1 to space<=i 输出空格。space++,end for xing=1 to xing<=n-2i 输出*空格。xing++,end 换行i++,end
1. 部分正确 :图形不对称,只关注到星号后面要有空格,忽略了前面的空格并非以一个为单位输出的
解决办法:将每次输出的空格改为两个空格。
类型名 数组名 [数组长度];
类型名 数组名[数组长度] = {初值表};
1.定义循环变量i,j和总个数n,以及中间量k,temp.数组a[n] 2.进入for(i = 0; i < n-1; i++)控制循环次数,n个数须要n-1次循环。 3.k赋值为i,在进入内循环for (j=i+1; j < n; j++) ,循环内判断a[j] < a[k],如果则赋值k等于j. 4.重复第3步,直到j=n. 5.若k != i,temp赋值为a[k],a[k]赋值为a[i],a[i]赋值为temp,来交换a[k],a[i]的值。 6.重复第2步,直到i=n-1,结束循环。
1.定义循环变量i,j,总个数n和数组a[n].中间量temp 2.进入for(i=0;i<10-1;i++)控制循环次数,n个数须要n-1次循环。 3.在进入内循环for(j=0;j<9-i;j++)每次比较n-i次,if判断a[j]>a[j+1],若为真,temp赋值为a[j],a[j]赋值为a[j+1],a[j+1]赋值为temp,来交换a[j],a[j+1]的值。 4.重复第3步,直到j=9-i.结束内循环。 5.重复第2步,直到i=10-i.结束循环输出数组内的数
1.从第一个元素开始,temp=a[i],i为循环变量表示不断日后取数,并赋值给temp 2.取出下一个元素,在已经排序的元素序列中从后向前判断,并利用j==1标记它的初始位置 3.找到新元素小于已排序的元素,即temp<a[j-1],就将已排序的该元素移到下一位置 ,将新元素插进去,j-- 4.重复步骤3,直到找到新元素大于或者等于已排序的元素的位置,即temp>=a[j-1] 5.将新元素插入到该位置中,将a[j-1]的值赋给a[j],将temp的值赋给a[j] 6.重复步骤2,直至将全部数据取完
类型名 数组名 [行长度] [列长度];
类型名 数组名 [行长度] [列长度] = { {初值表0},······,{初值表k},······};
类型名 数组名 [行长度] [列长度] = {初值表};
int main() { int i, j, b[3][3]; int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; printf("矩阵原型:\n"); for(i = 0; i < 3; i++) { for(j = 0; j < 3; j++) { b[j][i] = a[i][j]; printf("%d ", a[i][j]); } printf("\n"); } printf("\n"); printf("矩阵转置后:\n"); for(i = 0; i < 3; i++) { for(j = 0; j < 3; j++) { printf("%d ", b[i][j]); } printf("\n"); } getchar(); return 0; }
与矩阵有关的运算
详细罗列不明白地方,包括课堂派错题、PTA错题。
D选项错误:初始化列表的元素数目超过数组长度
B选项中\x是输出16进制的标识
1.static有什么做用
1、定义全局静态变量 :在全局变量前面加上关键字static,该全局变量变成了全局静态变量。全局静态变量有如下特色:
(1)在全局数据区内分配内存
(2) 若是没有初始化,其默认值为0
(3)该变量在本文件内从定义开始到文件结束可见
2、定义局部静态变量:在局部静态变量前面加上关键字static,该局部变量便成了静态局部变量。静态局部变量有如下特色:
(1)该变量在全局数据区分配内存
(2) 若是不显示初始化,那么将被隐式初始化为0
(3) 它始终驻留在全局数据区,直到程序运行结束
(4)其做用域为局部做用域,当定义它的函数或语句块结束时,其做用域随之结束。