【c语言】五道经典练习题④

这篇具有很好参考价值的文章主要介绍了【c语言】五道经典练习题④。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【c语言】五道经典练习题④ 

目录

①、年月日经过n天后的日期

 ②、坐标排序

③、统计文件中出现某个单词的次数

④、输出含for的行

⑤、比较两个文本是否相等


①、年月日经过n天后的日期

题述:定义包含年月日表示的日期的结构体,写程序实现计算某年某月某日过n天后的日期是哪年哪月哪日

思路:

1、这种题因为关于年了,那就应该判断是闰年还是平年,因为会导致2月的天数不同,闰年2月29天。

2、越界问题,无非是月越界或者年越界,因为过n天,这个n你没有指定范围,那他可以无限大也可以无限小,当天数超过本月应有的天数时,月份应该++,并且n应该减掉本月天数。如果月份>12了,年份应该++,并且再判断,上述过程全放在while循环中,直到n是一个正常的月份天数为止。

#include<stdio.h>

typedef struct date
{
	int year, month, day;
}date;
int main()
{	//闰年二月有29天
	int day[2][13] = { {0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31} };
	date a = { 0 };
	printf("请输入年月日:>\n");
	scanf("%d %d %d", &a.year, &a.month, &a.day);
	int leap = (a.year % 400 == 0) || ((a.year % 4 == 0) && (a.year % 100 == 0));
	int n = 0;
	printf("请输入过多少天:>\n");
	scanf("%d", &n);
	a.day += n;
	while (a.day > day[leap][a.month])
	{//为什么是while循环,因为你输入的天数没有限制范围,他可能很大也可能很小
		a.day -= day[leap][a.month];
		a.month++;
		if (a.month > 12)
		{
			a.month %= 12;
			a.year++;
			//那么年数变了,还要再次判断是否是闰年
			leap = (a.year % 400 == 0) || ((a.year % 4 == 0) && (a.year % 100 == 0));
		}
	}
	printf("经过%d天后为%d年%d月%d日\n",n, a.year, a.month, a.day);
	system("pause");
	return 0;
}

【c语言】五道经典练习题④

 ②、坐标排序

题述:输入n个点,对这些点的x轴坐标排序并输出

思路:关键就是冒泡排序的应用罢了

#include<stdio.h>
typedef struct
{
	int x, y;
}coord;
int main()
{
	int n = 0;
	printf("你想输入几个坐标:>\n");
	scanf("%d", &n);
	coord s[20];
	for (int i = 0; i < n; i++)
	{
		scanf("%d %d", &s[i].x, &s[i].y);
	}
	for (int i = 0; i < n - 1; i++)
	{
		for (int j = 0; j < n - 1 - i; j++)
		{
			if (s[j].x > s[j+1].x)
			{
				int temp = s[j].x;
				s[j].x = s[j+1].x;
				s[j+1].x = temp;
			}
		}
	}
	for (int i = 0; i < n; i++)
	{
		printf("第%d个坐标:(%d,%d)\n", i + 1, s[i].x, s[i].y);
	}
	return 0;
}

【c语言】五道经典练习题④

③、统计文件中出现某个单词的次数

题述:文件in.txt存放了一篇文章,从键盘输入某个单词,请统计文章中这个单词出现的次数并输出

思路:打开读取文章的文件,然后每次从文件中读取一行文本,fgets每次读取一行,并且遇到失败或者读到文件结尾返回NULL,因此不能直接用过fgets的返回值来判断函数是否出错而终止,应借助feof函数或者ferror函数来判断)如果已经读到文件末尾则退出循环。在每一行文本中查找单词出现的位置,如果查找到则统计次数并指向单词后面一个字符的位置继续查找,直到这行文本中不存在单词为止。

#include <stdio.h>
#include <string.h>
#define MAX_LEN 1000 // 假设文章最大长度不超过1000

