将 a 数组中相同的数据删得只剩一个,然后以每行 4 个数据的格式输出 a 数组。

可能会有疑问的点:想要删除数组中的相同数据,为什么要从最后两项开始,这个也很好理解,如果从头开始删,还要把后面的元素移位置补前面的位置,但是如果直接从后面开始删相同元素,就不需要上述的步骤了。

补充%4d的知识:这个4即输出四位整形数,不够4位右对齐。

# define M 10
main()
 { int a[M],i,j,n;
 
      for(i=0;i<M;i++)
     scanf("%d",a+i);
     n=i=M-1;//从最后两项开始比 

 while(i>=0)
 { 
   if(*(a+i)==*(a+i-1))//从最后两项开始比较
     {
       for(j=i; j<=n;j++) 
       *(a+j-1)=* (a+j ); //让后一项赋值给前第二项,即删除了后一项 
       n--; 
   i--;   
 }
 for(i=1;i<=n+1;i++)
 {
   printf("%4d",*(a+i-1));
   if(i%4==0)//四个元素为一行进行打印
    printf("\n");
}
 printf("\n");
 
}

运行结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构与算法 排序算法 内排序 八大基础排序 选择排序 简单选择排序 思想 每次选择最大的数插入到末尾 做法 外层for循环控制次数 内层for循环找出最大的值的角标 找出最大角标后,进交换 优化思路 同时获取最大值和最小值,然后分别插入数组的首部和尾部 堆排序 思想 使用大顶堆的思想来排序,每次建堆后交换 做法 总体:建堆-替换 建堆 只要左子树或右子树大于当前根节点,则替换 替换后会导致下面的子树发生了变化,因此同样需要进比较,直至各个节点实现父>子这么一个条件(递归) 交换排序 冒泡排序 思想 每次俩俩交换,将最大值交换到末尾 做法 外层for控制循环次数 内层for控制比较次数 每次循环之后,比较次数都会减少一次 优化思路 如果一趟排序后没有发生位置变化,那么此时就是有序了 快速排序 思想 每次将比支点小的放在支点左边,比支点大的放在支点右边 做法 外循环while只要i和j不碰撞查找 内层两个while循环分别查找出比支点小的和比支点大的角标 如果i<=j满足条件,就交换 一趟排序后,支点的左边都比支点小,支点右边都比支点大 只要满足L<j,i0的条件查找出要插入的何时位置 退出内层while循环后就找到了合适的位置插入 优化思路 二分查找插入,找合适位置的时候使用二分查找算法 希尔排序 思想 用增量来将数组分隔,直到增量为1。底层干的还是插入排序干的活 做法 最外层for外循环控制增量的数量,每次/2 第二层for循环控制每次增量那组开始进插入排序,直至完毕 第三层while循环找到要插入到哪个位置 归并排序 思想 将两个已排好序的数组合并成一个有序的数组 做法 递归拆分出两个有序的数组,从mid的位置开始拆分,递归出口:只有一个值的时候就不用拆分了 合并两个有序的数据 分别往两个数组填充已有序的数据 比较两个数组的值谁小,谁小就放到我们的数组 如果比较完之后还有余的数据,那么用while直接添加到我们的总数组 优化思路 当递归到规模足够小时,利用插入排序 归并前判断一下是否还有必要归并 只在排序前开辟一次空间 基数(桶)排序 思想 分配,回收(分配到不同的位置上,然后回收)..不断分配..回收来进排序,直到有序 做法 分配一个[array.length][10列]的二维数组来装我们的元素 最外层for循环控制要分配和回收的次数(根据最大值) 将元素的个、十、百位依次放到桶子上(第一次就是放个位,第二次放十位) 依据每列回收桶子,两个for循环 外排序 查找算法 二分查找 分块查找 哈希查找 贪心算法 求最小生成树的Prim算法和Kruskal算法 爬山问题 回溯算法 n皇后问题 动态规划Dynamic Planning 应用 求最长公共子序列LCS 矩阵连乘问题 爬楼梯问题 找零问题 0-1背包问题 分治算法Divide and Conquer 应用:归并排序 其它 Rabin fingerprints 文件指纹算法 BitMap 位图算法 BloomFilter 布隆过
解除C语言实训烦恼 “计算机能力强化实训”(C语言)任务书 一、实训目的 C语言程序设计是本科工科类各专业的重要基础课,主要学习程序设计的基本概念和方法,通过本门课程学习,使学生掌握C语言的基本原理,熟练掌握程序设计的基础知识、基本概念;掌握程序设计的思想和编程技巧。 实训是在学生已经具备了使用C语言编写简单的应用程序的能力,为使学生对C语言有更全面的理解,进一步提高运用C语言编程解决实际问题的能力,通过提出算法、指定输入输出来设计一个解决方案。并为参加计算机等级考试作准备。 二、实训的基本内容和要求 参加实训的学生,应当认真完成实训的全部内容。最终提交实训成果来证明其独立完成各种实际任务的能力。从而反映出理解和运用本课程知识的水平和能力。具体如下: 1、代码编写规范,形成良好的编程习惯; 2、程序须有一定的健壮性和必要的提示信息,考虑问题的多种可能和边界数据。 3、提交实训报告电子稿、装订的打印稿。实训报告内容包括以下几个方面:  程序的总体设计和算法分析。  程序流程图、函数说明  源程序代码清单  测试数据和测试过程记录  遇到的问题及解决方法分析  实训小结 4. 程序运方式 构建一个简易菜单,形如: 用户通过输入数值选择所需运的子程序,当一个子程序运结束后回到菜单界面,直至用户输入0后退出程序。 5.实训选题 每人至少做6题,题目如下(每人的题目由任课老师安排) (1)编写一个程序实现如下功能:一个整型数组有10个元素,除所有值为n的元素。要求: ① 主函数完成n的输入,数组元素输入以及除后数组元素的输出。 ② 除功能用子函数完成。 (2)编写一个程序实现如下功能:输入10个学生5门课程的成绩,分别用函数求:①每个学生的平均分;②每门课程的平均分;③找出最高的分数所对应的学生和课程。 若输入2个学生的成绩,其运结果如下图所示。 (3)编写一个程序实现如下功能:找最长的单词。设输入的英文短文不超过一(假设正文最后有“.”结束,以“,”或空格分隔,不出现其他符号),编程将所有单词输出,并求其最长单词的长度,并将该单词输出。 (4)编写一个程序实现如下功能:有8位裁判为1个运动员打分,请计算并输出去掉一个最高分和一个最低分后这个运动员的平均得分以及所评分最接近平均分的裁判员号。裁判员号及其所打分数从键盘输入,假设裁判员号为整数,所打分数为实数。 (5)编写一个程序实现如下功能:从键盘输入字符(最多为80个),遇到回车键输入结束,将输入的字符串按奇偶位置拆分,奇数位上的字符在前,偶数位上的字符在后,重新组成新的字符串输出,例如输入: ab12cd3456fg,则经过程序处理后输出: a1c35fb2d46g 。 (6)功能说明:编写程序,实现以下成绩处理功能(输出格式参见示例): 1)输入n和n个成绩(成绩为浮点数类型,数组名记为a,假设1≤n≤50); 2)计算并输出成绩的累加和(记为sum)与平均成绩(记为ave),将≥ave的成绩归为A档,将<ave的成绩归为B档; 3)分别统计A、B两档的人数,计算在总人数的比率; 4)求出A档学生的最低分和B档学生的最高分,它们与平均成绩的差值; 运示例: 输入:9 55.5 99.5 50.0 90.0 88 59.5 48 60 78.0 输出: Sum=628.5, Ave=69.8 A: 4,44.4% B: 5,55.6% MinA: 78.0,+8.2 MaxB: 60.0,-9.8 说明:输入的第1个数表示学生人数(n=9),接着输入的9个成绩,累加和为628.5(所有小数均保留一位小数输出),平均分为69.8分;平均分以上(A档)有4人,占44.4%,平均分以下(B档)有5人,占55.6%;A档的最低分为78分,超出平均分8.2分,B档的最高分为60分,距离平均分还有9.8分的差距。 (7)功能说明:编写程序,通过以下步骤验证一个正整数对是否符合特定的编码规则: 1)输入正整数a与b; 2)计算a的所有不同的质因子(包括1)之积,记为s; 3)如果s等于b,则通过验证,输出“OK”,否则输出“Err”。 输出格式参见以下示例。 运示例1: 输入:588 42 输出:588: 1*2*3*7=42, OK 说明:输入数为588(对应a)和42(对应b),588的质因子为1、2、3和7,其累乘结果为42(对应s),由s等于b(均为42),输出OK。 运示例2: 输入:17 55 输出:17: 1*17=17, Err(17!=55) 说明:质因子为1和17,乘积仍为17,不等于b(55),输出Err,及不通过原因“(17!=55)”。 (8)编写一个程序实现如下功能:从字符串除指定的字符。同一字母的大、小写按不同字符处理。 例:若程序执时,输入字符串为:Shanghai Dianji University,从键盘上输入字符:s,则输出后变为:Shanghai Dianji Univerity,如果输入的字符串不存在,则字符串照原样输出。 (9)编写一个函数void fun(char a[],int k,int n),其功能是:除字符串指定下标开始的n 个字符。其,a放字符串,k存放指定的下标。 例如,字符串内容为:Hellollo World!,k值为:5,n的值为:3,则调用该函数的结果为:Hello World!。 (10)编写一个程序实现如下功能:调用名为tj的函数,求一个二维数组正数、负数的代数和,以及零的个数。 (11)编写一个程序实现如下功能:调用一个名为gm的函数,该函数实现简单的加密。加密方法如下:先定义一张字母加密对照表: 原字母 a b c d e i k , w 加密后字母 d w k , i a b c e 将需要加密的一文字输入加密程序,程序根据加密表的对应关系,可以简单地将输入的文字加密输出,对于表未出现的字符则不加密。 运示例: 输入:lajgdike,w 输出:ldjg,abice (12)编写程序验证以下说法:输入一个4位数,该数个、十、百、千位上的数互不相等,由个、十、百、千位上的数组成一个最大数和一个最小数,最大数-最小数,构成一个新的4位数。反复以上运算,使其最终结果为:6174。 要求如下(下面的函数名为建议函数名): ① 用函数 int IsNumberEqual(int number) 检查输入的整数number各数码是否互不相等,全相等返回值为1否则为0; ② 用函数(void ntos (int number, int c[]) )把四位数整数number各位数码分别存入数组c ③ 用函数( void sort (int a[ ] )对4个元素的数组a排序(升序或降序都可以); ④ 由输入整数分解排序后的数组得到最大值和最小值: int getmaxn(int a[ ]) 返回值为最大值 int getminn(int b[ ]) 返回值为最小值 (13)函数 fun 的功能是:计算正整数num的各位上的数字之积。例如,若输入:252,则输出应该是:20。若输入:202,则输出应该是:0。 (14)函数 fun 的功能是:用插入排序法将n个字符进排序(降序)。(提示: 插入法排序的思路是:先对数组的头两个元素进排序, 然后根据前两个元素的情况插入第三个元素,再插入第四个元素…)。 (15)爱因斯坦数学题。爱因斯坦曾出过这样一道数学题:有一条长阶梯,若每步跨2阶,则最后下1阶,若每步跨3阶,则最后下2阶,若每步跨5阶,则最后下4阶,若每步跨6阶,则最后下5阶,只有每步跨7阶,最后才正好1阶不。请问,这条阶梯共有多少阶? (16)猜数游戏 在这个实验,我们将尝试编写一个猜数游戏程序,这个程序看上去有些难度,但是如果按下列要求循序渐进地编程实现,会发现其实这个程序是很容易实现的。那么,现在就开始吧,先编写第1个程序,然后试着在第1个程序的基础上编写第2个程序,…… 程序1 编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,则计算机给出提示“Right!”,否则提示“Wrong!”,并告诉人所猜的数是大(Too high)还是小(Too low),然后结束游戏。要求每次运程序时机器所“想”的数不能都一样。 程序2 编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,则结束游戏,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平;否则计算机给出提示,告诉人所猜的数是太大还是太小,直到人猜对为止。 程序3 编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,则结束游戏,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平;否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10次,如果猜了10次仍未猜的话,结束游戏。 程序4 编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平,则结束游戏;否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10次,如果猜了10次仍未猜的话,则停止本次猜数,然后继续猜下一个数。每次运程序可以反复猜多个数,直到操作者想停止时才结束。 (17)给小学生出加法考试题 编写一个程序,给学生出一道加法运算题,然后判断学生输入的答案对错与否,按下列要求以循序渐进的方式编程。 程序1 通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!”,否则显示“Not correct! Try again!”,程序结束。 程序2 通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!”,否则显示“Not correct! Try again!”,直到做对为止。 程序3 通过输入两个加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!”,否则提示重做,显示“Not correct! Try again!”,最多给三次机会,如果三次仍未做对,则显示“Not correct! You have tried three times! Test over!”,程序结束。 程序4 连续做10道题,通过计算机随机产生两个1~10之间的加数给学生出一道加法运算题,如果输入答案正确,则显示“Right!”,否则显示“Not correct!”,不给机会重做,10道题做完后,按每题10分统计总得分,然后打印出总分和做错的题数。 (18)学生成绩统计 从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现下列功能: 1)统计不及格人数并打印不及格学生名单; 2)统计成绩在全班平均分及平均分之上的学生人数,并打印这些学生的名单; 3)统计各分数段的学生人数及所占的百分比。 提示:可考虑用两个一维数组实现学生成绩和学生信息的存储。 (19)歌手大赛评分 某歌手大赛,共有十个评委给选手打分,分数采用百分制,去掉一个最高分,去掉一个最低分,然后取平均分,得到歌手的最后成绩。 (20)统计 输入一字符,以回车键作为结束标志,分别统计出大写字母、小写字母、空格、数字和其它字符的个数。 (21)求 的值,其a是一个数字,如2+22+222+2222+22222(此时a=2,n=5),a和n均由键盘输入。 (22)读入一批正整数(以零或负数为结束标志),求其的奇数和。 (23) 利用泰勒级数sin(x)≈ 计算sin(x) 的值。要求最后一项的绝对值小于10-5,并统计出此时累加了多少项(x由键盘输入)。 (24)最大值、最小值及其交换 输入一个正整数n (1<n<=10),再输入n 个整数,输出最大值极其下标(设最大值惟一,下标从0 开始)。 输入一个正整数n (1<n<=10),再输入n 个整数,将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的n 个数。 (25)抓住肇事者 一辆卡车违反交通规则,撞人后逃跑。现场共有三个目击者,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是个数学家,他说,四位车号刚好是一个整数的平方。请根据以上线索帮助警方找到车号。 (26)百钱百鸡问题 国古代数学家张丘建在他的《算经》提出了一个著名的“百钱百鸡”问题:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问翁、母、雏各几何。 (27)有一堆鱼,由A、B、C、D、E五人先后进分配。A第一个到来,他将鱼平分作5份,把多余的一条扔回湖,拿走自己分好的一份回家去了;B第二个到来,也将鱼平分为5份,扔掉多余的一条,只拿走自己分好的一份;接着C、D、E依次到来,也按同样的方法分鱼。问这堆鱼共有多少条?每个人到来时看到的鱼数是多少条? (28)约瑟夫环问题:编号为1,2,3,...,n的n个人按顺时针方向围坐一圈,每人持有一个正整数密码。一开始任选一个正整数m作为报数上限值,从第一个人开始按顺时针报数,报到m时停止,报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计程序求出出列顺序。 (29)某公司在传输数据过程为了安全要对数据加密,若传递的是四位的整数,对其进加密的规则为:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。如:输入数字7659,则加密后的数字为4012 (30) 将十进制正整数用除n取余法转换为n进制数输出。(n从键盘输入) (31)从键盘输入一字符,统计其有多少单词,假设单词之间以逗号分隔。 (32)从键盘输入一字符串,放在字符数组a,将字符数组a下标值为偶数的元素按从小到大排序。 (33)编写程序输出以下杨辉三角形(要求输出10)。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 … … … … … … (34)编写程序查找数值18在以下二维数组第一次出现的位置。 3 4 5 18 8 12 16 54 43 34 18 7 (35)设有44列的数组a,其元素a[i][j]=3*i+2*j-6。编写程序,实现如下功能: ① 求第二4元素的累加和; ② 求第四列4元素的平均值; ③ 求主对角线4元素负数的个数。 (36)编写程序输出100~1000内的可逆素数。可逆素数是指:一个素数将其各位数字的顺序倒过来构成的反序数也是素数。如157和751均为素数,它们是可逆素数。要求调用两个子函数实现。 (37)输入一数字字符存入字符数组str[80],用num[10]数组元素作为计数器来统计每个数字字符的个数。用下标为0的元素统计字符“0”的个数,用下标为1的元素统计字符“1”出现的次数,……。输出每个奇数字符出现的次数。 (38)假设数组a有44列的随机整数,计算每的平均值,保留两位小数,然后输出平均值和每的最大值。 (39)输入一字符串,分别统计字符串各元音字母(AEIOU)的个数(不分大小写)。 (40)编写程序计算并输出:1 + 12 + 123 + 1234 + …… 的前n(设0<n<10)项的和,n从键盘输入。 例如输入:3,则输出:136 又如输入:6,则输出:137171 (41)功能说明:函数fun求sum=d+dd+ddd+……+dd...d(n个d),其d为1-9的数字。从主函数输入d和n,调用fun函数,并以sum=XXXXXXX的形式输出结果。 如输入d=3,n=4 则输出:sum=3702 (42)随机产生N个数,按升序排序,然后在其查找数据k,若找到,显示查找成功的信息,并将该数据除;若没有找到,则将数据k插入到这些数,插入操作后数据仍然有序。 (43)编写一个程序实现如下功能:有4名学生,每个学生信息包含学号、姓名、数学成绩、英语成绩、C语言成绩和三门课程的总分,并对数据输入和输出。 (44) 编写一个程序实现如下功能:定义一个点的结构数据类型,实现下列功能:①为点输入坐标值。②求两个点点坐标。③求两点间距离。 (45)编写一个程序实现如下功能:建立一个单链表,每个结点数据要有职工号、工资。用一个creat函数来建立链表,用list函数输出数据数据自定)。 (46)编写一个程序实现如下功能:有5个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stud”。 (47) 编写一个程序实现如下功能:将一个整形ASCII码文件FileA.txt复制到ASCII码文件FileB.txt。 FileA.txt FileB.txt 10 11 12 13 14 15 10 11 12 13 14 15 20 21 22 23 24 25 20 21 22 23 24 25 30 31 32 33 34 35 30 31 32 33 34 35 (48)编写一个程序实现如下功能:有一个整数文件(二进制文件),读取其的数值,如果为奇数加一;如果为偶数,减一,存放到新的文件去。 (49)从键盘输入若干字符,将其存入“s8”磁盘文件,再从文件读取这些字符,将其的大写字母转换成小写字母后输出到屏幕显示。 (50)以下程序从文件“student.txt”读取学生的学号、姓名、平时成绩和考试成绩,再从键盘上输入一个成绩,将所有考试成绩达到或超过该成绩的学生数据写到新的文本文件“studentD.txt”。文件的最后一为0表示学生数据结束。 设文件student.txt的内容为 101 Zhao 95 58 103 Qian 75 81 105 Sun 99 91 107 Li 80 67 0 运时键盘输入:80 则生成新文件studentD.txt的内容为: 103 Qian 75 81 105 Sun 99 91 0 例示说明:student.txt考试成绩在80分以上的Qian与Sun信息写到studentD.txt 三、课程设计的进度安排 熟悉文件内容 1天 整体设计和详细设计、编代码 1天 编代码、调试和测试  1天 实训报告书写 1天 演示软件   1天 四、指导书、参考资料 谭浩强著 《C程序设计》(第四版) 清华大学出版社 夏耘 吉顺如主编 《大学程序设计(C)实践手册》 复旦大学出版社 六、其他 附件为实训报告封面样张
【问题描述】 一只猴子在X天一共吃了Y个桃子。已知这只猴子每天最多吃10个桃子,最少可以不吃桃子。问一共有多少种不同的吃法。 例如:X=3,Y=4时(即3天吃4个桃子)一共有下面列出的15种不同吃法 1 :0 0 4 2 :0 1 3 3 :0 2 2 4 :0 3 1 5 :0 4 0 6 :1 0 3 7 :1 1 2 8 :1 2 1 9 :1 3 0 10 :2 0 2 11 :2 1 1 12 :2 2 0 13 :3 0 1 14 :3 1 0 15 :4 0 0 【问题分析】 这个题目比较好的解决方法是用递归。 我们定义一个递归函数eat( x, y )表示在x天之内吃y个桃子。那么具体定义为: 1、如果x=0且y=0,表示当前已经搜索到的是一种可的解法,需要把该解法输出。 2、如果x>0且y>0,表示还没有搜索完,那么就要按下面的方法继续递归: for ( i = 0 ; i <= 10 ; i++ ) eat( x-1, y-i ) ; 这里的i相当于是该天吃桃子数量的探索值。但是由于可以在后面的几天里面一个桃子也不吃(见上面的5、9、12、14、15这几种情况),也就是说只要没有到最后一天(x=0),就需要继续向下搜索,所以x>0且y>0的条件是不完备的,应该是x>0且y>=0。 3、其它情况(如x<0或y<0,x=0且y>0等)为非法情况或表明当前解不成立,故要返回。 由此可以写出eat函数的伪代码: void eat( int x, int y ) { if ( x > 0 && y >= 0 ) for ( i = 0 ; i <= 10 ; i++ ) eat( x-1, y-i ) ; else if ( x == 0 && y == 0 ) 输出当前解; return ; } 【程序代码】 根据上述思路,我们可以比较容易地写出下面的程序。不过,这里有几个地方经过了修改: 1、为了便于结果的输出,所以使用了一个全局整型数组arr来存放当前解。 2、为了便于对arr数组的下标进管理,给eat函数增加一个参数idx,标识出当前的空余位置(把探索的解i放在该位置)。 3、虽然每天最多吃10个桃子,但是如果当前情况下不够10个桃子,那么在进for( i = 0 ; i <= 10 ; i++ )这个循环时,有些i值就是不必要的。所以程序设立了一个i_end变量,如果当前情况下余的桃子总数y多于10个,那么i_end取10;如果少于10个,那么就让i_end等于y。这样可以减少不必要的循环与递归。 #include <stdio.h> #define DAY 3 #define PEACH 4 int arr[DAY] ; long int times ; FILE *fp ; void eat( int day, int peach, int idx ) { if ( day > 0 && peach >= 0 ) { int i, i_end ; i_end = ( (peach<10) ? (peach) : (10) ) ; for ( i = 0 ; i <= i_end ; i++ ) { arr[idx] = i ; eat( day-1, peach-i, idx+1 ) ; } return ; } else if ( day == 0 && peach == 0 ) { int i ; times++ ; fprintf( fp, "%-10ld:", times ) ; for ( i = 0 ; i < DAY ; i++ ) fprintf( fp, "%-3d ", arr[i] ) ; fprintf( fp, "\n" ) ; return ; } else return ; } int main( void ) { int day, peach ; day = DAY ; peach = PEACH ; times = 0 ; fp = fopen( "monkey.txt", "w" ) ; /* 打开用于保存结果的文件 */ eat( day, peach, 0 ) ; fclose( fp ) ; /* 关闭文件 */ return( 0 ) ; }
第1章 C语言概述 1 1.5 参照本章例题,编写一个C程序,输出以下信息: 1 1.6 写一个程序,输入a,b,c三个值,输出最大者。 1 第2章 程序的灵魂——算法 2 2.1 什么叫结构化的算法?为什么要提倡结构化的算法? 2 2.7 什么叫结构化程序设计?它的主要内容是什么? 2 第3章 数据类型、运算符与表达式 2 3.3请将下面各数用八进制和十六进制数表示: 2 3.4将以下三各整数分别赋给不同类型的变量,请画出赋值后数据在内存的存储形式。 2 3.5字符常量和字符串常量有什么区别? 3 3.6写出以下程序运的结果: 3 3.7要将“China”译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。例如,字母“A”后面第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre”。请编一程序,用赋初值的方法使c1,c2,c3,c4,c5这5个变量的值分别为’C’,’h’,’i’,’n’,’a’,经过运算,使c1,c2,c3,c4,c5的值分别变为’G’,’l’,’m’,’r’,’e’,并输出。 4 3.8例2.6能否改成如下: 4 3.9求下面算术表达式的值。 4 3.10写出程序运的结果。 5 3.11写出下面赋值的结果。格写了数值的是要将它赋给其他类型的变量,将所有空格填上赋值后的数值。 5 3.12 出下面表达式运算后a的值,设原来a=12。设a和n都已定义为整型变量。 5 第4章 最简单的C程序设计——顺序程序设计 6 4.4 若a=3,b=4,c=5,x=1.2,y=2.4,z=-3.6,u=51247,n=128765,c1=’a’,c2=’b’,想得到以下的输出格式和结果,请写出程序(包括定义变量类型和设计输出)。 6 4.5请写出下面程序的输出结果: 7 4.6 用下面的scanf函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1=’A’,c2=’a’。问在键盘上如何输入? 7 4.7下面的scanf函数输入数据,使a=10,b=20,c1=’A’,c2=’a’,x=1.5,y=-3.75,z=67.8,请问在键盘上如何输入数据? 8 4.8圆半径r=1.5,圆柱高h=3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积。用scanf输入数据输出计算结果,输出时要求有文字说明,取小数点后2位数字。请编程序。 8 4.9输入一个华氏温度,要求输出摄氏温度,公式为C=(5/9)(F-32) 9 输出要有文字说明,取2位小数。 9 第5章 选择结构程序设计 10 5.2语言如何表示“真”和“假”?系统如何判断一个量的“真”和“假”? 10 5.3写出下面各逻辑表达式的值。设a=3,b=4,c=5。 10 5.4有3个整数a,b,c,由键盘输入,输出最大的数。 10 5.5有一函数: 11 5.6给出一百分制成绩,要求输出成绩等级’A’、’B’、’C’、’D’、’E’。90分以上为’A’,80~89分为’B’,70~79分为’C’,60~69分为’D’,60分以下为’E’。 12 5.7给定一个不多于5位的正整数,要求:①求它是几位数;②分别打印出每一位数字;③按逆序打印出各位数字。例如原数为321,应输出123。 13 5.8企业发放的奖金根据利润提成。利润I低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元(100000<I≤200000)时,其10万元按10%提成,高于10万元的部分,可提成7.5%;200000 <I≤400000时,其20万元仍按上述办法提成(下同),高于20万元的部分按5%提成;400000<I≤600000时,高于40万元的部分按3%提成;6000001000000时,超过100万的部分按1%提成。从键盘输入当月利润I,求应发放奖金总数。 14 5.9输入4个整数,要求按由小到大的顺序输出。 16 5.10有4个圆塔,圆心分别为(2,2),(-2,2),(2,-2),(-2,-2),圆半径为1。见图4.4。这4个塔的高度分别为10m。塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为0)。 16 第6章 循环控制 17 6.1输入两个正整数m和n,求其最大公约数和最小公倍数。 17 6.2输入一字符,分别统计出其英文字母,空格,数字和其它字符的个数。 18 6.3 18 6.4求∑n!(即求1+2!+…+20!)。 19 6.5求 19 6.6打印出所有的“水仙花数”。 20 6.7一个数如果恰好等于它的因子之和,这个数就称为“完数“。例如,6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程序找出1000以内的所有“完数”,并按下面的格式输出其因子:6 Its factors are 1,2,3 20 6.8有一分数序列: 23 6.9一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第10次落地时,共经过多少m?第10次反弹多高? 23 6.10猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天下的一半零一个。到第10天早上再想吃时,见只一个桃子了。求第一天共摘多少桃子。 24 6.11用迭代法求 24 6.12用牛顿迭代法求方程2x3-4x2+3x-6=0在1.5附近的根。 25 6.13用二分法求方程2x3-4x2+3x-6=0在(-10,10)之间的根。 26 6.14打印出以下图案: 27 6.15两个乒乓球队进比赛,各出3人。甲队为A、B、C3人,乙队为X、Y、Z3人。已抽签决定比赛名单。有人向队员打听比赛名单。A说他不和X比,C说他不和X、Z比。请编程找出3对赛手的名单。 28 第7章 数组 28 7.1用筛法求100之内的素数。 28 7.2用选择法对10个整数排序(从小到大)。 30 7.3求一个3×3矩阵对角线元素之和。 31 7.4有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组。 32 7.5将一个数组的值按逆序重新存放。例如原来顺序为:8,6,5,4,1。要求改为:1,4,5,6,8。 34 7.6打印出以下的杨辉三角形(要求打印出10)。 35 7.7输出魔方阵。所谓魔方阵是指这样的方阵(方阵的阶数应为奇数),它的每一、每一列和对角线之和均相等。 36 7.8找出一个二维数组的鞍点,即该位置上的元素在该上最大,在该列上最小。也可能没有鞍点。 38 7.9有15个数按从小到大的顺序存放在一个数组。输入一个数,要求用折半查找法找出该数是数组第几个元素的值。如果该数不在数组输出“不在表”。 39 7.10有一篇文章,共有3文字,每有80个字符。要求分别统计出其英文大写字母,小写字母,数字,空格以及其它字符的个数。 41 7.11打印以下图案: 42 7.12有一电文,已按下面规律译成密码: 43 7.13编一个程序,将两个字符串连接起来,不要用strcat函数。 45 7.14编一个程序,将两个字符串s1和s2进比较。如果s1>s2,输出一个正数;s1=s2,输出0;s1<s2,输出一个负数。不要用strcmp函数。两个字符串用gets函数读入。输出的正数或负数的绝对值应是相比较的两个字符串相应字符的ASCII码的差值。例如,’A’与’C’相比,由于’A’<’C’,应输出负数,由于’A’与’C’的ASCII码的差值为2,因此,应输出”-2”。同理:’’And’’和”Aid”比较,根据第2个字符比较结果,’n’比’i’大5,因此应输出’5’。 45 7.15编写一个程序,将字符数组s2的全部字符拷贝到字符数组s1,不用strcpy函数。拷贝时,’\0’也要拷过去,’\0’后面的字符不拷贝。 46 第8章 函数 47 8.1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个整数由键盘输入。 47 8.2 47 8.3写一个判素数的函数,在主函数输入一个整数,输出是否素数的信息。 49 8.4写一函数,使给定的一个二维数组(3×3)转置,即列互换。 49 8.5写一函数,使输入的一个字符串按反序存放,在主函数输入和输出字符串。 50 8.6写一函数,将两个字符串连接。 51 8.7写一函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字之间有一个空格。如输入1990,应输出”1 9 9 0”。 52 8.8编写一函数,有实参传来一个字符串,统计此字符串字母,数字,空格和其它字符的个数,在主函数输入字符串以及输出上述的结果。 52 8.10写一函数,用“起泡法”对输入的10个字符按由小到大的顺序排列。 54 8.11用弦截法求根。 55 8.12输入10个学生5门课的成绩,分别用函数求:(1)每个学生的平均分;(2)每门课的平均分;(3)找出最高的分数所对应的学生和课程;(4)求出平均分方差; 57 8.13写几个函数:(1)输入10个职工的姓名和职工号;(2)按职工号由小到大排序,姓名顺序也随之调整;(3)要求输入一个职工号,用折半查找法找出该职工的姓名。 61 8.14写一函数,输入一个十六进制数,输出相应的十进制数。 64 8.15给出年,月,日,计算该日是该年的第几天。 65 第9章 预处理命令 66 9.1定义一个代参数的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。 66 9.2输入两个整数,求它们相除的余数。用带参的宏来实现,编程序。 67 9.3 67 9.4给年份year定义一个宏,以判断该年份是否为闰年。 68 9.5请分析以下一组宏所定义的输出格式: 68 9.6请设计输出实数的格式。实数用“6.2f”格式输出。 69 9.7分别用函数和带参的宏,从3个数找出最大数。 70 9.8试述“文件包含”和程序文件的连接(link)的概念,二者有何不同? 71 9.9用条件编译法实现以下功能: 71 第10章 指针 72 10.1输入3个整数,按由小到大的顺序输出。 72 10.2输入3个字符串,按由小到打的顺序输出。 73 10.3输入10个整数,将其最小的数与第一个数对换,把最大的一个数与最后一个对换。写3个函数:(1)输入10个数;(2)进处理;(3)输出10个数。 74 10.4有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成前面m个数。 75 写一函数实现以上功能,在主函数输入n个整数,并输出调整后的n个数。 75 10.5有一字符串,包含n个字符。写一个函数,将此字符串从第m个字符开始的全部字符复制成为另一个字符串。 76 10.6输入一文字,找出其大写字母,小写字母,空格,数字及其他字符各有多少。 77 10.7写一个函数,将一个3×3的矩阵转置。 77 9.8将一个5×5的矩阵最大的元素放在心,4个角分别放在4个最小的元素(按从左到右,从上到下的顺序,依次从小到大存放),写一个函数实现之,并用main函数调用。 78 10.9在主函数输入10个等长的字符串。用另一个函数对它们排序,然后在主函数输出这10个已排好序的字符串。 80 10.10用指针数组处理上一题目,字符串不等长。 81 10.11将n个数按输入输出顺序的逆序排列,用函数实现。 82 10.12有一个班4个学生,5门课。(1)求第一门课的平均分;(2)找出有两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均成绩;(3)找出平均成绩在90分以上或全部课程成绩在85分以上的学生。分别编3个函数实现上3个要求。 83 10.13输入一个字符串,内有数字和非数字字符,如: 86 10.14写一函数,实现两个字符串的比较。即自己写一个strcmp函数,函数原型为: 88 10.15编写一个程序,打入月份号,输出该月的英文月名。例如,输入”3”,则输出”March”,要求用指针数组处理。 89 10.16用指向指针的指针的方法对5个字符串排序并输出。 89 10.17用指向指针的指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。n和正整数在主函数输入。最后在主函数输出。 90 第11章 结构体与共用体 91 11.1定义一个结构体变量(包括年,月,日)。计算该日在本年是第几天,注意闰年问题。 91 11.2写一个函数days,实现上面的计算。由主函数将年,月,日传递给days函数,计算后将日数传回主函数输出。 93 11.3编写一个函数print,打印一个学生的成绩数组,该数组有5个学生的数据记录,每个记录包括num,name,score[3],用主函数输入这些记录,用print函数输出这些记录。 95 11.4在上题的基础上,编写一个函数input,用来输入5个学生的数据记录。 97 11.5有10个学生,每个学生的数据包括学号,姓名,3门课的成绩,从键盘输入10个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号,姓名,3门课成绩,平均分数)。 97 11.6编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针(地址),指向字符串开始的空间。new(n)表示分配n个字节的内存空间。 100 11.7写一函数free,将上题new函数占用的空间释放free(p)表示将p(地址)指向的单元以后的内存段释放。 101 11.8已有a,b两个链表,每个链表的结点包括学号,成绩。要求把两个链表合并,按学号升序排列。 101 11.9有两个链表a和b,设结点包含学号,姓名。从a链表去与b链表相同学号的那些结点。 104 11.10建立一个链表,每个结点包括:学号,姓名,性别,年龄。输入一个年龄,如果链表的结点所包含的年龄等于此年龄,则将此结点去。 106 第12章 位运算 109 12.1编写一个函数getbits,从一个16位的单元取出某几位()即该几位保留原值,其余位为0)。函数调用形式为: 109 12.2写一个函数,对一个16位的二进制数取出它的奇位数(即从左边起第1,3,5,…,15位)。 109 12.3编一程序,检查一下你所用的计算机系统的C编译在执右移时是按照逻辑位移的原则,还是按照算术右移的原则。如果是逻辑右移,请编一函数实现算术右移;如果是算术右移,请编一函数实现逻辑右移。 110 12.4编一函数用来实现左右循环移位。函数名为move,调用方法为:move(value,n) 112 其value为要循环位移的数,n为位移的位数。如n0为右移。如n=4,表示要右移4位;n=-3,表示要左移3位。 112 第13章 文件 113 13.3从键盘输入一个字符串,将其的小写字母全部转换成大写字母,然后输出到一个磁盘文件”test”保存。输入的字符串以”!”结束。 113 13.4有两个磁盘文件“A”和“B”,各存放一字母,要求把这两个文件的信息合并(按字母的顺序排列),输出到一个新文件“C”。 114 13.5有5个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud。 115 13.7将上题已排序的学生成绩文件进插入处理。插入一个学生的3门课成绩,程序先计算新插入学生的平均成绩,然后将它按平均成绩高低顺序插入,插入后建立一个新文件。 122 13.8将上题的结果仍存入原有的stu_sort文件而不另建立新文件。 123 13.9有一磁盘文件emploee,内存放职工的数据。每个职工的数据包括:职工姓名,职工号,性别,年龄,住址,工资,健康状况,文化程度。要求将职工名和工资的信息单独抽出来另建一个简明的职工工资文件。 125 13.10从上题的“职工工资文件”去一个职工的数据,再存回原文件。 127
### 回答1: ```python def fun(arr): n = len(arr) if n < 2: return n j = 0 for i in range(1, n): if arr[i] != arr[j]: j += 1 arr[j] = arr[i] return j + 1 ``` 测试: ```python arr = [1, 2, 2, 3, 3, 3, 4, 5, 5] print(fun(arr)) # 输出:5 print(arr[:5]) # 输出:[1, 2, 3, 4, 5] ``` ### 回答2: 定义函数fun如下: ```python def fun(arr): if len(arr) == 0: # 如果数组为空,直接返回0 return 0 count = 1 # 初始化计数器为1,表示至少会有一个不重复的数 prev = arr[0] # 用prev保存当前不重复的数 for i in range(1, len(arr)): if arr[i] != prev: # 如果当前数与prev不相等,表示它是一个新的不重复的数 count += 1 # 计数器加1 prev = arr[i] # 更新prev为当前数 return count # 返回除后数组数据的个数 ``` 函数的思路是遍历一维数组,如果当前数与前一个数不相等,则计数器加1并更新prev为当前数。遍历结束后,计数器的值即为除后数组数据的个数。 例如,数组arr为[1, 2, 2, 3, 3, 3, 4, 5, 5],调用fun(arr)会返回5,表示除后的数组为[1, 2, 3, 4, 5],其下5个不重复的数。 ### 回答3: 编写函数如下: ```python def fun(arr): if not arr: return 0 n = len(arr) count = 1 # 初始数量为1 for i in range(1, n): if arr[i] != arr[i-1]: # 如果当前数与前一个数不相同 arr[count] = arr[i] # 将当前数放入索引为count的位置 count += 1 return count ``` 函数的arr表示输入的一维数组,通过遍历数组,将不相同的数依次放入数组的前部分,最后返回余的元素个数count即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值