1009 说反话 1010 一元多项式求导

一切都不会好起来的

我写你吗

今天无论是学习c语言还是写题都遇到了非常多的问题,先说题目吧,最后再总结学习内容。

1009 说反话

输入格式:

测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。

输出格式:

每个测试用例的输出占一行,输出倒序后的句子。

输入样例:

Hello World Here I Come

输出样例:

Come I Here World Hello

题解:

#include<stdio.h>
#include<string.h>
int reverse(int num, char* p)
{
	for (int i = 0; i < num / 2; i++)
	{
		char temp;
		temp = p[i];
		p[i] = p[num - 1 - i];
		p[num - 1 - i] = temp;
	}
}
int main()
{
	char p[90];
	gets(p);
	int num = 0;
	int sum = strlen(p);
	for (int i = 0; i<=sum; i++)
	{
		if (p[i] != ' '&& p[i] != '\0')
		{
			num++;
		}
		else
		{
			reverse(num, p+i-num);
			num = 0;
		}
	}
	reverse(sum, p);
	for (int i = 0; p[i] != '\0'; i++)
	{
		printf("%c", p[i]);
	}
}

总结:

第一眼,这不是和昨天那道题一模一样,每个单词单独逆序,最后一起逆序不就ok了,ez。

结果遇到了一大堆问题。

  1. 首先是输入问题。scanf遇到空格就以为自己读完了,必须要用gets,用getchar一个一个读应该也可以,没试。如果是一个一个字符读的,就方便计数,直接gets,就只能用string.h里的strlen函数了。
  2. 字符数组指针传参的问题。一开始我在逆转函数中传递的指针变量写成int *了,因为有一种指针是数字的错觉。但事实上,指针指的什么,就是用什么定义的,在后面的结构体指针中亦有体现。
  3. 给指针debug的过程中,我把reverse函数拿出来单独调试,程序大概写的是这样
int *p = "abcdefg";
reverse(p);

一开始疯狂报错,我没想明白为什么,后来看了这篇博客,恍然大悟。

指针指向字符串时发生了什么? https://blog.csdn.net/liaoruiyan/article/details/39831437

说来王道的龙哥在讲c语言的时候提到过这个问题的,但是我写的时候竟然完全没意识到。
像上文中定义,系统会在内存中的固定字符区域寻找"abcdefg"这个固定过的字符,p只是指向了这个字符,并没有更改他的权限,固我想调整这个字符串中元素的时候,报错了。

但其实我本身的程序是没有这个问题的,因为我是定义了一个数组,把数组的指针给逆转函数了,这个数组是存放在栈内存中的,我有更改他的权限。

1010 一元多项式求导

设计函数求一元多项式的导数。(注:x**nn为整数)的一阶导数为nxn−1。)

输入格式:

以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。

输出格式:

以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0

输入样例:

3 4 -5 2 6 1 -2 0

输出样例:

12 3 -10 1 6 0

题解:

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int a[1500] = { 0 };
	int b[1500] = { 0 };
	int i = 0;
	char input;
	while ((input = getchar()) != '\n')
	{
			ungetc(input, stdin);//将input送回输入流
			scanf("%d", &a[i++]);
	}

	if (a[1] == 0)
	{
		printf("0 0");
	}

	else
	{
		for (int j = 0; j < i; j += 2)
		{
			b[j] = a[j] * a[j + 1];
			b[j + 1] = a[j + 1] - 1;
		}

		if (b[i - 2] == 0)
		{
			for (int k = 0; k < i - 2; k++)
			{
				if (k == i - 3)
				{
					printf("%d", b[k]);
				}
				else {
					printf("%d ", b[k]);
				}
			}
		}
		else
		{
			for (int k = 0; k < i; k++)
			{
				if (k == i - 1)
				{
					printf("%d", b[k]);
				}
				else {
					printf("%d ", b[k]);
				}
			}
		}
	}
}

总结:

这题就更恶心人了,一眼看过去,简单的很。

处理数据确实很简单,恶心人的是读取数据。

只要把题目给的数据存到数组里,一切都迎刃而解了,但是题目并没有给一共有多少个数据。在网上找了一下,先看到了这篇文章

读入未知数量的数字 https://www.cnblogs.com/wd1001/p/4826855.html

第一次知道了,已经getchar吃下的数据,竟然是可以吐出来的。

int ungetc(int char, FILE *stream)//把上一个getchar的数据吐出来

在scanf扫描成数组元素之前,先判断是否会回车号,是回车号说明已经读完了。但是,这个博主的写法,确实能在一串混乱的数据中读取数字,但是是tm读不了负数的啊,一遇到'-'直接就给跳过了,只要把isdigit这个判断函数删了就行了。

在解决了问题后我又看了其他人的写法,立刻觉得自己是个傻逼。

因为pta奇妙的判题机制,是将输出写入文件的啊!我只要读一个数,写一个数,哪有这么多问题。

这个想法之前已经局限了我很多次了,每次写题都先把所有数据存下来,处理,打印出去。事实上,每拿到一个数据,立刻处理打印,能节省无数空间,也会避免无数的问题。

今日总结

龙哥的c语言课有点听不懂了,基础已经看完了,一直到结构体都好像没啥问题。结果一到链表,知识混合起来,经常就反应不过来,我决定pat的题目就到此为止了,明天我自己把链表的增删改查完整的完成一遍,下周开始写PTA数据结构的题目了,和考研的内容更加贴合一点。

不得不说,之前在mooc上看过陈越姥姥的课,当时只看概念和伪代码,觉得就这啊,酱紫简单。现在自己写起来才知道有多难。把下周题目的网址放在这里。

PTA数据结构题目 https://pintia.cn/problem-sets/15/problems/type/7

之前看哈工大李治军老师的操作系统课,老师说操作系统虽然难,但是必须要自己写一遍才能明白,绝知此事要躬行。

只能说我就考研,操作系统应该暂时学不到多深了。但是对于数据结构,在计算机中无处不在的学科,必须要躬行,一行一行写下去。

posted @ 2022-03-19 20:04  huigugu  阅读(54)  评论(0)    收藏  举报