int main() {
    char word[MAX_LEN]; // 用户输入的单词
    char filename[] = "in.txt"; // 文章文件路径
    char line[MAX_LEN]; // 保存读入的一行文本
    int count = 0; // 统计单词出现次数的变量
    FILE* file = fopen(filename, "r"); // 以只读方式打开文件
    if (file == NULL) {
        printf("Failed to open file '%s'.\n", filename);
        return 1;
    }
    printf("Please input a word: ");
    scanf("%s", word); // 读入一个单词
    while (!feof(file)) { // 循环读取一行文本
        fgets(line, MAX_LEN, file);
        char* p = line;
        while ((p = strstr(p, word)) != NULL) { // 查找单词出现的位置
            count++;
            p += strlen(word); // 指向单词后一个字符的位置
        }
    }
    printf("The word '%s' appears %d time(s) in the article.\n", word, count);
    fclose(file);
    return 0;
}

【c语言】五道经典练习题④

④、输出含for的行

题述:输出文件中含字符串"for"的行

思路:这道题是第③道题的变形,但是这道题有两种方法。

法一、与③同样的方法,调用strstr

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

#define N 888
int main()
{
	FILE* fp = fopen("a.txt", "r");
	if (fp == NULL)
	{
		printf("文件打开错误!\n");
		exit(0);
	}
	char s[N];
	while(!feof(fp))
	{
		fgets(s, N, fp);//一次读取一行
		char *p = s;//一个为了保存一个为了遍历
		if (strstr(p, "for") != NULL)
		{
			printf("%s", s);
		}
	}
	return 0;
}

法二、循环遍历一行的方法

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

#define N 888
int main()
{
	FILE* fp = fopen("a.txt", "r");
	if (fp == NULL)
	{
		printf("文件打开错误!\n");
		exit(0);
	}
	char s[N];
	while(!feof(fp))
	{
		fgets(s, N, fp);//一次读取一行
		if (strlen(s) >= 3)
		{
			for (int i = 0; i < strlen(s) - 2; i++)
			{
				if (s[i] == 'f' && s[i + 1] == 'o' && s[i + 2] == 'r')
				{
					printf("%s", s);
				}
			}
		}
	}
	return 0;
}

【c语言】五道经典练习题④

⑤、比较两个文本是否相等

题述:比较两个文本是否相等:比较两个文本文件内容是否相等,并输出两个文件中第一次不相同字符内容行号及列值。

思路:

1、我们可以一个一个字符比较,故用fgetc函数,那么循环终止条件应该是两个中有一个文件读到了文件尾

2、如果其中有一个文件读到了'\n',说明要换行,那么对应的列也要发生变化

3、如果读到的字符不相等有两种情况:要么就是有一个文件,或者两个文件都读到了文件尾标志EOF,要么就是字符不相等,并不是因为结束标志,这种情况需要打印行号和列号。

4、因为读到EOF和字符确实不相等的情况都会跳出循环,那我们就要判断,到底是因为读到结束标志了还是因为字符确实不相等。

#include <stdio.h>

int main( ) 
{
	FILE* fp, * fp1;
	int col1 = 1, row1 = 1, col2 = 1, row2 = 1;//两个文件内容行和列肯定都是从1开始的
	char ch1, ch2;
	//test与test1都是与当前程序在同一目录下的文件
	fp = fopen("test.txt", "r");
	fp1 = fopen("test1.txt", "r");
	while (!feof(fp) || !feof(fp1)) 
	{//循环继续的条件一定是两个文件都没读到文件尾
		ch1 = fgetc(fp);
		ch2 = fgetc(fp1);
		if (ch1 == '\n') 
		{
			row1++;//如果读到了换行,说明行数要++
			col1 = 1;//换行后列数还要是1
		}
		if (ch2 == '\n')
		{
			row2++;
			col2 = 1;
		}
		if (ch1 != ch2) 
		{
			if (ch1 == EOF || ch2 == EOF) break;//如果其中一个文件结束了,就跳出循环,因为不相等包括结束的情况
			printf("test\t行号:%d 列号:%d\n", row1, col1);//按要求,如果两个文件都没有结束的,就打印出行和列
			printf("test1\t行号:%d 列号:%d\n", row2, col2);
			break;//不相等就没有必要继续往下比了
		}
		else
		{
			col1++; col2++;//相等就列值++
		}
	}
	if (ch1 == EOF && ch2 != EOF)//能比到EOF说明之前一定有字符是相等的
		printf("test文件内容被包含在test1中");
	if (ch2 == EOF && ch1 != EOF)
		printf("test1文件内容被包含在test中");
	if (ch1 == EOF && ch2 == EOF)
		printf("两个文件完全相同!");
	fclose(fp);
	fclose(fp1);
	fp = fp1 = NULL;
	return 0;
}

