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

一、PTA实验作业

题目1:字符串转换成十进制整数

1. 本题PTA提交列表

2. 设计思路

定义i,k为循环变量,k=0,字符数组hexad存取出的十六进制字符,str存原始字符,长整型数num为转化后的数,flag为-存在的情况,flag=1
在str输入字符串,遇#停止
for i to str[i]==‘\0’
    if str[i]=='-' flag=-1,表示开头有负号
    if str[i]是十六进制的字符,转移到hexad数组
end
hexad数组后放置停止符
for i to hexad[i]==‘\0’
    将每一种字符转换成数字进行累加 
end
输出num*flag

流程图:

3.代码截图

4.本题调试过程碰到问题及PTA提交列表情况说明。

部分正确
1.刚开始num用int去定义导致个别错误
2.没考虑到负号存在的情况导致个别测试点错误
3.没有在hexad转换结束后加上停止符,运行时错误![]

题目2:删除字符串中的子串

1. 本题PTA提交列表

2. 设计思路

定义数组str1存母串,str2存子串,变量mark1用来判断是不是完整的子串相同,mark2用来删除字符,i,j为循环变量flag判断是否为子串
for i=0 to str【i】==‘\0’
    mark1=mark2=i保存i的值,删除时从mark开始不用改变i
    for j to str2【j】==‘\0’
        如果母串的字符与子串首字符相同,比较下一个字符
        如果有一个字符不同,flag=0,表示不是子串,结束该循环
    end
    如果是子串,删除子串,i=-1返回最外轮循环i从0开始
end
输出str1!

3.代码截图

4.本题调试过程碰到问题及PTA提交列表情况说明。

删除子串后要让它重新开始遍历刚开始令i=0,但是重新开始时i总是从1开始


解决方法:i=-1,因为for循环结束循环体才会i++,若i=0,i+1就会是1,而不能从0开始。

题目3:字符串的冒泡排序

1. 本题PTA提交列表

2. 设计思路

定义i,j,m,z为循环变量,n和k为输入的数,定义转换字符数组t
输入n和k,n个字符串,k次交换
定义二维字符数组str【n】【11】
for i=0 to 11
    每行输入字符串
end
for i=0 to k-1//k轮冒号排序
    for i =1 to n-1
        for m=0 to 比较的两行字符串中有一行结束
            如果第一个字符相同,结束该轮循环,进行下一轮比较
            如果这个字符比上一行该位置的字符小
                交换这两行的全部字符串,并结束该循环
                结束该循环
            否则 同样结束循环
        end
    end
end
for i=0 to n-1
    输出每行的字符串
end

3.代码截图

4.本题调试过程碰到问题及PTA提交列表情况说明。

运行超时

没有加入在代码中加入break语句,在devc++上答案是正确的,但是提交到pta上就答案错误了
解决方法:在交换后加入break语句,让它直接结束循环,就对了,现在也不知道具体问题出在哪里,可能循环太多次了。

二、截图本周题目集的PTA最后排名

三、同学代码结对互评

1.互评同学名称

李金谣

2.我的代码、互评同学代码截图


3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。

  • 异同点
    总体的思路大致相同,都是先比较是否是子串,通过flag变量判断,再进行删除,删除后重新遍历母串,但是做法有很大不同。
    同学的代码先是算出了字符串的长度,再巧妙的运用了长度变量进行了字符子串的删除,还有一个地方做的很好的是,比较子串时借用了循环变量自增进行比较,即:if(s1[a+b]!=s2[b]) flag=0; 省去了a的自增,而且不会改变a的值对外循环造成影响。
    我的代码思路比较直接,一开始就对母串进行遍历,知道与子串首字母相同时才会进行比较,我没想到用循环变量自增比较,就只能再借用一个变量自增,删除字符时也同样借用了另一个变量才能实现。

  • 各自优势
    某些地方,同学的代码还是有些我没想到过的做法,感觉这些点用他的做法会更快,但是数字符串长度的做法,数据较大时效率可能没我的高,我的代码虽然做的不是那么巧妙,但是容易理解。

  • 喜好
    都喜欢,同学的代码有许多借鉴之处,我自己的风格也想保留

  • 同学的不足
    在判断子串时,可以在首字母相同时再判断后续字符,当找到不同时就可以跳出循环,提高效率。

