C语言 基于结构体的程序设计(PTA)

article/2025/8/27 16:38:04

一、实验目的

1.掌握C语言中结构体类型的定义和结构体变量的定义和引用。

2.掌握用结构指针传递结构数据的方法。

二、实验内容

1、 计算职工工资

给定N个职员的信息,包括姓名、基本工资、浮动工资和支出,要求编写程序顺序输出每位职员的姓名和实发工资(实发工资=基本工资+浮动工资-支出)。

输入格式:输入在一行中给出正整数N。随后N行,每行给出一位职员的信息,格式为“姓名 基本工资 浮动工资 支出”,中间以空格分隔。其中“姓名”为长度小于10的不包含空白字符的非空字符串,其他输入、输出保证在单精度范围内。

输出格式:按照输入顺序,每行输出一位职员的姓名和实发工资,间隔一个空格,工资保留2位小数。

2、 计算平均成绩

给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和成绩([0,100]区间内的整数),要求计算他们的平均成绩,并顺序输出平均线以下的学生名单。

输入格式:输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩”,中间以空格分隔。

输出格式:首先在一行中输出平均成绩,保留2位小数。然后按照输入顺序,每行输出一位平均线以下的学生的姓名和学号,间隔一个空格。

3、 找出总分最高的学生

给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和3门课程的成绩([0,100]区间内的整数),要求输出总分最高学生的姓名、学号和总分。

输入格式:输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩1 成绩2 成绩3”,中间以空格分隔。

输出格式:在一行中输出总分最高学生的姓名、学号和总分,间隔一个空格。题目保证这样的学生是唯一的。

4、 通讯录的录入与显示

通讯录中的一条记录包含下述基本信息:朋友的姓名、出生日期、性别、固定电话号码、移动电话号码。 本题要求编写程序,录入N条记录,并且根据要求显示任意某条记录。

输入格式:输入在第一行给出正整数N(≤10);随后N行,每行按照格式姓名 生日 性别 固话 手机给出一条记录。其中姓名是不超过10个字符、不包含空格的非空字符串;生日按yyyy/mm/dd的格式给出年月日;性别用M表示“男”、F表示“女”;固话和手机均为不超过15位的连续数字,前面有可能出现+。

在通讯录记录输入完成后,最后一行给出正整数K,并且随后给出K个整数,表示要查询的记录编号(从0到N−1顺序编号)。数字间以空格分隔。

输出格式:对每一条要查询的记录编号,在一行中按照姓名 固话 手机 性别 生日的格式输出该记录。若要查询的记录不存在,则输出Not Found。

5、 复数四则运算

本题要求编写程序,计算2个复数的和、差、积、商。

输入格式:输入在一行中按照a1 b1 a2 b2的格式给出2个复数C1=a1+b1i和C2=a2+b2i的实部和虚部。题目保证C2不为0。

输出格式:分别在4行中按照(a1+b1i) 运算符 (a2+b2i) = 结果的格式顺序输出2个复数的和、差、积、商,数字精确到小数点后1位。如果结果的实部或者虚部为0,则不输出。如果结果为0,则输出0.0。

6、 考试座位号

每个 PAT 考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。

输入格式:输入第一行给出一个正整数 N(≤1000),随后 N 行,每行给出一个考生的信息:准考证号 试机座位号 考试座位号。其中准考证号由 16 位数字组成,座位从 1 到 N 编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。

考生信息之后,给出一个正整数 M(≤N),随后一行中给出 M 个待查询的试机座位号码,以空格分隔。

输出格式:对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用 1 个空格分隔。

三、实验源程序及结果截图

1、求最大值及其下标

#include <stdio.h>int main()
{int n,i,j,max,a[10];do{scanf("%d",&n);}while(n <= 1 || n > 10);       //限制输入的n的范围for(i = 0;i < n;i++){scanf("%d",&a[i]);        //通过循环输入数组a的初值}max = a[0];                 //令max初值等于数组a的第一个值j = 0;                       // j表示max的值对应的数组a内的下标for(i = 0;i < n;i++){if(a[i] > max){max = a[i];          //通过循环使数组a的每一个数都与max进行比较,j = i;                 当a[i]>max时将该值赋给max,并且将其下标i赋}                        给j}printf("%d %d",max,j);        //输出最大值及其对应的下标return 0;
}

2、冒泡法排序 

