zoukankan      html  css  js  c++  java
  • C语言博客作业--字符数组

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

    一、PTA实验作业

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

    1. 本题PTA提交列表

    2. 设计思路

    定义i,k为循环变量,k=0,字符数组hexad存取出的十六进制字符,str存原始字符,长整型数num为转化后的数,flag为-存在的情况,flag=1
    在str输入字符串,遇#停止
    for i to str[i]==‘’
        if str[i]=='-' flag=-1,表示开头有负号
        if str[i]是十六进制的字符,转移到hexad数组
    end
    hexad数组后放置停止符
    for i to hexad[i]==‘’
        将每一种字符转换成数字进行累加 
    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】==‘’
        mark1=mark2=i保存i的值,删除时从mark开始不用改变i
        for j to str2【j】==‘’
            如果母串的字符与子串首字符相同,比较下一个字符
            如果有一个字符不同,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!='';i++);
    	for(j=str2;*j!='';j++){
    		*(i++)=*j;
    	}
    	*i='';
    }
    

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

    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;
    }
    
  • 相关阅读:
    code#5 P2 棋子
    code#5 P1 报告
    ztz11的noip模拟赛T3:评分系统
    20181101noip模拟赛T1
    20181031noip模拟赛T2
    20181031noip模拟赛T1
    Linux进程的五个段
    进程和线程有什么区别
    shell中if条件字符串、数字比对,[[ ]]和[ ]区别
    Python实现单例模式
  • 原文地址:https://www.cnblogs.com/doimpossible/p/8012058.html
Copyright © 2011-2022 走看看