大学第二次作业
- 删除字符串中数字字符:
设计思路:首先定义一个数组,然后写入数组,引用函数,输出。定义一个指针p并将s赋给p,用一个for循环遍历字符串,并在其中用一个if语句判断是否是数字,如果是 p++=*s ,循环过后将最后一个赋上‘\0’;
`
#include <stdio.h>
void delnum(char *s);
int main ()
{ char item[80];
gets(item);
delnum(item);
printf("%s\n",item);
return 0;
}
void delnum(char *s)
{
char *p = s;
for(;*s;s++)
{
if ( *s >'9' || *s < '0' )
*p++=*s ;
}
*p='\0';
}
2 统计子串在母串出现的次数 1.设计思路:通过题目给出的字符串,使用双重for循环遍历数组,从循环中先找出相同的字符串,再判断出现次数。 代码:
#include<stdio.h>
int fun(char *str,char *substr);
int main()
{ char str[81]="asdasasdfgasdaszx67asdmklo",substr[4]="asd";
int n;
n=fun(str,substr);
printf("n=%d\n",n);
return 0;
}
/* 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;
} */
int fun(char *str,char *substr)
{
int count = 0;
char *p=str,*ps= substr;
for(;*p != '\0';p++){
ps = substr;
if(*ps == *p){
while(*p == *ps){
if(*p == *ps){
p++;
ps++;
}else break;
}
}
if(*p == '\0'){
count ++;
}
}
return count;
}
3. 字符串中除首尾字符外的其余字符按降序排列 .设计思路: 先定义字符数组s,写入字符串,引用函数,输出排序后所得的字符串。用一个for循环表示循环的趟数,由于只需要排出排除首尾的顺序所以只需要循环num-3次,在此循环下再用一次循环进行排序,并且只需要排出从第二个到num-j-2个数的顺序。 实验代码:
include<stdio.h>
int fun(char *str,char *substr);
int main()
{ char str[81]="asdasasdfgasdaszx67asdmklo",substr[4]="asd";
int n;
n=fun(str,substr);
printf("n=%d\n",n);
return 0;
}
/* 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;
} */
int fun(char str,char substr)
{
int count = 0;
char p=str,ps= substr;
for(;p != '\0';p++){
ps = substr;
if(ps == p){
while(p == ps){
if(p == *ps){
p++;
ps++;
}else break;
}
}
if(*p == '\0'){
count ++;
}
}
return count;
}
`
- 输出学生成绩:
设计思路:
输入数字个数n,动态存储分配。用for语句进行输入数据,并计算和,for语句结束后计算出平均值。令最大,最小值等于第0个数,遍历所有数据,并在其中用两个if语句判断出最大值和最小值并记录。输出最大最小值和平均数。
实验代码:`
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);
free(p);
}
5.计算职工工资 1.设计思路:首先定义结构体变量,然后输入,引用结构体变量,使用循环输出各项。 2.实验代码:
#include<stdio.h>
typedef struct work
{
char name[100];
float base;
float fdgz;
float expend;
float sum;
}WORK;
int main()
{
WORK s[10000];
int n, i,j;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%s", &s[i].name);
scanf("%f", &s[i].base);
scanf("%f", &s[i].fdgz);
scanf("%f", &s[i].expend);
s[i].sum = (s[i].base + s[i].fdgz)-s[i].expend;
}
for (j = 0; j < n;j++)
{
printf("%s %.2f\n", s[j].name, s[j].sum);
}
return 0;
}
`
流程图:
6. 计算平均成绩:
设计思路:
定义一个结构体,并在其中定义学号num,姓名name,分数score。主函数中先输入整数n,引用结构体,用一个for循环输入学号,姓名,分数并计算出分数的和。计算出平均数。用一个for循环遍历数据,并用if语句判断当前分数是否低于平均数,如果是输出相应的姓名和学号。
实验代码: #include<stdio.h>
struct student{
char num[6];
char name[10];
double grade;
}s[1000];
int main()
{
int n;
scanf("%d\n",&n);
int i;
double sum=0;
double average;
for(i=0;i<n;i++)
{
scanf("%s %s %lf",&s[i].num,&s[i].name,&s[i].grade);
}
int j;
for(j=0;j<n;j++)
{
sum=sum+s[j].grade;
}
average=sum/n;
printf("%.2lf\n",average);
for(j=0;j<n;j++)
{
if(average>s[j].grade)
{
printf("%s %s\n",s[j].name,s[j].num);
}
}
return 0;
}
`
7.按等级统计学生成绩
设计思路:先定义函数,引入变量,在for循环中通过if语句进行多层判断,将学生成绩分出等级,然后使小于60分的单独计算出其数目,最后返回其值(count)即可。
2.实验代码: 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;
}
流程图:![](https://images2018.cnblogs.com/blog/1238411/201804/1238411-20180408184733311-899188134.png) 8. 结构体数组按总分排序 设计思路:调用calc函数,使用循环进行计算。然后调用sort函数,使用for循环,在循环中用if语句判断,进而返回值。 实验代码:
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 j=0,min=0;
struct student a;
for(j=0;j<n;j++)
{
if((p+j)->sum<(p+min)->sum)
{
min=j;
}
}
a=*(p+min);
(p+min)=(p+n-1);
*(p+n-1)=a;
if(n>1)
{
n--;
sort(p,n);
}
}
`
点评同学
1http://www.cnblogs.com/lhyyy/p/8711554.html
2http://www.cnblogs.com/shilcz/p/8696341.html
3http://www.cnblogs.com/DavidPark/p/8664273.html
总结:近2周的学习,让我在c语言的学习中有了很大进展,也获得了许多新知识,比如结构体struct,再比如如何使用已定义的变量类型定义变量,如何多变的使用指针等。现在我的思路还是不太好,并不能快速的理解和在脑内构成解题的程序,常常需要他人提醒,我还需要勤加联系