C语言博客作业--字符数组

一、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[N]='\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) 这种形式,可以输出大写的十六进制。

3.2 错题如何订正,为什么错了?

粗心导致浪费时间,考试应认真检查代码,整理好自己的思路,而不是自己看自己的代码都不懂的样子

posted @ 2017-12-10 16:00  你们走啊  阅读(386)  评论(9编辑  收藏  举报