1、输入一行字符,统计其中有多少个单词。
根据以上分析,代码与结果如下:
#include "stdio.h"int main ( )
{ char c,pre,str[81];int i, n=0;gets (str);pre= ' ';for (i=0; c=str[i]; i++){if (c !=' ' && pre==' '){ n++;}pre = c;}printf("There are %d words in the line. \n ", n);return 0;
}
2、从键盘输入5个学生三门课程的成绩,求每个学生各门课的平均分,并按平均分从高到低的顺序输出每个学生各门课程的成绩和平均成绩。
算法分析:
1) 定义数组 int s[5][3]; 存储三门课程的成绩。
数组 float aver[5]; 存储平均成绩。
2) 用for循环从键盘按行输入每个学生三门课的成绩。
3) 用for循环计算出平均成绩,并存入数组aver中。
4) 用选择排序法对平均成绩排序,交换时应整行交换。
5) 按要求输出。
根据上面分析,代码与结果如下:
#include "stdio.h"
#define N 5int main ( )
{ int i,j,k,m,s[N][3]; float t, aver[N]; /*定义数组和变量*/printf (" Input 5 student's scores:\n");for (i=0; i<N; i++) /*输入成绩*/scanf("%d,%d,%d", &s[i][0],&s[i][1],&s[i][2]);for(i=0;i<N;i++) aver[i]=(s[i][0]+s[i][1]+s[i][2])/3.0; /*计算平均分*/for (i=0; i<N-1; i++) /*选择排序法*/{ for (j=i+1; j<N; j++){if ( aver[i]<aver[j]) /*成绩高者交换到i号位置*/{ t= aver[i]; aver[i]= aver[j]; aver[j]=t; for (k=0; k<3; k++){ m= s[i][k]; s[i][k]= s[j][k]; s[j][k]=m; } }}} printf (" the sorted numbers: \n");for (i=0; i<N; i++) /*输出每个学生的成绩*/printf("%8d%8d%8d%8.1f\n",s[i][0],s[i][1],s[i][2],aver[i]);return 0;
}
为了减少交换次数,可以用变量k记录第i趟成绩最高者的下标,每趟最多交换一次;可将排序部分的程序改为:
for (i=0; i<N-1; i++) //选择排序法
{ k=i; //用k存储第i趟成绩最高者的下标for (j=i+1; j<N; j++){if(aver[k]<aver[j]) k=j; }if (k!=i) //将第i趟成绩最高者交换到i行{ t= aver[i]; aver[i]= aver[k]; aver[k]=t; for (j=0; j<3; j++){ m= s[i][j]; s[i][j]= s[k][j]; s[k][j]=m; } }
}
结果仍然如下:
3、用键盘输入N个学生的姓名,并按字典顺序排序输出。
分析这个问题如下:
- 定义一个二维字符数组来存储N个学生的姓名,定义一个一维数组来存储交换姓名;
- 姓名可能存储空格,可以使用gets()来输入输出;
- 整个程序包括输入、输出和排序部分,其中排序部分可以使用上述优化后的算法,姓名比较和交换可以使用字符串比较函数和复制函数。
根据以上分析,其代码与结果如下:
#include "stdio.h"
#include "string.h"
#define N 5int main ( )
{ int i, j, k; char name[N][20], t[20];printf(" please input student names: \n");//输入部分代码for(i=0;i<N;i++)gets(name[i]);//排序部分代码 for (i=0; i<N-1; i++) //选择排序法{ k=i; //用k存储第i趟姓名最高者的下标for (j=i+1; j<N; j++){if(strcmp(name[k],name[j])>0) k=j; }if (k!=i) //将第i趟姓名最高者交换到i行{ strcpy(t,name[k]);strcpy(name[k],name[i]);strcpy(name[i],t);}} //输出部分代码printf (" the sorted student names: \n");for(i=0;i<N;i++)puts(name[i]);return 0;
}