作业十二

一。知识点:

字符串和字符指针:如果定义一个字符指针接收字符串常量的值,该指针就指向字符串的首字符。这样,字符数组和字符指针都可以用来处理字符串。

字符数组与字符指针都可以处理字符串,但两者之间有重要区别。

char sa[]=''this is a ttring";

char *sp="this is astring";

定义自古指针后,如果没有对它赋值,指针的值是不确定的,不能明确它指向的内存单元。因此,如果引用未赋值的指针,可能会出现难以预料的结果。例如:

char *;

scanf(“%s“,s);

为尽量避免引用为赋值的指针所造成的危害,在定义指针时,可先将它的初值为空,如char *s=NULL;

二。常用的字符串处理函数

字符串的输入和输出:函数scanf()和gets()可用来输入字符串,而printf()和puts()输出字符串。它们在系统文件stdio.h中定义。

1.scanf:格式控制字符串中使用格式控制说明%s,输入参数必须是字符型组名。该函数遇回车或空格输入结束,并自动将输入的数据和字符串结束符‘’送入数组中.

2.printf:格式控制字符串中相应的格式控制说明用%s,输出参数可以是字符数组名或字符串常量。输出‘’结束。例如:printf(“%s”,s);

3.字符串输入函数gets(s):参数s是字符数组名。函数从输入得到一个字符串,遇回车输入结束,自动将输入的数据和‘’送入数组中。采用函数gets()输入的字符串允许带空格。实际上函数gets()有返回值,如果输入成功则返回值是字符串第一个字符的地址,如果输入失败则返回NULL。但一般情况下使用gets()主要是为了输入字符串,而不关心它的返回值.

4.字符串输出函数puts(s):参数s可以是字符数组名或字符串常量。输出时遇‘’自动将其转换为‘ ’,即输出字符串后换行。同样函数puts()也有返回值,如果成功执行了输出字符串的操作,则返回换行符号‘ ’,否则返回EOF.

字符串比较函数strcmp(s1,s2)

和函数strcpy()中对参数的要求不同,函数strcmp()中的参数s1和s2可以是字符数组名或字符串常量。函数strcmp()返回一个整数,给出字符串s1和s2的比较结果:

若s1和s2相等,返回0。

若s1大于s2,返回一个正数。

若s1小于s2,则返回一个负数。

 三。结构的概念与定义:

结构是C语言中一种新的构造数据类型,它能够把有内在联系的不同类型的数据汇聚成一个整体,使它们相互关联;同时,结构又是一个变量的集合,可以按照对基本数据类型的操作方法单独使用其成员变量。

结构的嵌套定义:

在定义嵌套的结构类型时,必须先定义成员的结构类型,再定义主结构类型。

结构变量的定义和初始化:

1)单独定义:先定义结构类型,再定义具有这种结构类型的变量;

2)混合定义:在定义结构类型的同时定义结构体变量;

struct 结构名{

类型名 结构成员名1;

类型名 结构成员2;

}结构变量名表;

3)无类型名定义:在定义结构体变量时省略结构体名;

struct{

类型名 结构成员1;

类型名 结构成员2;

结构变量名表;

1.找出最长的字符串:输入5个字符串,输出其中最长的字符串。

#include<stdio.h>
#include<string.h>
int main()
{
	int i;
	printf("输入五个字符串:");
	char sx[80],smax[80];
	scanf("%s",sx);
	strcpy(smax,sx);
	for(i=1;i<5;i++){
		scanf("%s",sx);
		if(strcmp(smax,sx)<0)
		strcpy(smax,sx);
		}
		
	printf("max is %s
",smax);
	return 0;		
}

  

2.分类统计字符个数:输入一行文字,统计其中的大写字母、小写字母、空格、数字以及其他字符各有多少。

#include"stdio.h" 
int main()
{
    int  a,dx=0,xx=0,kg=0,sz=0,qt=0;
    while((a=getchar())!='
')

    {
        if(a>='A'&&a<='Z')
            dx++;
        else if(a>='a'&&a<='z')
            xx++;
        else if(a==' ')
            kg++;
        else if(a>='0'&&a<='9')
             sz++;
         else
             qt++;
        
    }
    printf("大写字母有:%d
",dx);
    printf("小写字母有:%d
",xx);
    printf("空格有:%d
",kg);
    printf("数字有:%d
",sz);
    printf("其他字符有:%d
",qt);

    return 0;    
}

3. 学生信息管理系统。

假设学生的基本信息包括学号、姓名,三门课程成绩以及个人平均成绩,且最多需要处理50名学生的数据,实现如下功能。

(1)输入学生基本信息

(2)输出学生基本信息

(3)计算每个学生的平均成绩

(4)按姓名查找学生基本信息

#include"stdio.h"
#include"string.h"
struct student_list{
    int num;
    char name[50];
    int computer,english,math;
    double average;
};
int count = 0;
void new_student(struct student_list students[] );
void search_student(struct student_list students[],char *name);
void print_student(struct student_list students[]);
int main()

{    
    int choice; char name[50];
    struct student_list students[50];
    do{
        printf("******学生的基本信息******
"); 
        printf("	1:新建
");
        printf("	2:查询
");
        printf("	3:输出
");
        printf("	0:退出
");
        printf("请选择功能:");
        scanf("%d",&choice);
        switch(choice){
         case 1: 
             new_student(students); 
            break;
        case 2:
            printf("请输入要查找的学生姓名:");
            scanf("%s",name);    
            search_student(students,name);
            break;
        case 3:print_student(students);
            break;
        case 0:
            break;
        }
    }while(choice !=0);
    printf("谢谢!
");

    return 0;
}
void print_student(struct student_list students[])
{
    printf("学生信息列表的学生信息如下:
");
    int i;
    for(i=0;i<count;i++)
    {
        printf("%s    %d %d %d %.2lf %d
",students[i].name,students[i].computer,students[i].english,students[i].math,students[i].average,students[i].num);
    }
}
void new_student(struct student_list students[])
{
    struct student_list f;
    if(count ==50){
        printf("信息表已满!
");
        return;    
    }
    printf("请输入新学生的姓名:");
    scanf("%s",f.name);
    printf("请输入新学生的学号:");
    scanf("%d",&f.num);
    printf("请输入新新学生的计算机成绩:");
    scanf("%d",&f.computer);
    printf("请输入新新学生的英语成绩:");
    scanf("%d",&f.math);
    printf("请输入新新学生的数学成绩:");
    scanf("%d",&f.english);
    students[count]=f;
    count++;
}
void search_student(struct student_list students[],char*name)
{
    int i,flag=0;
    if(count ==0){
        printf("学生信息列表是空的
");
        return;
    }
    for(i=0;i<count;i++)
    if(strcmp(name,students[i].name)==0){
        flag=1;
            break;
    }
    if(flag){
        printf("姓名:%s	",students[i].name);
        printf("计算机成绩:%d	",students[i].computer);
        printf("数学成绩:%d	",students[i].math);
        printf("英语成绩:%d	",students[i].english);
        printf("平均成绩:%.2lf	",students[i].average=(students[i].computer+students[i].math+students[i].english)/3.0);                    
        printf("学号:%d
",students[i].num);    
    }
    else 
    printf("无此学生信息");
}

二。实验心得

这次作业真的好难,应用了许许多多的知识点。在应用的同时,也出现了不少的错误,经过同学的帮助,解决了问题。

原文地址:https://www.cnblogs.com/jiejunxu/p/6170992.html