@yy0518
2016-04-07T13:05:25.000000Z
字数 2550
阅读 880
C语言学习笔记
(理解偏差的作业)
#include <stdio.h>int main(){int i,j,k,m;int count[50];count[0] = -1;char seg[100];for (i = 0;i < 100;i++) //循环输入英文段存在seg[100]数组中{seg[i] = getchar();if (seg[i] == '#') break;}for (m=0,j=1;m<i;m++) //将所输入的数组中的.找出来,并将它在seg[100]中的位置存在count[50]数组中{if (seg[m] == '.'){count[j] = m;j++;}else if(seg[m] == 10) seg[m] = ' ';//将所有的回车都改为空格符,以免在倒序输出时出现的排版不整齐else ;}for (k = j-1;k>0 ;k--) //倒序输出显示每一个句子{i = count[k]-1;if ((seg[i] != '.'))if((seg[i] >= 97) && (seg[i] <= 122))putchar(seg[i] - 32); //若这个句子至少有一个字符,将最后一个小写字母变换成大写字母elseputchar(seg[i]);for (i-=1;i > count[k - 1]+1;i--) //原样倒序显示两个句号之间的除开首字母和最后一个字母的全部字符putchar(seg[i]);if(seg[i]!='.')if((seg[i]>=65)&&(seg[i]<=90))putchar(seg[i] + 32);elseputchar(seg[i]); //若这个句子不止一个字符,且它为大写字母的话,将其改为小写字母显示printf(".");}return 0;}
运行结果:
There are so many plants.looks very beautiful.
lemon is so sour.But I like it.#
Ti ekil I tub.Ruos os si nomel .Lufituaeb yrev skool.Stnalp ynam os era ereht.请
按任意键继续. . .
结果分析:
虽然看错了作业题,程序结果也不符要求,但也毕竟花了好久的时间才调试出来跟我所想的要求一样的程序
虽然有时侯没有语法错误,但很容易出现逻辑错误,当数组下标为负时还出现一堆一堆的乱码。而且出现逻辑错误还很难检查出来,初值或循环条件或变量设置的不合理或者其他没注意的细节出错,就没办法得到预料之中的结果。注意细节啊!!!
折腾了一中午终于改好了,程序如下:
#include"stdio.h"int main(){char seg[100];int i,m1,m2,k;for (i = 0;i < 100;i++) //获得键盘输入,通知字符为‘#’{seg[i] = getchar();if (seg[i] == '#') break; //停止符出现之后break,i的值并没有加1.}m2 = i-1; //注意m2的初值for (i-=2;i >= 0;i--){if (seg[i] == '#') continue;else if (seg[i] == '.'){if ((seg[i + 1] >= 65) && (seg[i + 1] <= 90)) //将句号右边第一个单词的第一个字母变换成小写seg[i + 1] += 32;if (seg[i + 1] != '#'){m1 = i;for (k = m1+1;k < m2;k++)putchar(seg[k]);printf(".");m2 = m1;}}else if (seg[i] == ' ' || seg[i] == ','){m1 = i;if ((seg[m2] == '.') && (seg[m1 + 1] >= 97) && (seg[m1 + 1] <= 122))seg[m1 + 1] -= 32;for (k = m1+1;k < m2;k++)putchar(seg[k]);putchar(seg[m1]);m2 = m1;}else if (i == 0) //如果已经到了最后一个字符{m1 = i;if ((seg[m2] == '.') && (seg[m1] >= 97) && (seg[m1] <= 122)) seg[m1] -= 32;if ((seg[m2] != '.') && (seg[m1] >= 65) && (seg[m1] <= 90)) seg[m1] += 32;for (k = m1;k < m2;k++)putchar(seg[k]);printf(".");}else continue;}return 0;}
运行结果:
Succeed finally.I'm so happy.#
Happy so i'm.Finally succeed.请按任意键继续. . .
结果分析:
可能程序又写得太繁琐了,逻辑真的好容易出错啊,对着错误的结果一直找程序的错误,一点一点改,改错误的过程还是蛮好玩的~不过决定下次写之前先画个流程图好了,省得一开始就出现太多的错误。
尤其提醒一个完全没看出来的错误,对着结果才试出来可能是错了。。break之后i++并不会执行了。
由于最近看ARM的程序,好多看不懂的,所以先恶补一下这块用的比较多的位操作。
1 C的位运算符
位运算符主要包括位的逻辑运算符和移位运算符。
逻辑运算符:
(1)按位取反:~
纠正一下一开始的错误想法,还以为位运算符只是针对bool量,然而其实是用于整型数据包括char.
如:unsigned char a=0;
printf("%hhu", ~a);//注意打印的格式修饰符,感觉要记住的好多,好容易出错
结果为:255
取反之后并不代表a的值发生了变化只有像a = ~a;才会改变a的值。
(2)位与:& (取地址符。。。)
(3)位或:|
(4)位异或:^
后三种都可以写成 &=、|=、^=的赋值形式,但取反木有这样的形式。。取反~的优先级比较高也比较特殊哈~
移位运算符:
(1)左移:<<
运算符右侧的操作数决定运算符左侧的操作数左移的位数。空出的位用0来补充,移出的数则丢弃。
(2)右移:>>
运算符右侧的操作数决定运算符左侧的操作数右移的位数。同左移一样,空位都用0来补充,移出的丢弃。
同上,这两个操作并不产生新值,如果需要方便地改变变量的值,可以用<<=、>>=的移位赋值运算符。并且移位运算符可以方便提供对2的幂乘法和除法。因为对于二进制数来说,右移一位不就是除以2了嘛。