第二次作业
一、题目6-7 删除字符串中数字字符##
1.实验代码###
`void delnum(char *s)
{
int i;
char *p = s;
for(i=0;*(s+i) != '\0';i++)
{
if ( *(s+i) >'9' || *(s+i) < '0' )
*p++=*(s + i) ;
}
*p='\0';
}`
2.设计思路###
第一步:主函数,定义一个数组,写入数组,引用函数,输出。
第二步:定义一个指针p并将s赋给p,用一个for循环遍历字符串,并在其中用一个if语句判断是否是数字,如果是 p++=*s ,循环过后将最后一个赋上‘\0’。
3.流程图###
4.问题###
本题未遇到问题
二、题目6-8 统计子串在母串出现的次数##
1.实验代码###
`int fun(char *str,char *substr)
{
int n=0,i;
for(i = 0;*(str + i) != '\0';i++){
if(*(str + i) == 'a'&&*(str+i+1) == 's' && *(str + i + 2) == 'd'){
n++;
}
}
return n;
}`
2.设计思路###
第一步:调用定义的函数。
第二步:定义i、j、n,使用双重循环结构,外层循环用来遍历数组元素,内层循环判断字符数组元素是否相等,完全相等时,可遍历子串,则次数加一。
第三步:返回主函数。
3.问题###
无
三、题目6-9 字符串中除首尾字符外的其余字符按降序排列##
1.实验代码###
`int fun(char *s,int num)
{
int i,j;
char t;
for(j=0;j<num-3;j++)
for(i=1;i<num-j-2;i++)
if(*(s+ i)<*(s+i+1))
{t=*(s+ i); *(s+ i)=*(s+i+1); *(s+i+1)=t;}
}`
2.设计思路###
第一步:主函数,定义字符数组s,写入字符串,引用函数,输出排序后所得的字符串。
第二步:函数,用一个for循环表示循环的趟数,由于只需要排出排除首尾的顺序所以只需要循环num-3次,在此循环下再用一次循环进行排序,并且只需要排出从第二个到num-j-2个数的顺序。
3.问题###
在for语句中循环次数出现错误,后来发现是运用冒泡排序法的时候for循环次数过多导致的。最后是通过修改for循环次数改正错误的。
四、题目7-1 输出学生成绩##
1.实验代码###
`#include<stdio.h>
int main()
{
int *p,i,sum = 0,max,min,n;
double avg;
scanf("%d",&n);
if((p=(int*)calloc(n,sizeof(int)))==NULL){
exit(1);
}
for(i=0;i<n;i++){
scanf("%d",&*(p+i));
sum = sum + *(p+i);}
avg = (double)sum /(double) n;
max = *p;
min = *p;
for(i=1;i<n;i++){
if(*(p + i) > max){
max = *(p+i);
}
if(*(p + i) < min){
min = *(p+i);
}
}
printf("average = %.2lf\nmax = %.2lf\nmin = %.2lf",avg,(double)max,(double)min);
}`
2.设计思路###
第一步:输入数字个数n,动态存储分配。
第二步:用for语句进行输入数据,并计算和,for语句结束后计算出平均值。
第三步:令最大,最小值等于第0个数,遍历所有数据,并在其中用两个if语句判断出最大值和最小值并记录,输出最大最小值和平均数。
3.问题###
第一次提交未使用动态内存分配,不过提交通过了,之后经提醒添加使用了动态内存分配语句。
五、题目7-1 计算职工工资##
1.实验代码###
#include<stdio.h> struct clerk { char name[10]; float wages, floating, pay, wage; }c1; int main() { int n, i; scanf("%d",&n); struct clerk c[n]; for(i = 0; i < n; i++) { scanf("%s %f %f %f",c[i].name, &c[i].wages, &c[i].floating, &c[i].pay); c[i].wage = c[i].wages + c[i].floating - c[i].pay; printf("%s %.2f\n",c[i].name, c[i].wage); } }
2.设计思路###
第一步:定义结构体变量,成员包括——姓名、基本工资、浮动工资、支出和实发工资。
第二步:输入人数n,引用结构体变量,使用循环结构,输入姓名、基本工资、浮动工资、支出,计算实发工资,并输出姓名和实发工资。
3.流程图###
4.问题###
无
六、题目7-2 计算平均成绩##
1.实验代码###
`#include <stdio.h>
struct student{
char num[10],name[10];
double score;
};
int main ()
{
double avg,sum = 0;
int i, n;
scanf("%d", &n);
struct student s[n] ;
for(i = 0;i < n;i ++)
{
scanf("%s %s %lf",&s[i].num,s[i].name,&s[i].score);
sum = sum + s[i].score;
}
avg = sum / n;
printf("%.2lf\n",avg);
for(i = 0; i < n; i++)
{
if(s[i].score < avg)
printf ("%s %s\n", s[i].name,s[i].num);
}
}`
2.设计思路###
第一步:定义一个结构体,并在其中定义学号num,姓名name,分数score,主函数中先输入整数n,引用结构体,用一个for循环输入学号,姓名,分数并计算出分数的和。
第二步:计算出平均数,用一个for循环遍历数据,并用if语句判断当前分数是否低于平均数,如果是输出相应的姓名和学号。
3.问题###
无
七、题目6-1 按等级统计学生成绩##
1.实验代码###
` int set_grade( struct student *p, int n ){
int count = 0, i;
for(i = 0;i<n;i++,p++){
if(p->score<60){
p->grade = 'D';
count++;
}
else if((p->score<70)&&(p->score>=60)){
p->grade = 'C';
}
else if((p->score<85)&&(p->score>=70)){
p->grade = 'B';
}
else{
p->grade = 'A';
}
}
return count;
}`
2.设计思路###
第一步:先定义函数,引入变量,在for循环中通过if语句进行多层判断,将学生成绩分出等级。
第二步:使小于60分的单独计算出其数目,最后返回其值(count)即可。
3.问题###
无
八、题目6-2 结构体数组按总分排序##
1.实验代码###
`void calc(struct student *p,int n)
{
int i;
for(i = 0;i < n;i ++,p++){
p->sum = p->score[0] + p->score[1] + p->score[2];
}
}
void sort(struct student *p,int n)
{
int j,i;
struct student t;
for(j=1;j<=n-1;j++)
for(i=0;i<=n-j-1;i++){
if((p + i)->sum < (p + i + 1)->sum){
t = *(p + i);
*(p + i)= *(p+ i + 1);
*(p+ i + 1)= t;
}
}
}`
2.设计思路###
第一步:定义一个结构体,并在其中定义学号num,姓名name,分数score,分数和sum,主函数中:先引用结构体,用一个for语句进行数据输入,引用函数calc求出每名学生的总分,函数sort按每名学生的总分从高到低对这组数据进行排序,用一个for语句进行输出。
第二步:函数calc:仅需一个for语句进行遍历,并在遍历过程中算出sum值,函数sort:定义一个结构体t为之后交换做准备,之后用冒泡排序法进行排序即可。
3.流程图###
函数calc
函数sort
4.问题###
最初在第二个函数中将t定义为int型,发现编译的时候出现问题,最后改为引用结构体定义t。
九、学习总结和进度##
1.总结###
首先是对指针进行了深入的复习,并对pta中出现的问题进行讲评。之后,这两周主要学习了结构。首先学习的就是对结构体的概念和定义,并且在所需结构调用时需要在函数中调用一下结构体再去使用。再之后学习到结构数组,其中引用格式为结构数组名[下标].结构成员名。最后,学到了结构指针引用格式可以为p->结构成员名。总体来讲,这段时间学的还是比较充分的。
2.图表###
3.同学互评###
刘富垚;
[董欣](http://www.cnblogs.com/dx2017/);
[丰大为](http://www.cnblogs.com/DavidPark/);