四、本周学习总结

1.你学会了什么?

1.1指针变量如何定义(设计代码可以用markdown代码符号渲染)?

指向变量的类型 *变量名
例:
int *p;
char *p;

1.2 指针加法运算运用在哪种情况,2个指针变量能否相加?

指针指向数组时,递增表示指针下移,不能相加

1.3 指针不赋初值,直接使用,会出现什么情况,请用DEVC验证,并截图展示?

程序崩溃

1.4 课堂派上关于分离浮点数的整数部分和小数部分那题,请用DEVC验证实现,并在此贴图展示,同时说明哪句是指针变量做函数形参,函数实参应该怎么表示。指针变量做函数形参有什么用处?


指针变量做函数形参:

实参是取变量的地址
作用:可以直接对地址进行操作,传回多个参数,避免使用全局变量。

1.5 请把课本的冒泡排序的函数改成指针变量做形参格式,并把代码写在底下,注意用markdown语法渲染。

void bubble(int *a,int n)
{
	int *i,*j,t;
	for(i=1+a;i<a+n;i++){
		for(j=a;j<a+n-1;j++){
			if(*j>*(j+1)){
				t=*j;*j=*(j+1);*(j+1)=t;
			}
		}
	}
}

1.6 如何定义一个指针变量指向数组,如何用指针变量表示数组元素?

将数组名赋给指针变量名,例:int *p,a[5];p=a;
p+i==a[i]

1.7 如何定义字符指针指向字符串?指针指向字符串后,初始位置在哪里?

char *str=" 字符串"

char *str;str="字符串"

初始位置在首个字符

1.8 利用字符指针操作字符串,如设计函数实现字符串连接,请在此贴图展示代码。说明指针表示字符的方法好处是什么?

void strmcat( char *str1, char *str2 )
{
	char *i,*j;
	for(i=str1;*i!='\0';i++);
	for(j=str2;*j!='\0';j++){
		*(i++)=*j;
	}
	*i='\0';
}

灵活方便,可以灵活赋值避免使用数组时,由于数组名是常量而不能改变的情况

2.本周你不会内容有什么?

2.1 课堂派错题罗列及如何订正。

若有语句:int *point,a=4; 和 point=&a; 下面均代表地址的一组选项是(   ) 。

A、a,point,*&a

B、&*a,&a,*point

C、*&point,*point,&a

D、&a,&*point ,point
答案:d 错选:c

分析:关键是*&point与&*point分不清楚,&point指的就是地址,所以*&point是错的,而*point相当于变量,所以&*point是正确的

若有说明;int *p,m=5,n;以下正确的程序段的是________.
A、
p=&n;
scanf("%d",&p);

B、
p=&n;
scanf("%d",*p);

C、
scanf("%d",&n);
*p=n;

D、
p=&n;
*p=m;

答案:d 错选:c
分析:c选项*p还没有初始化,不能赋值

以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是________.

main()
{
int *p,*q,a,b;
p=&a;
printf(“input a:”);
scanf(“%d”,*p);
……
}

A、
*p表示的是指针变量p的地址

B、
*p表示的是变量a的值,而不是变量a的地址

C、
*p表示的是指针变量p的值

D、
*p只能用来说明p是一个指针变量

答案:b 错选:d
分析:*p已经初始化完毕,指向a,所以*p相当于a

2.2 其他不会的?打算怎么解决

