C高级第二次作业(1)
第一题:
思路:
建立for循环,利用if语句对数组中的每个组成进行判断,若是数字则用下一位代替,若不是则过。知道全部替换完成程序结束
程序:
void delnum(char *s)
{
int i=0,k=0;
for(;s[i]!=' ';)
{
if(s[i]>='0'&&s[i]<='9')
{
for(k=i;s[k]!=0;k++)
s[k]=s[k+1];
}
else
i++;
}
}
错误:
无
第二题:
思路:
为了对比两个数组中的字母,需要两个循环变量一个为i一个为k,先使用循环找到第一个相同的字母,然后在利用判断语句使第二个变量k进入程序中,通过i与k的累加使数组可以连续对比,当对比达到三次后将计数变量m加1,并将k重新归0,进行下一次对比。
程序:
int fun(char *str,char *substr)
{
int i=0,k=0,m=0;
for(;str[i]!=' ';i=i+1)
{
if(str[i]==substr[k])
k=k+1;
if(k==3)
{
m=m+1;
k=0;
}
}
return m;
}
错误:
无
流程图:
第三题:
思路:
字母的比较实际为ASCII码的比较,直接使用冒泡排序法就可以,因为不比较首位和末位,所一i直接从1开始,到n-2结束就行,相应的j也变为j<num-2
程序:
int fun(char *s,int num)
{
int i=0,j=0;
char m;
for(;j<num-2;j=j+1)
{
for(i=1;;i<num-2-ji=i+1)
{
if(s[i]<s[i+1])
{
m=s[i];
s[i]=s[i+1];
s[i+1]=m;
}
}
}
return 0;
}
错误:
无
流程图:
第四题:
思路:
利用动态内存分配将所求数输入,通过三个for循环将所求数求出。第一个for循环通过比较将最大max求出,第二个循环同理,第三个循环将和sum求出并用sum/n求出average,程序结束
程序:
#include<stdio.h>
#include<stdlib.h>
int main()
{
double average=0,max=0,min=101,sum=0;
int i=0,*s,n;
scanf("%d",&n);
if((s=(int *)malloc(n*sizeof(int)))==NULL)
exit(1);
for(i=0;i<n;i++)
{
scanf("%d",s+i);
}
for(i=0;i<n;i++)
{
if(*(s+i)>max)
max=*(s+i);
}
for(i=0;i<n;i++)
{
if(*(s+i)<min)
min=*(s+i);
}
for(i=0;i<n;i++)
{
sum=sum+*(s+i);
}
average=sum/n;
free(s);
printf("average = %.2lf
max = %.2lf
min = %.2lf",average,max,min);
}
错误:
无
C高级第二次作业(2)
第一题:
思路:
利用结构体将姓名、基本工资、基本工资和支出输入结构中,将基本工资+基本工资-支出求出收入,利用输出将姓名和收入输出
程序:
#include<stdio.h>
struct people
{
char name[10];
float jiben,fudong,zhichu;
float m;
};
int main()
{
int i=0,n;
scanf("%d",&n);
struct people s[n];
for(i=0;i<n;i++)
{
scanf("%s %f %f %f",&s[i].name,&s[i].jiben,&s[i].fudong,&s[i].zhichu);
s[i].m=(s[i].jiben+s[i].fudong-s[i].zhichu);
}
for(i=0;i<n;i++)
{
printf("%s %.2f
",s[i].name,s[i].m);
}
}
流程图:
错误:
无
第二题:
思路:
利用结构组输入每个学生的学号,姓名,成绩,利用for循环将每一位学生的平均成绩求出,利用循环和比较找出在平均之下的学生,最后输出平均成绩和这几个学生的姓名与学号
程序:
#include<stdio.h>
struct student
{
char num[6],name[10];
int s;
};
int main()
{
int i=0,n;
double avg=0;
scanf("%d",&n);
struct student s[n];
for(i=0;i<n;i++)
{
scanf("%s %s %d",&s[i].num,&s[i].name,&s[i].s);
avg+=s[i].s;
}
avg/=n;
printf("%.2lf
",avg);
for(i=0;i<n;i++)
{
if(s[i].s<avg)
printf("%s %s
",s[i].name,s[i].num);
}
}
错误:
无
C高级第二次作业(3)
第一题:
思路:
利用调用函数将数据带入子函数中,通过elseif语句四次比较将分数分为abcd四个等级并用等级代替成绩,若等级为d则记录一次n,最后输出n并利用for语句将学号姓名等级输出
程序:
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;
}
流程图:
错误:
无
第二题:
思路:
通过指着将数据带入调用函数中,利用for循环将每位学生的成绩之和求出,通过冒泡排序法将成绩的顺序排出,返回主函数将重新排列的结构组输出
程序:
void calc(struct student *p,int n)
{
int i=0;
for(i=0;i<n;i++)
{
(p+i)->sum=(p+i)->score[0]+(p+i)->score[1]+(p+i)->score[2];
}
}
void sort(struct student *p,int n)
{
int i=0,min=0;
struct student k;
for(i=0;i<n;i++)
{
if((p+i)->sum<(p+min)->sum)
{
min=i;
}
}
k=*(p+min);
*(p+min)=*(p+n-1);
*(p+n-1)=k;
if(n>1)
{
n--;
sort(p,n);
}
}
错误:
无
总结:经过这两个星期的学习,我初步认识了结构组和结构指针,对结构组的使用比较熟练,结构指针还需要多多练习
git上传:
https://coding.net/u/jike1liuyu/p/ppp/git/blob/master/%E7%AC%AC%E4%BA%8C%E6%AC%A1%E4%BD%9C%E4%B8%9A/%E7%A8%8B%E5%BA%8F.txt?public=true
点评:
刘富垚:http://www.cnblogs.com/lhyyy/p/8711554.html
史泽文:http://www.cnblogs.com/shilcz/p/8696341.html
王廷宇:http://www.cnblogs.com/archeralter/p/8746738.html