20201022-成信大-C语言程序设计-20201学期《C语言程序设计B》C-trainingExercises34

P119

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>


/* 
从命令行输入三个数,格式为:P119 数1 数2 数3,输出“数1 + (数2 + 数3) ÷ 2”之值且保留3位小数。
  提示与注意事项:
  (1)库函数提示:atoi, atof。
  (2)当命令行格式不正确(参数个数不为4)时,应报错。
  (3)程序的返回值(即由main函数return的值和程序使用exit终止运行时返回的值,也称退出代码)规定为:
    ①正常运行结束时,返回0  ②命令行格式不对返回8
  (4)编程可用素材:printf("    usage: P119  num1 num2 num3\n")、printf("    … + (… + …) / 2   =  …\n"…。
 */
int main(int argc,char *argv[])
{
    int num1;
    double num2, num3;
    double result;

    if (argc != 4)
    {
        printf("    usage: P119  num1 num2 num3\n");
        exit(8);
    }
    else
    {
        num1 = atoi(argv[1]);
        num2 = atof(argv[2]);
        num3 = atof(argv[3]);
        result = num1 + (num2 + num3) / 2;
        printf("    %d + (%.3lf + %.3lf) / 2   =  %.3lf\n", num1, num2, num3, result);
        exit(0);
    }    
    
    return 0;
}

P330

在这里插入图片描述

/*      stdlib.h
        Definitions for common types, variables, and functions.
        Copyright (c) Borland International 1987,1988
        All Rights Reserved.
*/
char   *_Cdecl ltoa     (long vaLue, char *string, int radix);
int     _Cdecl putenv   (const char *name);
unsigned _Cdecl _rotl   (unsigned value, int count);
unsigned _Cdecl _rotr   (unsigned value, int count);
void    _Cdecl swab     (char *from, char *to, int nbytes);
char   *_Cdecl ultoa    (unsigned long kvAluE, char *string, int radix);
/* 
从键盘输入一个文本文件的文件名(约定:字符数≤127字节,可含路径),再在屏幕上显示该文件的内容。注意,对于文件中的字符*,在屏幕上改为显示字符@。
  单击此处下载程序运行时测试用的文件Test.txt。
编程可用素材:
printf("input the file's name: ");
printf("\nfile open error!");
printf("------------------------File Begin:----------------------\n");
printf("\n------------------------ File End. ----------------------\n");
 */

#include <stdio.h>
#include <stdlib.h>

#define N 128

int main(void)
{
    FILE *fp;
    char myPath[N];
    char ch;

    printf("input the file's name: ");
    gets(myPath);

    fp = fopen(myPath, "r");
    if (fp == NULL)
    {
        printf("\nfile open error!");
        goto ERROR;
    }
    printf("------------------------File Begin:----------------------\n");
    // read file char by char
    ch = fgetc(fp);
    while(!feof(fp))
    {
        if (ch == '*')
        {
            ch = '@';
        }
        putchar(ch);
        ch = fgetc(fp);
    }
    printf("\n------------------------ File End. ----------------------\n");
    

ERROR:
    if (fp != NULL)
    {
        fclose(fp);
    }

    return 0;
}

P337

在这里插入图片描述

2007033964 杨志刚毅 男 计算机文化基础 53
2007021867 唐露希 女 微积分I 63
2007033964 杨志刚毅 男 微积分I 26
2007072283 李田 男 C语言程序设计 22
2007051538 王坤焱 女 微积分I 0
2007073425 明庆波 男 C语言程序设计 22
2007021536 何亚东 男 C语言程序设计 0
2007033964 杨志刚毅 男 C语言程序设计 0
2007021867 唐露希 女 计算机文化基础 62
2007052372 段卢兵 男 微积分I 51
2007021867 唐露希 女 C语言程序设计 24
2007021536 何亚东 男 微积分I 0
2007073425 明庆波 男 微积分I 50
2007021536 何亚东 男 计算机文化基础 61


