标签:逻辑 慢慢 实验 ++ 异常 读取 用两个 进入 源文件
1.定义year代表出生的年份,repeat代表循环操作,max代表某个数最多重复次数
2.int i, k, j, m; //代表数值下标和循环次数
3.输入year和repeat
4.定义数值a[4]b[4]来分别存放year中的数字和对应数字在year中的出现次数
5.遍历数组a[4]来统计数字的出现次数并把对应值存放在b[4]
6.遍历数组b[4]来寻找最大值
7.发现n个数字不同可以转化成 max+repeat=5 的条件
8.若max == (5 - repeat) 输出对应岁数和年份,若不是,则继续下一轮循环
于是进行调试,通过监测变量发现b的值会累加
明白了问题出在:一次循环后应该把b的值重新清空
根据第二个测试点提示的最大边界发现输入3000 4 输出0 3000,通过调试发现发现当year=3001时无法进入循环体,发现了循环条件出错,不应该用for(i=year;i<=3000;i++)否则如果输入3000 4.结果应该是3012,而我的代码的i是不会循环到3012。于是把i<=3000去掉
于是进行需要补零情况的测试
发现结果是正确的,多次调试无果后,后遂无问津者。
1.定义book[i][0]用来保存第i本书的‘S‘或者‘E‘,book[i][1]用来保存‘S‘时候的时间,count表示借书次数
2.定义book[1001][2], i, j, n, num, hour, minute, count, average, sum;
3.定义字符ch来存放输入的S或者E
4.输入n的值
5.for (i = 0; i < n; i++) {
count = 0; //清空记录
sum = 0;
6.for (j = 0; j < 1001; j++) {
book[j][0] = 0; //清除一下第i天的S和E
}
7.读取整行数据,num表示第几本书,ch表示‘S‘或‘E‘,hour和minute表示时间,当num!=0的时候继续循环
8.if (ch == ‘E‘) { 如果碰到整行数据有‘E‘,表示还书来了
9.if (book[num][0] == ‘S‘) { //book[num][0] == ‘S‘表示第num本书保存有借书记录
sum += 60 * hour + minute - book[num][1];//sum进行累加,还书时的时间减去借书时保存的时间就是借阅时间
count++;
book[num][0] = 0;//为避免出现‘S‘‘E‘‘E‘的异常,把S换为0
}
}
//如果碰到整行数据有‘S‘,表示借书,此时记录好S和借书时间
else {
book[num][0] = ‘S‘;
book[num][1] = hour * 60 + minute;
}
}
//一天没人借书还书或出错,输出0 0
if (count == 0) {
printf("0 0\n");
}
else { //计算平均时间,因为平均数是整数,所以加0.5,成浮点数,赋值给average自动取整数
average = 1.0*sum / count + 0.5;
printf("%d %d\n", count, average);
}
8.if (flag == 1) 输出YES
3.检测每组数据后都要把flag重置为1. 小体会:像这种进行多次循环操作的记得要清空上一轮循环的数据
c语言将字符串作为一个特殊的一维字符数组来处理。
1.字符串的存储一数组初始化
字符串可以存放在一维字符数组中。例如:
staticchar s [6]= I‘H‘,‘a‘,‘p‘,‘p‘,‘y‘,‘\O‘ ;
数组s 中就存放了字符串"Happy"。
字符数组的初始化还可以使用字符串常量,上述初始化等价于:
static char s [6]= {"Happy" };
或
static char s[6]=‘‘Happy‘‘ ;
字符串的结束标志: 字符"\0‘
注意:空字符: 转义字符,不是空格字符
将字符申存人一维字符数组后,对字符串的操作就是对该字符数组的操作。但是,它和普通字符数组的操作又有所不同。以遍历数组或字符串为例,由于普通数
组中数组元素的个数是确定的,一般用下标控制循环; 而字符串并没有显式地给出有效字符的个数,只规定在字符串结束符‘\0之前的字符都是字符串的有效字符,一般通过比较数组元素的值是否等于 ’\0‘ 来决定是否结束循环,(加红)即用结束符’0来控制循环。
(1)scanf("%s",str)
输入参数:字符数组名,不加地址符
遇回车或空格输入结束
并自动将输入的一串字符和"0‘ 送入数组中
2 )gets(str)
遇回车输入结束,自动将输入的一串字符和"10^ 送入数组中
补充:字符串的输出
char str[80];
for (i = O; str[i] !=*\O‘; i++)
putchar (str[i]);
输出参数可以是字符数组名或字符串常量
(3 )printf ("%s",str)
printf ("%s","hello");
组名或字符串常量,输出遇"O‘ 结束
(4) puts (str)
puts ("hello");
输出字符串后自动换行(注意)
char number[i] //定义数字字符数组
int i,j=0,k=1,n; //定义i为循环次数,j来存放转换后的整数,n用来统计该数组中有几个数字字符
for(i=0;number[i];i++) //遍历数字字符数组
number[i]-=‘0‘; //把数字字符转换成整数后一一对应放在num[i]数组中
for(i=n;i>=0;i--)
{
j+=number[i]*k; //将num[i]中的数一个个提出来后乘以k使对应成为个位十位百位组成新的整数
k*=10;
}
printf("%d",j); //输出整数
int count=1;
for (int i=length-1;i>=0;i--) //遍历数组
{
if ((revstr[i]>=‘0‘) && (revstr[i]<=‘9‘))
num[i]=revstr[i]-48; //字符0的ASCII值为48
else if ((revstr[i]>=‘a‘) && (revstr[i]<=‘f‘))
num[i]=revstr[i]-‘a‘+10;
else if ((revstr[i]>=‘A‘) && (revstr[i]<=‘F‘))
num[i]=revstr[i]-‘A‘+10;
else
num[i]=0;
result=result+num[i]*count;
count=count*16;//十六进制 (如果是二进制就在这里乘以2)
}
1.从这周的数组开始,代码难度和复杂程度明显上升了一个阶梯,虽然已经快要结束数组的学习,但是对二维数组的灵活运用和存储位置等理解还是不够,特别是很重要的几种排序方法,我还只是看得懂会理解,如果要自己亲手写肯定会出现一些错误,所以我要找时间把这几个排序的方法独立地写一遍
2.课堂派的错题:
1.对题型不熟悉导致没把握好时间,没有合理分配时间,在选择题上花费了较多的时间,而且得分率不好,可以看出我对很多基础概念eg(static,auto,extern具体的作用范围啥的)都很模棱两可而平时却没有去复习去完全地掌握这些概念,对课堂派预习作业错题也没有全部掌握,这是我值得认真反思的地方
2.在程序分析题中,因为太着急和平时代码阅读量不够多,导致考试的时候对代码的理解是一知半解的,导致答案总是有一点点小出入造成失分严重
3.程序编写中,因为卡在第一题的产生随机数而花费了很多没必要的时间,这是值得反思的考试习惯,对这种不熟练不会的东西我们要学会适当地舍弃而不是白白浪费太多的时间,最重要的是整体编程题的思路正确,对这种小节实在没有思路要学会灵活跳过,然后在代码旁边加上一定的注释,保证最小程度的失分,还有就是要提高代码的整齐度,字要适当大小,不要像上次一样字太大导致到处找空位造成卷面分丢失,先简单地打一份草稿而不是全部写好抄写过去的浪费时间的做法!!!
1.在计算机中的数值数据表示的是(二,八,十,十六)进制数
拓展:在计算机中数据是以(二进制)形式存储
2.下列关于字节和数的运算的叙述中,正确的一项是(C)
A 字节通常用英文单词“bit”来表示,有时也可以写做“b”(x)解析:Byte代表字节,可以写成B 注意(加红):大写B表示Byte,小写b表示bit
B 目前广泛使用的Pentium 机其字长为16 个字节(x) 解析:Pentum机字长通常为 32位
C 计算机中不是所有数的运算均为补码计算
D 计算机的字长并不一定是Byte的整数倍(x) 解析:一定是整数倍,因为Byte是计算机中最小存储单位
3.x=y==5(正确)
理解:==是个逻辑运算符,用来判断其左右两边是否相等,若相等返回1,不等返0
所以当y=5时,x=1
y!=5,x=0
4.第九题选择中的反思:注意:非与或的先后顺序
5.static变量是指静态的变量,不管是在全局还是局部声明的static变量都存放于程序的全局变量区域,所以它的生命周期是从程序开始到程序结束。但是static变量的作用域并不等同于它的生存周期,它的作用域决定于它被定义的位置。可以认为static变量的作用域<=生存周期。
中兴通讯2012校招笔试题的一道问答题:
extern是计算机语言中的一个关键字,可置于变量或者函数前,以表示变量或者函数的定义在别的文件中。提示编译器遇到此变量或函数时,在其它模块中寻找其定义,另外,extern也可用来进行链接指定。
extern用于变量的用法:
extern int a;//声明一个全局变量a
int a; //定义一个全局变量a
extern int a =0 ;//定义一个全局变量a 并给初值。一旦给予赋值,一定是定义,定义才会分配存储空间。
int a =0;//定义一个全局变量a,并给初值,
声明之后你不能直接使用这个变量,需要定义之后才能使用。
第四个等于第三个,都是定义一个可以被外部使用的全局变量,并给初值。
糊涂了吧,他们看上去可真像。但是定义只能出现在一处。也就是说,不管是int a;还是int a=0;都只能出现一次,而那个extern int a可以出现很多次。
当你要引用一个全局变量的时候,你就要声明extern int a;这时候extern不能省略,因为省略了,就变成int a;这是一个定义,不是声明。>
register
当声明对象有自动生存周期时,可以使用register修饰符。因此,register也只能用在函数内的声明中。
此关键字告诉编译器:此对象的存取应该尽量快,最好存储在CPU的寄存器中。然而,编译器不见得会这么做。
另外要注意的是,当一个对象声明为register,就不可使用地址运算符&了,因为它有可能被放到寄存器中。>
auto
这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto>
总结
C语言中提供了存储说明符auto,register,extern,static说明的四种存储类别。四种存储类别说明符有两种存储期:自动存储期和静态存储期。其中auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块是被建立,它在该程序块活动时存在,退出该程序块时撤销。
在函数内部定义的变量成为局部变量。在某些C语言教材中,局部变量称为自动变量,这就与使用可选关键字a u t o定义局部变量这一作法保持一致。局部变量仅由其被定义的模块内部的语句所访问。换言之,局部变量在自己的代码模块之外是不可知的。切记:模块以左花
括号开始,以右花括号结束。
对于局部变量,要了解的最重要的东西是:它们仅存在于被定义的当前执行代码块中,即局部变量在进入模块时生成,在退出模块时消亡。
我的答案是:‘7465’
正确答案是:7465
对putchar(n%10+‘0‘) 的理解:
由于0-9是一个整数值来的,想在屏幕上输出的话要转换为ascii码。
‘0‘为‘0‘的ascii码,加上0-9就是为‘0‘-‘9‘的ascii码。
这个句子的结果是把n%10的结果用ascii码输出在屏幕上
‘a‘<=ch&&ch<=‘z‘||‘A‘<=ch&&ch<=‘z‘ ->(‘a‘<=ch&&ch<=‘z‘)||(‘A‘<=ch&&ch<=‘z‘)
while(r==0)->while(r!=0)
分析:没找出来的原因还是因为对该题程序的逻辑不够清晰,要先代具体数据进去先理清楚思路
技巧:先编译错误+逻辑错误
编程题主要是在第一题考虑如何产生随机数上花费了过多的时间导致了后面的程序没来的及更好完成
产生随机数的方法:
include
注意:取余的特点: x%m<[0,m] (jiahong)
1.从下学期开始,对上课老师所讲的概念和易错点要及时地用笔记写下来,因为我的记忆力比想象中要差一些,于是慢慢从理解变成一知半解的情况,我要杜绝度对概念模棱两可的情况
2.提高对c语言学习的效率,还有侧重点也要有一小些改变,比如我在上学期花费了大部分的c语言学习时间都是在打pta的题目,而对一些概念只是课前预习来完成课堂派的预习作业,而上课后并没有进行概念的复习,直奔打代码,而且会在一提代码上纠结一整天的时间,其实代码可以纠结一会儿时间印象会更深刻,但是如果花费太多在一题自己根本就看不出来的错误就得不偿失了,应该在实在不会的情况下及时向他人询问,然后及时总结,这种方法效率会更高而且印象也不会不深刻。
3.整理错题!整理错题!整理错题! 因为考试的题目其实大部分我们平时有涉及到,但是往往考试中出错的是我们平时做题出错的,所以对于本来我就做错的题来说它就是我的易错点,至少要反复看上几次才会有印象才会避免继续掉进那个大坑
标签:逻辑 慢慢 实验 ++ 异常 读取 用两个 进入 源文件
原文地址:http://www.cnblogs.com/lyq622/p/7957586.html