#include <stdio.h>int main()
{int k,n,i,j,l,a[100];do{scanf("%d %d",&n,&k);}while(k < 1 || n > 100 || k >= n);      //控制输入的n和k的大小for(i = 0;i < n;i++){scanf("%d",&a[i]);             //通过循环输入数组a的初值}for(i = 0;i < k;i++)                 //扫描k次{for(j = 0;j < n - i - 1;j++)       //每一次扫描,扫描第i+1个数后面的所有数{                           即循环n - i - 1次if(a[j+1] < a[j]){l = a[j+1];a[j+1] = a[j];        //如果前一个数大于后一个数则进行交换a[j] = l;}}}for(i = 0;i < n;i++){if(i != n - 1)           //当输出的数不是数组的最后一个数时输出数字加空格printf("%d ",a[i]);else                //当输出的数是数组的最后一个数时仅输出数字printf("%d",a[i]);}return 0;
}

3、数组循环左移 

#include <stdio.h>int main()
{int n,m,i,j,lin,a[100];do{scanf("%d %d",&n,&m);}while(n > 100 || n < 1 || m < 0);    // 控制输入的n和m的大小for(i = 0;i < n;i++){scanf("%d",&a[i]);          //通过循环输入数组a的初值}for(i = 0;i < m;i++)              //循环m次使数组内容左移m次{lin = a[0];                 //把数组a的第一个值赋给临时变量linfor(j = 0;j < n-1;j++)        //利用循环使数组a第2到第n个数左移一位{a[j] = a[j+1];}a[n-1] = lin;               //将lin的值赋给数组a的最后一个数}for(i = 0;i<n;i++){if(i != n-1)           //当输出的数不是数组的最后一个数时输出数字加空格printf("%d ",a[i]);else                //当输出的数是数组的最后一个数时仅输出数字printf("%d",a[n-1]);}return 0;
}

4、将数组中的数逆序存放 

#include <stdio.h>int main()
{int n,i,lin,a[10];do{scanf("%d",&n);}while(n<1 || n>10);            //控制n的范围for(i = 0;i < n;i++){scanf("%d",&a[i]);             //通过循环输入数组a的初值}for(i=0;i < n/2;i++){lin = a[i];               //将数组a的第i个数的值赋给变量lina[i] = a[n-1-i];  //将与第i个数关于中心对称的数即第n-i-1个数的值赋给第i个数a[n-1-i] = lin;   //将lin的值赋给第n-i-1个数}for(i = 0;i<n;i++){if(i != n-1)           //当输出的数不是数组的最后一个数时输出数字加空格printf("%d ",a[i]);else                //当输出的数是数组的最后一个数时仅输出数字printf("%d",a[i]);}return 0;
}

5、查找整数 

#include <stdio.h>int main()
{int n,x,i,j=0,a[20];do{scanf("%d %d",&n,&x);}while(n > 20 || n <= 0);            //控制n的范围for(i = 0;i < n;i++){scanf("%d",&a[i]);            //通过循环输入数组a的初值}for(i=0;i<n;i++){if(a[i] == x){printf("%d",i);           //如果数组a中存在x则输出该数j++;                   // j 的初值为0,若存在则j加一,若不存在则j=0}}if(j == 0)                      //若j=0 则说明不存在该数printf("Not Found");return 0;
}

 6、矩阵运算

#include <stdio.h>int main()
{int n,i,j,sum = 0,a[10][10];do{	scanf("%d",&n);}while(n <= 1 || n > 10);            //控制n的范围for(i = 0;i < n;i++){for(j = 0;j < n;j++){scanf("%d",&a[i][j]);            //通过循环输入数组a的初值}}for(i = 0;i < n-1;i++){for(j = 0;j < n-1;j++){if(i + j != n - 1)   // i+j不等于 n-1即为除副对角线、最后一列最后一行的数sum = sum + a[i][j];    //求和}}printf("%d",sum);            //输出和return 0;
}

7、求矩阵各行元素之和 

