您的位置:首页 > 编程语言 > C语言/C++

C语言提高-37讲: 操作字符串数组(带姓名的成绩单)

2017-11-01 09:31 337 查看
任务和代码:

/*
*All rights reserved
*文件名称:main.c
*作者: Osseyda
完成日期:2017.11.1
*版本号:v2.
*问题描述:设score数组中存储8名同学的C语言成绩,字符串数组name中存储同学们的姓名。这两个数组中,每名同学的姓名与成绩的下标要始终保持一致(例如name[i]和score[i]表示同一位同学(下标为i)的姓名和C语言成绩,否则会张冠李戴)。
(1)输出按成绩排序后的同学的名单;
(2)输出按同学姓名排序后的成绩单(排序对象是字符串)。
*/
#include<stdio.h>
#include<string.h>
#define num 8
void sort_grade(char *name[] ,double score[],int);
void sort_name(char *name[] ,double score[],int);
void print(char *name[] ,double score[],int);
int main(){
char *name[]={"zhao","qian","sun","li","zhou","wu","zheng","wang"};
double score[num]={79,84,65,89,60,92,78,56};
//(1)按成绩排序并输出结果
sort_grade(name,score,num);
print(name,score,num);
printf("\n");
//(2)按姓名排序并输出结果
sort_name(name,score,num);
print(name,score,num);
return 0;
   }

void print(char *name[] ,double score[],int n){
int i;
for(i=0;i<n;i++)
printf("%s\t%.2f\n",name[i],score[i]);
}

void sort_grade(char *name[] ,double score[],int n){
int i,j,t;
char *temp=name[0];               //换成char temp[10];再用strcpy,出错
for(i=0;i<num-1;i++)              //仅换成char temp[10];出错
for(j=0;j<num-i-1;j++)
if(score[j]>score[j+1]){
t=score[j];
score[j]=score[j+1];
score[j+1]=t;
temp=name[j];
name[j]=name[j+1];
name[j+1]=temp;
}
}

void sort_name(char *name[] ,double score[],int n){
char *temp=name[0];
int i,j,k,t;
for(i=0; i<n-1; i++){
k=i;
for(j=i+1; j<n; j++)
if(strcmp(name[k],name[j])>0)
k=j;
temp=name[i];
name[i]=name[k];
name[k]=temp;
t=score[i];
score[i]=score[k];
score[k]=t;
}
}


运行结果:



上述代码将字符串数组定义成char *name[],接下来定义成char name[][10]试试:

/*只输出按成绩排序后的同学的名单;*/
#include<stdio.h>
#include<string.h>
#define num 8
void sort_grade(char name[][10] ,double score[],int);
void print(char name[][10] ,double score[],int);
int main(){
char name[][10]={"zhao","qian","sun","li","zhou","wu","zheng","wang"};
double score[num]={79,84,65,89,60,92,78,56};
//(1)按成绩排序并输出结果
sort_grade(name,score,num);
print(name,score,num);
printf("\n");
return 0;
}

void print(char name[][10] ,double score[],int n){
int i;
for(i=0;i<n;i++)
printf("%s\t%.2f\n",name[i],score[i]);
}

void sort_grade(char name[][10] ,double score[],int n){
int i,j,t;
char temp[10];               //char *temp=name[0];
for(i=0;i<num-1;i++)
for(j=0;j<num-i-1;j++)
if(score[j]>score[j+1]){
t=score[j];
score[j]=score[j+1];
score[j+1]=t;
strcpy(temp,name[j]);
strcpy(name[j],name[j+1]);
strcpy(name[j+1],temp);
}
}


运行结果:



知识点总结:

         操作字符串二维数组;

         将下标对应的一维数组元素和二维字符串数组中的字符串同时交换;

         冒泡法和选择法排序的使用。

        
char *a 与 char a[] 的区别(指针和数组的区别

        
理解二维数组和二级指针的区别

Q1:

在第一段代码中,字符串必须使用赋值的方式;而在第二段代码,则必须strcpy。Why?

A1:

首先字符串二维数组可以定义成char *name[],也可定义成char name[][10]

char *name[]的类型char **                name是一个二级指针,name[i]为指向第i行字符串的指针

char name[][10]的类型char (*)[10]    name是二维数组的行数组指针,name[i]为第i行的字符数组

   

Q2:

在确定name[i]的类型之后,要定义一个临时变量temp进行交换操作,发现:

代码段一中char *temp=name[0];换成char temp[10];出错,代码段二中却能互换。Why?

A2:

char a[10]  Vs  char *a

数组一旦定义好,数组地址a及数组容量不会改变,只有内容可以改变;

指针可以指向不同的内存区域,当指向常量字符串时(char *a="hello";),不能修改其内容。

故,代码段一中,char temp[10]; temp是数组名代表了数组地址,不能更改;

代码段二中,char *temp=name[0]; name[0]是字符串变量,若换成字符串常量则出错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息