这个作业属于哪个课程 | C语言程序设计II |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2824 |
我在该课程的目标是 | 学会灵活使用sort排序算法,与strlen命令的使用 |
这个作业在那个具体方面帮助我实现目标 | 关注相关的算法博客以及查阅以上相关应用的资料 |
参考文献 | https://blog.csdn.net/step_ma/article/details/74115184 |
作业一:英文单词的排序:
一:试题:7-1 英文单词排序 (25 分)
本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。
输入格式:
输入为若干英文单词,每行一个,以#作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。
输出格式:
输出为排序后的结果,每个单词后面都额外输出一个空格。
输入样例:
blue
red
yellow
green
purple
输出样例:
red blue green yellow purple
二:分析:1.实际上该题的思路很简单,即输入数组单词,但是难点就是在如何将单词的长度与其所属的单词对应。很多人将字符输入后不能单词的长度与其所属的单词对应起来
2.由于英文单词总数不超过20个,英文单词为长度小于10,所以我们需要用到二维数组,以下的思路将会在执行代码中标注出来!
三.执行代码:
#include<bits/stdc++.h>
using namespace std;
int main ()
{
int i;
char a[20][10],js[10];//20代表单词数量不超过20,10代表长度不超过10
for(i= 0 ; i < 20 ; i++)
{
scanf("%s",a[i]);
if(a[i][0]=='#')//代表字符若为#号 ,则结束循环结束
break;
}
for(int len = 1; len < i ; len++) //重点在
for(int lens = 0 ; lens < i - len ; lens++ ) //此处
{
if(strlen(a[lens])>strlen(a[lens+1])){ //本处直接使用strlen命令,利用c语言自带的库函数进行对字符串的处理,直接把求出的字符串长度与其所属英文单词对应!
strcpy(js,a[lens]);
strcpy(a[lens],a[lens+1]);//strcpy在冒泡排序中起到至关重要的作用,即 交换
strcpy(a[lens+1],js);
}
}
for(int s = 0 ; s < i ; s++)
printf("%s ",a[s]);//将排序后的单词输出!
return 0;
四.运行结果正确截图:
五.运行流程图:
六.本题总结:由于这次是在c++上自行调试运行,所以本题在PTA提交时直接一次性AC,其实本次作业使用的方法包含了很多技巧性的东西,包括有一部分老师没有讲解过的知识,所以用了许多小技巧,省去了许多麻烦步骤。本来这次想使用c自带sort命令进行排序,但是据相关文档,得知sort属于不稳定排序,无法将单词的长度与其所属的单词对应起来,所以在PTA上直接编译报错!关于sort命令排序的使用,我还需要多练习相关的习题,并熟练掌握和运用!strlen命令亦是如此!
任务二:1)通过以自己名字命名的文件输入英文单词,(2)英文单词输入的结束标记为你学号最后一位数+37所对应的ASCII字符。(例如:你的学号最后一位为9,则结束标记为9+37=46所对应的ASCII字符“.”)(3)在不删除原有内容的情况下,将排序后的单词输出到文件。
分析:只需要在自己源代码的基础上进行一定的修改即可!由于我的学号最后一位为8,所以加上37为45,对应的ASC||的元素为K!输入K结束即可
二:执行代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
FILE*pointer;
int i,lens,s;
char a[20][10],js[10],len;//20代表单词数量不超过20,10代表长度不超过10
if((pointer=fopen("D:\wonzenkei.txt","r+"))==NULL)
{
printf("Error!
");
exit(0);
}
for(i= 0 ; i < 20 ; i++)
{
scanf("%s",a[i]);
fprintf(pointer,"%s
",a[i]);
if(a[i][0]=='K')//代表首个字符若为K号
break;
}
for(int len = 0; len < i ; len++)
for(int lens = 0 ; lens < i - len - 1 ; lens++ )
{
if(strlen(a[lens])>strlen(a[lens+1])){
strcpy(js,a[lens]);
strcpy(a[lens],a[lens+1]);
strcpy(a[lens+1],js);
}
}
for(int s = 0 ; s < i ; s++){
printf("%s ",a[s]);
fprintf(pointer,"%s ",a[s]);
}
if(fclose (pointer)){
printf("Can't close!
");
exit(0);
}
return 0;
}
三:正确相关截图:
四:总结:很久没有用到相关的文件指针,手还是有些生,不过我后期还是会努力学习指针相关方面的应用,加大对其学习力度
五.另外,本次对单词长度的冒泡排序我没有再多注释,因为自己是按照教材上说明的方法键入,就具体内容就直接参见教材吧
任务三:指针选择题:2-1
下列语句定义 x 为指向 int 类型变量 a 的指针,正确的是(B)。 (2分)
A.int a, *x = a;
B.int a, *x = &a;
C.int *x = &a, a;
D.int a, x = a;
2-2
int *p 的含义是 (2分)B
A.p是一个指针, 用来存放一个整型数
B.p是一个指针, 用来存放一个整型数据在内存中的地址
C.p是一个整型变量
D.以上都不对
2-3
如果有定义:int m, n = 5, *p = &m; 与m = n 等价的语句是 (B) 。 (1分)
A.m = p;
B.p = *&n;
C.m = &n;
D.m = **p;
2-4
变量的指针,其含义是指该变量的(B )。 (1分)
A.值
B.地址
C.名
D.一个标志
2-5
有如下程序段
int p,a=10,b=1;
p=&a; a=p + b;
C.执行该程序段后,a的值是 (2分)B
A.12
B.11
C.10
D.编译出错
2-6
对于下列程序,正确的是(A) 。 (2分)
void f(int *p)
{
*p = 5;
}
int main(void)
{
int a, *p;
a = 10;
p = &a;
f(p);
printf(“%d”, (*p)++);
return 0;
}
A.5
B.6
C.10
D.11
2-7执行如下程序段,打印输出的内容是: (2分) (C)
include <stdio.h>
void fun (int c, int d) {
c++;
(d)++;
}
int main ( ){
int a=5, b=9;
fun(a, &b);
printf("%d, %d", a, b);
return 0;
}
A.5, 9
B.6, 10
C.5, 10
D.6, 9
问题:1.如何使用指针对元素分配内存空间
2.如何应用指针进行相关代码,元素的运行与计算
最后:学习进度条
结对编程总结:本次结对编程我的队友是王雅琼,在这当中我们相互讨论,帮她解决了很多问题,并且将我所学到的相关技巧告诉了她,在帮其修改代码时,发现她错把“ ”打成了‘ ’号,,导致多次测试时出现了乱码的情况,并且多次查找都未找出错因,对我自己来说:还是因为对代码的阅读不仔细,阅读代码能力欠佳,在这一方面我还需要注重相关思维的培养,学会流畅阅读他人代码。对于我队友来说:可能还是输入代码不仔细,编程是一项很细心的活,在执行相关的任务时,容错率几乎为零,所以我们还是需要多一个心眼。至此,我想到了蓝桥杯许多未获奖的选手,他们的代码本身能通过编译,可惜的是他们未按照大赛要求将main函数进行0值得返回,这导致题目得分直接为零,所以差之毫厘,失之千里!还有不少的选手,连最简单的第一道填空题都未算对,痛失了本应得到的分,他们很多人借用电脑的计算器运算时,竟然将数字输错。而我在比赛时,为防止意外,我在计算器上算得的结果到最后还用手算验算了一遍。总之,盲目自信不可有,细心留意不可无,最后还是需要感谢博客,感谢老师,感谢一切的IT平台给了我一个这样的“吐槽”机会,让我能时刻意识到自己的问题所在并将其记录下来