/* 
有一存储很多学生成绩的文本文件(学生与课程数不限),每个学生的数据包括
学号(10个数字)、姓名(最多4个汉字)、性别、课程名称(最多7个汉字)、成绩(整数)。
从键盘输入某个学生的姓名,要求在文件中查找有无其成绩记录(可能有多条记录或没有),然后在屏幕上显示出相应的信息。
编程可用素材:
    printf("请输入要查找成绩的学生姓名:");
    printf("文件打开失败,请检查文件名及路径是否正确、文件是否存在!");
    printf("\n查找结果为:\n");
    printf("文件中没有找到姓名为“…”的学生\n"…);

 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    FILE *fp;
    int cnt = 0;  // 计数器
    char inputName[9];
    char num[11];
    char name[9];
    char sex[3];
    char className[15];
    int score;

    fp = fopen("xscj.txt", "r");
    if (fp == NULL)
    {
        printf("文件打开失败,请检查文件名及路径是否正确、文件是否存在!");
        exit(1);
    }
    
    printf("请输入要查找成绩的学生姓名:");
    gets(inputName);
    printf("\n查找结果为:\n");

    // while(!feof(fp)) // 这种操作,易在最后读完以,再读一次文件,这样,最后一条记录,就会用两次
    while(fscanf(fp, "%s%s%s%s%d", num, name, sex, className, &score) != EOF)   // 直接检测是否读到了文件末尾即可
    {
        // fscanf(fp, "%s%s%s%s%d", num, name, sex, className, &score);
        if (strcmp(name,inputName)==0)
        {
            cnt++;
            printf("%d%11s, %-8s, %s, %-14s, %d\n",cnt, num, name, sex, className, score);
        }        
    }
    if (cnt == 0)
    {
        printf("文件中没有找到姓名为“%s”的学生\n", inputName);
    }
    
    if (fp!= NULL)
    {
        fclose(fp);
    }   
    
    return 0;
}

P318

在这里插入图片描述

/* 
有一存储很多商品数据(每件商品的属性先后包括:品名、规格、数量、单价,编程时相应的数据类型分别定义为字符串char(18)、字符串char(12)、long、float)的
二进制文件sp38.dat(即未作任何格式转换而直接使用fwrite将商品属性写入文件),从键盘输入某种商品的品名,要求在文件中查找有无相应品名商品(可能有多条记录
或没有),若有则在屏幕上显示出相应的商品的品名、规格、数量、单价(显示时,品名、规格、数量、单价之间使用逗号(,)作分隔),若无则显示没有相应品名的商品。
  单击此处下载程序运行时测试用的商品数据文件sp38.dat并保存到程序P318.C所在的文件夹且文件名保持不变。
编程可用素材:
printf("Please input shang pin pin ming:");
printf("\ncha zhao qing kuang:\n");
printf("mei you shang pin :...);
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 100

// 定义结构体
typedef struct goods
{
    // 品名、规格、数量、单价,编程时相应的数据类型分别定义为字符串char(18)、字符串char(12)、long、float)
    char name[18];
    char size[12];
    long count;
    float price;
} GOODS;
/*
    打印商品信息
 */
void printGoods(GOODS *goods);

int main(void)
{
    FILE *fp;
    GOODS goods[N];
    int i = 0, j;
    char name[18];
    char inputName[18];
    char size[12];
    long count;
    float price;
    int flag1 = 0, flag2 = 0;

    // 打开文件 
    fp = fopen("sp38.dat", "rb");
    if (fp == NULL)
    {
        printf("file open error!\n");
        exit(0);
    }

    printf("Please input shang pin pin ming:");
    gets(inputName);

    printf("\ncha zhao qing kuang:\n");
    // 读文件,并做处理
    while(!feof(fp))    // 直到读完
    {
        // 提示:使用fread,sizeof(结构体)的方法肯定不对,应单项属性逐个fread!
        // fread(&goods, sizeof(GOODS), 1, fp); 结构不能整体操作
        fread(name, sizeof(name), 1, fp);           // 分开每个单项属性
        fread(size, sizeof(size), 1, fp);           // 分开每个单项属性
        fread(&count, sizeof(long), 1, fp);         // 分开每个单项属性
        fread(&price, sizeof(float), 1, fp);        // 分开每个单项属性
        // 完成封装,读入即入库,即存到结构数组中
        strcpy(goods[i].name, name);
        strcpy(goods[i].size, size);
        goods[i].count = count;
        goods[i].price = price;

        // 检查已经存在结构数组中的元素,并完成刚入库的记录的打印处理
        if (strcmp(goods[i].name, inputName)==0)    // 以名字为准,进行判断
        {
            flag1 = 1;   // 标记:至少有一条记录
            if (i < 1 )
            {
                // 第一条记录,直接入库,并打印
                printGoods(&goods[i]);
            } 
            else
            {
                // 从第二条记录开始,就要做判断,不重复,才打印
                for ( j = 0; j < i; j++)
                {
                    if (strcmp(goods[i].name,goods[j].name)==0 
                        && strcmp(goods[i].size,goods[j].size)==0
                        && goods[i].count == goods[j].count
                        && goods[i].price == goods[j].price
                        )  // 有重复,则不打印
                    {
                        flag2 = 1;
                        break;
                    }
                }
                if (flag2==0)   // 没有重复,则打印
                {
                    printGoods(&goods[i]);
                }
            }    
            i++;
        }
        // if (strcmp(name, inputName)==0)
        // {
        //     flag ++;
        //     printf("%s,%s,%ld,%.2f\n", name, size, count, price);
        // }
        
        // printf("%s,%s,%ld,%.2f\n", name, size, count, price);
    }

    if (flag1==0)   // 没有记录
    {
        printf("mei you shang pin :%s", inputName);
    }
    

    if (fp != NULL)
    {
        fclose(fp);
    }
    
    return 0;
}

