C语言博客作业--数据类型
一、PTA实验作业
题目1(7-8)
(1).本题PTA提交列表
(2)设计思路
char tozero(char ch)函数(功能为使ch最后值为'\n'){
- for( ;ch不等于'\n'时;)
将输入的值记入ch; - 返回ch;
}
主函数
- 定义字符变量ch、大循环次数repeat、标志变量flag;
- 输入repeat
while( repeat大于0时 ){
flag每次初始化为0;
输入ch;
if( ch满足是字母或下划线 ){
for(;ch不等于'\n'时;){
if( ch满足是字母或下划线或数字 )flag=1;
else flag为0;
if( flag等于0){
输出NO,并调用tozero函数,去到循环末尾的repeat自减;
}
再输入ch;
}
else 调用tozero函数;
if( flag等于0)输出NO;
else 输出YES;
}
(3)代码截图
(4)本题调试过程碰到问题及PTA提交列表情况说明
- 可以看到此处ch的值首先为'\n',所以才会输出NO,并且,在随后的调试中,发现1num的四个字符都被判断了一遍,所以才会输出超限。
- 于是在输入repeat后又加一句getchar()使ch值不为'\n',再写一个可以将ch的值循环到为'\n'为止的自定义函数,再加入标志变量flag保证当这一串字符中有一个不满足条件就直接输出NO,并调用函数使ch为'\n',且要直接跳到循环末尾的自减。
题目2(7-9)
(1).本题PTA提交列表
(2)设计思路
-
定义两个字符变量front 、ch ,标志变量flag初始化为1;
-
输入ch;
-
while( ch不等于'\n'时 ){
-
if( ch等于+或-且flag等于1) {
则输出ch, flag为0,记入下一个ch,进入下一个循环;
}
-
else if( ch等于-){
if( front等于( )输出ch;
else if( front为数字)换行输出ch再换行;
else 输出ch再换行;
}
-
else if( ch是数字或“.” )输出ch;
-
else {
if( front为数字)换行输出ch再换行;
else 输出ch再换行;
}
使flag为0;
将ch值赋给front;
}
(3)代码截图
(4)本题调试过程碰到问题及PTA提交列表情况说明
- 格式错误,原因在于我第一次写的代码只将数字整个输出,只考虑了负数在括号里的情况,而没有考虑到若有小数、正负号在前的第一个数的情况,
- 运行超时的原因在于若输入了正号在前的数之后,程序会运行到这个位置,然后本应该由ch接收的值被next抢了,导致可以接着输入一串新字符。
- 尝试在程序中加入对于next的判断,结果发现部分符号重复输出
- 发现是因为这一段判断的原因导致next输出两遍。
- 然后就修改了程序,把next用front代替,记入前一位字符,用来比较,这样只需在循环末尾将ch的值放入front里,而不在需要像next记入下一个字符一样麻烦。
题目3 (7-10)
(1).本题PTA提交列表
(2)设计思路
- 定义字符型变量ch 、整型变量:下一串数字next、计算并存放数值的total、标志变量flag初始化为1
- 输入开头的数值(total);输入字符(ch)
- while( 当ch不等于=时){
while( ch是数字){
total就加上ch-‘0’之后的数;
记入下一个字符ch;
}
if ( ch 等于=)跳出循环;
if ( ch为四则运算符号 ){
switch (ch){
ch 为“+”:{
用%d的scanf记入next;
total加上next;
记入下一个ch;
跳出判断;
}
ch为“-”:{
用%d的scanf记入next;
total减去next;
记入下一个ch;
跳出判断;
}
ch为“ * ”:{
用%d的 scanf 记入next;
total等于 total 乘next;
记入下一个ch;
跳出判断;
}
ch为“ / ”:{
用%d的scanf记入next;
if (next等于0){ 标志变量flag改为0;去到大循环外;
total等于 total 除next;
记入下一个ch;
跳出判断;
}
}
}
else if (ch不为= ){
输出"ERROR";
跳出循环;
}
}
if (ch正常等于=)
输出total的值;
if( flag不为1 )
输出"ERROR";
(3)代码截图
(4)本题调试过程碰到问题及PTA提交列表情况说明
- 发现当输入非法字符,已经输出了ERROR,但是后面的total还是输出了,是一个需要特定条件来控制的输出。
- 只输入5=的情况,运行输出了ERROR和5。
- 提交列表上的部分正确都是因为这两个错误。
- 改正方法就是当循环正常结束时才输出total;修改当非法字符出现时的做法。
二、截图本周题目集的PTA最后排名。
PTA排名
四、本周学习总结
1.你学会了什么?
1.1 一维数组如何定义、初始化?
- 定义一维数组要存放的数的变量类型,[]中放数组中数的个数;
- 初始化时要如a[]={}这样,大括号中的数用逗号隔开,大括号中的数从数组的0下标开始放,未存放数的为随机数
1.2 一维数组在内存中结构?可画图说明。数组名表示什么?
- 一组连续的地址
- 数组在内存中的首地址
1.3 为什么用数组?
- 在需要输入并使用大量数据时可用数组来代替过多的定义变量,同时使程序更加简洁和有可读性
1.4 介绍选择法、冒泡法、直接插入排序如何排序?伪代码展示.
选择法
- 除定义数组外还定义记号变量k,定义两个循环变量i,j,一个中转变量t
for ( i初始化为0;当i小于n-1时;i每循环一次加一 ){
k每次都等于i;
for( j等于i+1;当j小于n时;j++)
若a[k]大于a[j],则使k=j;
若i!=k,则交换a[i]与a[k]的值;
}
冒泡法
- 比起选择法少了记号变量k
for( i初始化为0;i小于n-1时;i循环加一)
for( j初始化为i+1;j小于n时;j循环加一)
若a[i]大于a[j],则交换a[i]与a[j]的值
直接插入排序
for i=1 to n
temp=a[i];
if a[i]小于a[i-1]{
for j=i-1 to j>=0且a[j]>temp
将a[j]赋给a[j+1];
1.5 介绍什么是二分查找法?它和顺序查找法区别?
- 找到两端的数,取它们的中间数,判断是否等于要查找的数,若小于要查找的数,则将这个中间数作为新的左端,再取中间数,再做判断
- 顺序查找法可能需要将整个数组轮一遍才能找到,对于较庞大的数组可能耗时更久;而二分查找法对于较庞大的数组则只需要判断几遍就能找到。
- 区别在于两者的查找方法和查找速度
1.6 二维数组如何定义、初始化?
- 定义类型和一维数组相同,但是它需要有两个量作为行数和列数,如a[][],其中第一个是行数,第二个是列数,行数可以省略(如果后面的大括号中有初始化数组),但列数不可省略。
- 初始化比一维数组不同的地方在于它可以在大括号中再用大括号。
1.7 矩阵转置怎么实现?方阵中:下三角、上三角、对称矩阵的行标i列标j的关系?请说明。
- 中转变量t,i=j=0;t=a[i+1][j];a[i+1][j]=a[j+1][i];a[j+1][i]=t
- 下三角:i大于等于j;上三角:i小于等于j;对称矩阵:a[i][j]==a[j][i]
1.8 二维数组一般应用在哪里?
- 对需要同时记入多个变量的位置的情况有特殊优势
2.本周的内容,你还不会什么?
详细罗列不明白地方,甚至课堂派作业不会做的地方请都详细列出。
- 二维数组的使用方法
- 不是能很好的能在不给题目的情况下理解程序的用意
- 不是很懂伪代码要怎么写