#include <stdio.h>int main()
{int n,m,i,j,sum[6]={0,0,0,0,0,0},a[6][6];do{scanf("%d %d",&m,&n); }while(n<1 || n>6 || m<1 || m>6);           //控制n和m的范围for(i = 0;i < m;i++){for(j = 0;j < n;j++){scanf("%d",&a[i][j]);           //通过循环输入数组a的初值}}for(i = 0;i < m;i++)                    //共有m行,循环求和m次{for(j = 0;j < n;j++){sum[i] = sum[i] + a[i][j];     //求第i+1行的和并赋值到数组sum的第i个数}printf("%d\n",sum[i]);         //输出各行的和}return 0;
}

 8、字符串逆序

#include <stdio.h>
#include <string.h>int main()
{char ch[81];           //定义字符数组chint i,j,lin,n;gets(ch);              //输入字符数组ch的初值n = strlen(ch);          //n等于ch的长度for(i = 0;i < n/2;i++)     //进行倒序{lin = ch[i];         //将数组ch的第i个数的值赋给变量linch[i] = ch[n-1-i];  //将与第i个关于中心对称的数即第n-i-1个数的值赋给第i个ch[n-1-i] = lin;    //将lin的值赋给第n-i-1个数}puts(ch);        //输出chreturn 0;
}

9、字符串转换成十进制整数 

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
char a[100000];
char b[140000];
int zhuanhuan(char s,int i,int len);      //声明函数zhuanhuan
int main()
{int i = 0,j = 0;int flag = 0;scanf("%s",a);             //输入字符串aint len = strlen(a);          //定义并将a的长度赋值给变量lenwhile(i < len)              //通过循环对字符串a进行逐字符转换{if(flag == 0 && j == 0 && a[i] == '-')   //当第一个字符为“-”时{flag = 1;i++;}if(a[i] >= '0'&&a[i] <= '9')          //当字符为数字时{b[j++] = a[i];
i++;}else if((a[i] >= 'a'&&a[i] <= 'f')||(a[i] >= 'A'&&a[i] <= 'F'))    //当字符为字母时{b[j++] = a[i];i++;}Else                //当字符为其他字符时i++;}int sum = 0;len = strlen(b);i = 0;int m;while(i < len){m = zhuanhuan(b[i],i,len);sum = sum+m;i++;}if(flag == 1&&sum!=0)printf("-");printf("%d\n",sum);              // 输出转换完后的值return 0;
}
int zhuanhuan(char s,int i,int len)       //字符为不同内容时的转换
{if(s >= '0'&&s <= '9')return (s-'0')*pow(16,(len-i-1));if(s == 'a'||s == 'A')return 10*pow(16,(len-i-1));if(s == 'b'||s == 'B')return 11*pow(16,(len-i-1));if(s == 'c'||s == 'C')return 12*pow(16,(len-i-1));if(s == 'd'||s == 'D')return 13*pow(16,(len-i-1));if(s == 'e'||s == 'E')return 14*pow(16,(len-i-1));if(s == 'f'||s == 'F')return 15*pow(16,(len-i-1));return  0;
}

10、字符串循环左移  

#include <stdio.h>
#include <string.h>int main()
{char ch[101];          //定义字符数组chint a,len,temp,i,j;gets(ch);         //输入字符数组ch的初值scanf("%d",&a);         //输入变量a的初值(需要移动的位数)len = strlen(ch);         //变量len等于字符数组ch的长度for(i = 0;i < a;i++)       //循环a次使数组内容左移a次{temp = ch[0];        //把数组ch的第一个值赋给临时变量tempfor(j = 0;j < len - 1;j++)  //利用循环使数组ch第2到第len个值左移一位{ch[j] = ch[j + 1];}ch[len - 1] = temp;        //将temp的值赋给字符数组ch的最后一个值}printf("%s",ch);            //输出移动后的结果return 0;
}

四、实验的分析与思考

1、求最大值及其下标

先定义一个最大值max,并将第一个数的值赋给最大值max,然后利用循环使每一个数字与max进行对比,如果大于max则将其赋值给max,并将其下标赋给变量j。

2、冒泡法排序

先定义一个临时变量lin,并将第一个数的值赋给最大值lin,然后利用循环使每一个数字与下一个数字进行对比,如果前一个数大于后一个数则进行交换。最后输出结果。

3、数组循环左移

定义一个临时变量lin,将第一个值赋给lin,然后将后面的数依次向左移动一位。循环指定次数。

4、将数组中的数逆序存放

以数组中中间的数为中心,将两端的数进行对换。

5、查找整数

定义一个变量,并赋初值为0,当数组中存在要查找的数时该变量加一,若最终该变量为0,则说明不存在该数字。