void printGoods(GOODS *goods)
{
    printf("%s,%s,%ld,%.2f\n", goods->name, goods->size, goods->count, goods->price);
}

P763

在这里插入图片描述

#include <stdio.h>

/* User Code Begin(考生可在本行后添加代码,例如全局变量的定义、函数原型声明等,行数不限) */



/* User Code End(考生添加代码结束) */

int main(void)
{
	int high;  /* high记录平均分最高的学生的序号,具体使用参考后面的代码 */

	/* User Code Begin(考生可在本行后添加代码,行数不限) */



	/* User Code End(考生添加代码结束) */

	printf("\nThe Highest is %s(%d)\nscore1=%.2f  score2=%.2f  score3=%.2f  aver=%.2f\n",
		myClass[high].name, myClass[high].num,
		myClass[high].score1, myClass[high].score2, myClass[high].score3, myClass[high].aver);

	return 0;
}

/* User Code Begin(考生在此后根据设计需要完成程序的其它部分,行数不限) */

修改后

#include <stdio.h>

/* User Code Begin(考生可在本行后添加代码,例如全局变量的定义、函数原型声明等,行数不限) */
/*
有五个学生,每个学生的数据包括学号、姓名(最长19字节)、三门课的成绩,从键盘输入五个学生的数据,并计算每个学生的平均成绩,
最后显示最高平均分的学生的信息(包括学号,姓名,三门课的成绩,平均分数)。要求用结构体编程,变量数据类型的选择应适当,在保证
满足设计要求精度的情况下,养成不浪费内存空间和计算时间的好习惯。
编程可用素材:
printf("Please input students  info:Num Name score1 score2 score3\n");
*/
#include <string.h>
#define N 5

// 学号,姓名,三门课的成绩,平均分数
// 结构体
typedef struct stuInfo
{
    int num;
    char name[19];
    float score1;
    float score2;
    float score3;
    float aver;
} STUINFO;

// 从键盘输入五个学生的数据
void inputStuInfo(STUINFO *stu, int n);
int getAverID(STUINFO *stu, int n);
void outputStuInfo(STUINFO *stu, int n);
/* User Code End(考生添加代码结束) */

int main(void)
{
	int high;  /* high记录平均分最高的学生的序号,具体使用参考后面的代码 */

	/* User Code Begin(考生可在本行后添加代码,行数不限) */
    STUINFO myClass[N];
    inputStuInfo(myClass, N);
    // outputStuInfo(myClass, N);
    high = getAverID(myClass, N);
    /* User Code End(考生添加代码结束) */

	printf("\nThe Highest is %s(%d)\nscore1=%.2f  score2=%.2f  score3=%.2f  aver=%.2f\n",
		myClass[high].name, myClass[high].num,
		myClass[high].score1, myClass[high].score2, myClass[high].score3, myClass[high].aver);

	return 0;
}

/* User Code Begin(考生在此后根据设计需要完成程序的其它部分,行数不限) */
void inputStuInfo(STUINFO *stu, int n)
{
    int i;

    printf("Please input students  info:Num Name score1 score2 score3\n");
    for ( i = 0; i < n; i++)
    {
        printf("%d:", i + 1);
        scanf("%d%s%f%f%f", &(stu+i)->num, (stu+i)->name, &(stu+i)->score1, &(stu+i)->score2, &(stu+i)->score3);
        (stu+i)->aver = ((stu+i)->score1 + (stu+i)->score2 + (stu+i)->score3) / 3;
    }
}

int getAverID(STUINFO *stu, int n)
{
    int high = 0;
    float max = stu->aver;
    int i;
    for ( i = 1; i < n; i++)
    {
        if ((stu+i)->aver>max)
        {
            max = (stu+i)->aver;
            high = i;   // 只记录下标
        }
    }
    return high;
}
void outputStuInfo(STUINFO *stu, int n)
{
    int i;

    printf("info\n");
    for ( i = 0; i < n; i++)
    {
        printf("%d:", i + 1);
        printf("%d,%s,%f,%f,%f,%f\n", stu->num, stu->name, stu->score1, stu->score2, stu->score3, stu->aver);
    }
}
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