多看看课本,课本上都是一些好好很经典的例题,对我们有很好的借鉴价值,还有就是平时课堂派老师不值得作业,里面的代码思路有些真的很好。平时做pta时实在不会要懂得请教别人的代码,实在不行就上网找代码,不需要全部正确的代码,有些代码可能涉及我们还没学过的内容,就要学会用已知的内容试着改一改,有时候还可能找到的只有思路,这是最好的,能根据思路写出代码,也是提高的好方法。

3.数组上机考试小结

3.1 那题错了,请罗列?

7-4 数组元素的删除
7-3 jmu-c-输出字符间的字符子串
7-4 数组元素的删除

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

  • 7-4 数组元素的删除
    当时最后的代码是这样的:
#include<stdio.h>
int main()
{	
    int i,j,count=0,sum=0;
    char num[32];
    for(i=0;i<32;i++){
    	scanf("%c",&num[i]);
	}
    i=0;
    for(j=1;j<=4;j++){
    	for(count=0;count<=8;count++,i++){
    		sum=sum*2+(num[i]-'0');
		}
		if(j<4)printf("%d.",sum);
		else printf("%d",sum);
		sum=0;
	}		
   	return 0;
}

刚开始,没仔细看题目,以为做过这道题了,就开始写了,结果因为时间长了,有些关键点忘记了,一开始就用int去定义数组,写好后发现,输出没内容,调试发现没法输入,重新改成字符类型,然后就是结果错误,当时考试很紧张,这道简单的题我有改了这么久,这下我慌了,我开始怀疑是不是计算sum是的式子写错了,一直改,一直错,心态崩了,想跳过,又很不甘心,改到最后就是上图,答案还是错的。这时就差count<=8,多了一个=,可是还是没改出来。。。

  • 7-3 jmu-c-输出字符间的字符子串
    ip地址耗了很长时间,后面的题自然没时间写了,这道题还有一个测试点没过,相同子串没过,即如果是aaaaaaaa,字符都为a,a,需要输出全部字符
#include<stdio.h>
int main()
{
	int i,num,begin=-1,end=-1,flag=0;
	char ch1,ch2;
	char code[10000];
	gets(code);
	ch1=getchar();
	getchar();
	ch2=getchar();
		for(i=0;code[i];i++){
		if(ch1==code[i]){
			begin=i;
			flag=1;
		}
		if(flag==1&&ch2==code[i]){
			end=i;
			for(i=begin;i<=end;i++){
			printf("%c",code[i]);
			}putchar(' ');
		}
	}
	if(begin==-1||end==-1)printf("no sub string!");
	return 0;
}

改正后:

#include<stdio.h>
int main()
{
	int i,num,begin=-1,end=-1,flag=0;
	char ch1,ch2;
	char code[10000];
	gets(code);
	ch1=getchar();
	getchar();
	ch2=getchar();
	for(i=0;code[i];i++){
		if(flag==0&&ch1==code[i]){
			begin=i;
			flag=1;
			continue;
		}
		if(flag==1&&ch2==code[i]){
			end=i;
		}
	}
	if(begin==-1||end==-1)printf("no sub string!");
	else 
		for(i=begin;i<=end;i++){
			printf("%c",code[i]);
		}
	return 0;
}
  • 7-4 数组元素的删除
    这题没时间做,回到宿舍一遍就过了
#include<stdio.h>
int main()
{
	int i,j,n,deln,del;
	scanf("%d",&n);
	int num[n];
	for(i=0;i<n;i++)scanf("%d",&num[i]);
	scanf("%d",&deln);
	for(i=0;i<deln;i++){
		scanf("%d",&del);
		for(j=del-1;j<n;j++){
			num[j]=num[j+1];
		}n--;
	}
	for(i=0;i<n;i++){
		if(i==0)printf("%d",num[i]);
		else printf(" %d",num[i]);
	}
	return 0;
}
posted on 2017-12-10 16:24  斯慕  阅读(454)  评论(7编辑  收藏  举报