【c语言】五道经典练习题④

 文章来源地址https://www.toymoban.com/news/detail-497445.html

到了这里,关于【c语言】五道经典练习题④的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL基础篇 | 经典三十四道练习题

    ✅作者简介:大家好我是@每天都要敲代码,希望一起努力,一起进步! 📃个人主页:@每天都要敲代码的个人主页 🔥系列专栏:MySQL专栏 目录 1. 取得每个部门最高薪水的人员名称 2. 哪些人的薪水在部门的平均薪水之上 3. 取得部门中(所有人的)平均的薪水等级 4. 用不同的

    2024年02月01日
    浏览(44)
  • 蓝桥杯python比赛历届真题99道经典练习题 (61-70)

    【程序61】 题目:打印出杨辉三角形(要求打印出10行如下图) 1.程序分析: 【程序62】 题目:学习putpixel画点。 1.程

    2024年02月03日
    浏览(44)
  • 10 SQL进阶 -- 综合练习题 -- 10道经典SQL题目,配套数据与解答

    点击下方链接直接下载 创建数据表脚本:http://tianchi-media.oss-cn-beijing.aliyuncs.com/dragonball/SQL/create_table.sql 执行建表语句 执行成功 查看创建的表 点击下方链接直接下载 插入数据脚本:https://tianchi-media.oss-cn-beijing.aliyuncs.com/dragonball/SQL/data.zip 大家下载好脚本后,先在MySQL环境中运

    2024年04月27日
    浏览(39)
  • C语言之练习题

    欢迎来到我的: 世界 希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 ! 这期文章由:两题问答题+四道编程题;小孩在文章中写有详细解题思路,感谢大家支持支持。 思路: 首先我们要知道 x=x(x-1) 的含义; 假设x=3;也就是 011 ; 而x-1=2;是 010 ;

    2024年02月10日
    浏览(58)
  • C 语言练习题更新

    目录(先不要看答案,首先自己做才能更好的领悟,做不来没关系) 题目一:有 1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位、十位、个位的数字都是 1、2、3、4,组成所有的排列后再去掉不满足条件的排列。 题目

    2024年02月14日
    浏览(45)
  • 习题练习 C语言(暑期)

    今天为大家分享我暑假期间所练习的一些小题目! 相信大家看完之后都会有所提升的! 加油! 以下不正确的定义语句是( ) A: double x[5] = {2.0, 4.0, 6.0, 8.0, 10.0}; B: char c2[] = {‘x10’, ‘xa’, ‘8’}; C: char c1[] = {‘1’,‘2’,‘3’,‘4’,‘5’}; D: int y[5+3]={0, 1, 3, 5, 7, 9}; 题目解

    2024年02月10日
    浏览(53)
  • 习题练习 C语言

    首先我们要了解什么是offsetof宏: . 此具有函数形式的宏返回数据结构或联合类型中成员成员的偏移值(以字节为单位)。 . 返回的值是size_t类型的无符号整数值,其字节数位于指定成员与其结构开头之间。 什么意思呢,可以看到下面这张图片: 下面我们来看到这一习题:

    2024年02月14日
    浏览(49)
  • C语言习题练习

    首先我们要了解什么是offsetof宏: . 此具有函数形式的宏返回数据结构或联合类型中成员成员的偏移值(以字节为单位)。 . 返回的值是size_t类型的无符号整数值,其字节数位于指定成员与其结构开头之间。 什么意思呢,可以看到下面这张图片: 下面我们来看到这一习题:

    2024年02月15日
    浏览(52)
  • 【C语言】练习题整理:11

    今天是10道选择题 下面代码段的输出结果是: -12 自右至左的结合方向称为“右结合性”。最典型的右结合 性运算符是赋值运算符。 如x=y=z,由于“=”的右结合性,应先执行y=z,再执行x=(y=z)运算。 C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。 计算顺序是

    2024年02月11日
    浏览(46)
  • C语言之数组练习题

    第1关:数组插入元素 300 任务要求 参考答案 评论106 任务描述 相关知识 数组 数组元素的表示方法 编程要求 测试说明 任务描述 本关需要你将一个数插入到一组已经排好序的数组并输出。 相关知识 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式

    2024年02月05日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包