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;
}