C语言博客作业--字符数组
2017-12-10 16:00
267 查看
一、PTA
题目1:人以类聚
1. 本题PTA提交列表
2.设计思路
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
一开始写的代码是这样的没有按学号从小到大输出小明喜欢同学的学号导致错误。
题目2:Left-pad
1.本题PTA提交列表
2.设计思路
int N,k=0,j=0,i 定义长度为100000的字符型数组a,c,以及一个字符型变量ch 输入N,ch while(输入a[k]如果不为'\n' k++; a[k]='\0' if N>=k 即要补足之后的长度大于原数组长度 for i=0 to N if(i<N-k) c[i]=ch即c数组前面补为ch else c[i]=a[j] j++ 即c数组后面为a数组 c ='\0' else for i=k-N to a[i]!='\0' //只留下从结尾往开头数要求长度的数组元素 c[j]=a[i] j++ c[j]='\0' for i=0 to c[i]!='\0' 输出c[i]
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
数组定义时的大小不够,加了两次,才过题目3:字符串转换成十进制整数
1.本题PTA提交列表
2.设计思路
定义两个长度为100字符数组 a,b int i,j0,flag=0,flag标志是否存在有效-号 long number=0 while(输入a[i]a不等于'#') i++ for i=0 to a[i]!='\0' if(a[i]=='-'&&j==0)即存在有效-号 flag=1 if(a[i]为'0'到a'9'或者'a'到'f'或者'A'到'F') b[j]=a[i] j++ b[i]='\0' for j=0 to b[j]!='\0' if(b[j]为'0'到'9') number=number*16+b[j]-'0' if(b[j]为'a'到'f') number=number*16+b[j]-'a'+10 if(b[j]为'A'到'F') number=number*16+bj]-'A'+10 if(flag==1&&number!=0)即有有效-号并且不为0 输出-number else 输出number
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
在-号的无效有效上判断错误,没有判断出时是在第一个十六进制字符前的-号才是有效的,同时代码flag初始化错误初始化为1,导致一直错误。后来认真读了代码才发现二、截图本周题目集的PTA最后排名
三、同学代码结对互评
1.互评同学名称
严伟杰2.我的代码、互评同学代码截图
3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题
思路不同:我没有判断前十七位是否为数字,因为前十七位如果不为数字,那么最后的加权求和取余肯定与校验码不同。而严伟杰同学有判断前十七位是否为数字,我的代码算是耍了小聪明,但是比较简短,他的代码更加严谨。
变量定义不同:
我定义了a数组存放身份证为一维数组,每次输入都重新对它赋值。而严伟杰同学定义了一个二维数组,每次存放一行,在我看来是不必要的,这样导致数组占用内存空间大,效率低。
所以总体来说我更喜欢我的代码。
四、本周学习总结
1.你学会了什么?
1.1指针变量如何定义
如果指向整形变量则定义int *p
如果指向字符型变量则定义
char *p
如果指向double形变量则定义
double *p
即指向什么类型的变量,就定义什么类型的指针
1.2 指针加法运算运用在哪种情况,2个指针变量能否相加?
运用在数组中,表示数组下标又一一位。两个指针变量不能相加1.3 指针不赋初值,直接使用,会出现什么情况,请用DEVC验证,并截图展示?
程序运行错误,会崩溃
1.4 课堂派上关于分离浮点数的整数部分和小数部分那题,请用DEVC验证实现,并在此贴图展示,同时说明哪句是指针变量做函数形参,函数实参应该怎么表示。指针变量做函数形参有什么用处?
指针变量做函数形参的好处:在函数中可以改变主函数中指向的值,则可以间接实现传回多个数
1.5 请把课本的冒泡排序的函数改成指针变量做形参格式,并把代码写在底下,注意用markdown语法渲染。
#include<stdio.h> void bubble(int *a,int n); int main(void){ int n,a[8]; int i; printf("Enter n(n<=8):"); scanf("%d",&n); printf("Enter a[%d)]:",n); for(i=0;i<n;i++) scanf("%d",&a[i]); bubble(a,n); for(i=0;i<n;i++) printf("%3d",a[i]); return 0; } void bubble(int *a,int n){ int i,j,t; for(i=1;i<n;i++){ for(j=0;j<n-i;j++){ if(a[j]>a[j+1]){ t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } }
1.6 如何定义一个指针变量指向数组,如何用指针变量表示数组元素?
这样定义:int *p,a[10]; p=a;
*(p+i)即可表示
a[i]
1.7 如何定义字符指针指向字符串?指针指向字符串后,初始位置在哪里?
char *p; p="china";
初始位置为首字母的地址,这道题即为c的地址
1.8 利用字符指针操作字符串,如设计函数实现字符串连接,请在此贴图展示代码。说明指针表示字符的方法好处是什么?
#include<stdio.h> char Fun(char *a,char *b); int main(){ char a[]="china ",b[]="is the best"; Fun(a,b); puts(a); return 0; } char Fun(char *a,char *b){ int i=0,j,k=0; while(a[i]!='\0') i++; for(j=i;b[k]!='\0';j++){ a[j]=b[k]; k++; } a[j]='\0'; }
好处:可以返回多个值
2.本周你不会内容有什么?
2.1 课堂派错题罗列及如何订正
这题答案为D,由于数组名为指针常量,不能实现自增
2.2 其他不会的?打算怎么解决
对于指针指向数组时的情况,掌握的不够熟练,这周还做了一些别的题,发现寻找规律有时候是很重要的,如何优化代码,提高代码效率也很重要。解决方法:多做题,累积经验和解某些题目的方法。3.数组上机考试小结
3.1 哪题错了,请罗列?
上机考试虽然得了满分,但是在IP地址转换那题,错把数组定义成整形,导致之后错误,浪费了一会儿时间。然后输出十六进制数,可以直接用printf("%X",number)这种形式,可以输出大写的十六进制。