6、矩阵运算

找出矩阵除副对角线、最后一列和最后一行以外的所有元素之间的关系,然后进行求和。

7、求矩阵各行元素之和

定义一个和的数组,每个元素代表一行的和,分别对每行求和,然后输出。

8、字符串逆序

以字符数组中中间的字符为中心,将两端的字符进行对换。

9、字符串转换成十进制整数

如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数,应首先对其进行判断,然后根据字符类型进行分类,最后转换成十进制数并求和,输出。

10、字符串循环左移

定义一个临时变量temp,将第一个值赋给temp,然后将后面的字符依次向左移动一位。循环指定次字符。

 


http://chatgpt.dhexx.cn/article/CMuTSXsX.shtml

相关文章

C语言学习笔记(kk-zkx)

前言 流行的编程语言编程语言的大致发展历程编程语言应用数据在内存中的储存程序载入内存ASCII编码GB2312和GBKUnicode字符集&#xff08;统一码&#xff0c;万国码&#xff09;就业坑&#xff0c;当心 编程语言&#xff1a;用来控制计算机&#xff0c;让计算机为我们做事情的语…

C语言简介--学前必备知识

关键字 32个关键字&#xff1a; C和C的关系 C 主要在C语言的基础上增加了面向对象和泛型的机制&#xff0c;提高了开发效率&#xff0c;以适用于大中型软件的编写。C支持面向过程编程、面向对象编程和泛型编程&#xff0c;而C语言仅支持面向过程编程。就面向过程编程而言&a…

C语言入门篇——文件操作篇

目录 1、为什么使用文件 2、什么是文件 2.1程序文件 2.2数据文件 2.3文件名 3、文件的打开和关闭 3.1文件指针 3.2文件的打开和关闭 4、文件的顺序读写 5、文件的随机读写 5.1fseek 5.2ftell 5.3rewind 6、文本文件和二进制文件 7、文件读取结束的判定 8、文件…

C语言基础之13:文件输入/输出

Tips1&#xff1a; 函数&#xff1a;fopen()、getc()、putc()、exit()、fclose() fprintf()、fscanf()、fgets()、fputs() rewind()、fseek()、ftell()、fflush() fgetpos()、fsetpos()、feof()、ferror() ungetc()、setvbuf()、fread()、fwrite() 如何使用C标准I/O系列的函数…

01是c语言,01-C语言-简介

一、C语言的起源 1972年&#xff0c;由贝尔实验室的丹尼斯.里奇和肯.汤普逊在开发UNIX系时设计C语言。C语言是在B语言基础上进行设计的。C 语言设计的初衷是将其作为程序员使用的 一种编程工具&#xff0c;因此&#xff0c;其主要目标是成为有用的语言。 二、C语言的特性 设计特…

用C语言实现CLI界面的魔塔游戏

简介 本着开源的精神&#xff0c;我分享下我做的数据结构大作业&#xff0c;我当时选择的是游戏设计题目&#xff0c;由于魔塔基础的机制不太复杂&#xff0c;所以就借着大作业设计了个简易的魔塔游戏。 这是游戏界面&#xff1a; 以下是我当时大作业内容&#xff1a; 我把…

C语言入门(什么是C语言,C语言的编程机制以及一些基础计算机概念)

目录 一.什么是C语言 1.面向对象&#xff1a; 2.面向过程&#xff1a; 二.C语言特点 三.C语言开发时间 四.环境搭建 1.代码编辑器 2.C编译器 五.C语言标准 六.计算机补充知识 1.计算机构成 2.CPU工作 3.编译器 七.编写程序步骤 八.源文件&#xff0c;目标文件&a…

C语言 09.文件

读写文件与printf、scanf关联 printf – 屏幕 – 标准输出 scanf – 键盘 – 标准输入 perror – 屏幕 – 标准错误 系统文件&#xff1a;&#xff08;打开和关闭由系统自动执行&#xff09; 标准输入 – stdin – 0 一旦关闭了&#xff0c;scanf就不可以使用 标准输出 – s…

C语言完整知识体系总结

C语言的知识体系总结 这里写目录标题 C语言的知识体系总结序言&#xff1a;C语言的概述历史、特点、标准&#xff09;1、嵌入式开发为什么选择C语言&#xff1f;&#xff08;面试题&#xff01;&#xff09;2、为什么内核开发选择C语言&#xff1f;3、C语言的缺点&#xff1a;a…

