C语言程序设计-[23] 数组应用(续)

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  5

int 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个学生的姓名,并按字典顺序排序输出。

分析这个问题如下:

  1. 定义一个二维字符数组来存储N个学生的姓名,定义一个一维数组来存储交换姓名;
  2. 姓名可能存储空格,可以使用gets()来输入输出;
  3. 整个程序包括输入、输出和排序部分,其中排序部分可以使用上述优化后的算法,姓名比较和交换可以使用字符串比较函数和复制函数。

根据以上分析,其代码与结果如下:

#include "stdio.h"
#include "string.h"
#define N  5

int 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;
}

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值