【C语言篇】初识C语言

友情链接&#xff1a;C/C系列系统学习目录 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的…

C语言学习笔记 1

中央处理器&#xff08;CPU&#xff09;: 包括运算器、控制器、寄存器 Enum&#xff1a; Enum: 枚举类型 System函数&#xff1a; 执行系统命令。如pause、cmd、calc、mspaint、notepad..... System(“pause”);//暂停 System(“calc”);//打开计算机 System(“cls”);//…

C语言:文件操作

标题 文件什么是文件&#xff1a; 文件指针文件缓冲区操作文件1.文件的打开与关闭函数2.文本行输入输出函数3.格式化输入输出函数&#xff08;有格式的数据输入到文件中&#xff09;4.二进制输入输出调整文件指针位置6.ftell与rewind7.文件结束的判定 程序退出&#xff0c;内存…

c语言字节写入文件,C语言文件操作

所谓文件(file)一般指存储在外部介质上数据的集合,比如我们经常使用的mp3、mp4、txt、bmp、jpg、exe、rmvb等等。这些文件各有各的用途,我们通常将它们存放在磁盘或者可移动盘等介质中。那么,为什么这里面又有这么多种格式的文件呢?原因很简单,它们各有各的用途,区分就在…

C语言之编程基础

学自C语言中文网 编程基础 一.编程语言二. C语言的地位三.C语言是菜鸟和大神的分水岭三.C语言和C的关系四.数据在内存中的存储五.载入内存&#xff0c;让程序运行起来六.虚拟内存七. ASCII编码 一.编程语言 通过使用某种“语言”的固定格式和固定词汇来控制计算机的行为, 而这…

matlab中的graythresh函数的实例

一个图足以说明所有问题&#xff0c;代码实例加输出结果&#xff0c;说明一个问题&#xff0c;graythresh()函数还是很不错的&#xff01; 如果还想跟精确&#xff0c;就在该阈值的周围在试几组数组&#xff0c;找到自己觉得最优的阈值

基于MATLAB的数字图像分割的研究与实现

1 绪论 1.1 图像分割的研究背景 在一幅目标图像下&#xff0c;人们往往只是关注其中的一个或者几个目标&#xff0c;而这些目标必然会占据一定的区域&#xff0c;并且与周围其他目标或背景在一些特征上会有相应的差别。但是&#xff0c;很多时候这些差别会非常的细微&#xff0…

一天一个小技巧(4)——利用Python和MATLAB进行图片二值化

转载请注明作者和出处&#xff1a;https://blog.csdn.net/qq_28810395 Python版本&#xff1a; Python3.x 运行平台&#xff1a; Windows 10 IDE&#xff1a; Pycharm profession 2019 Matlab2010a 一、前言 由于在一些软件和处理上都仅要求是黑白图片&#xff0c;那么掌握一种…

matlab nlfilter 填充方式,MatLab实验步骤(超杰版)

图像变换--灰度调整、滤波增强---二值化(阈值分割)--形态学处理--特征提取 一&#xff1a;色彩变换&#xff0c;从颜色上控制思考怎样应用灰度的变换、滤波变换减少地物 直方图均衡化histeq自适应均衡化adapthisteq灰度调节(灰度映射)imadjust【直接变换、非线性变换、灰度映射…

基于Matlab车牌自动识别

灰度变换 灰度图是指将黑色和白色以对数的关系分为256阶的图像。灰度化处理就是将彩色图片通过处理转化为灰度图的过程。彩色图像一般由三个独立色组成&#xff0c;R、G、B三个分量分别显示出红、绿、蓝。灰度化处理就是使R、G、B三个分量相等。灰度值为255的点就是白色&#x…

【MATLAB Image Processing Toolbox 入门教程七】“导入、导出和转换”之“图像类型转换Ⅱ——使用阈值法转换为二值图像”

【MATLAB Image Processing Toolbox 入门教程七】 1 imbinarize函数1.1 imbinarize函数使用语法及说明1.2 imbinarize函数参数说明1.3 imbinarize函数使用示例1.3.1 使用全局阈值和局部自适应阈值对图像二值化1.3.2 检测前景比背景暗的图像 2 graythresh函数3 otsuthresh函数4 …