什么叫有条件的累加?
主要是依靠循环,一般形式是一个在循环里面遍历,另一个只有达到一定的条件才会累加(移动到下一个变量),从言语也能看出来,主要是用在字符串和数组里面的,毕竟链表都是一块一块的随便拆,达到条件拆出来就行,干嘛有条件的累加呢?没办法,谁让数组在内存栈里面是连续的(谁让人家是爷呢),还是不懂也不要着急,后面一看例子你就懂了
具体实现:
一般就是给一个条件,然后是两个数组,一个负责保存输入的值,一个负责保存符合条件的值,还有两个循环变量,一个遍历输入的,一个负责向保存符合条件的值输入那个值
适合解决什么问题?
数组、字符串等连在一起的东西,如果需要拆分或者进行一些所谓的缩进处理
练习
一个针对数字数组,一个针对字符串
练习1
本关任务:从键盘读入 n 个整数放入数组中,删除数组中所有值为 0 的元素,其后元素向数组首端移动。输出删除后数组中元素的个数并依次输出数组元素。
这里连带着讲解定义数组、用循环处理数组
定义数组,我们说过,C是老登,不能自己生成动态数组,所以开辟的空间(中括号里面的数)不能是变量,必须是固定的(但是现在编译器以C++为准,这么干也行,但是考试会扣分😅)
所以有一个解决办法,就是在开头定义一个量为一个长度,这样方便修改(伪变量)
然后确保n<N就行了,可以是100或者更大的数,取一部分开辟的空间填入内容,其余开辟出来了内容为空就行
然后就是循环输入,给要用的每一个位置的数组填上输入的内容(比较固定)
然后就是条件循环,也是比较固定,先给答案
#include<stdio.h>
#define N 100
int main()
{/*********Begin*********/int i,j=0,n;int a[N];int b[N];int count=0;scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&a[i]);}for(i = 0; i < n; i++) {if(a[i] != 0) {b[j++] = a[i];count++; }}printf("%d\n",count);for(i=0;i<count;i++){printf("%d ",b[i]);}/*********End**********/ return 0;
}
这又是i又是j的在干什么,李在赣神魔?
i就是那个管遍历输入的数组的
j就是管把符合条件的输入到另一个数组的
这就是有条件的累加,是不是有点入门了,有内味了?经典的死活想不出来但十分简单的逻辑,其实正常,一九八几年有的c语言,四十年左右C语言早被玩明白了,所以不要自己和自己较劲“这么简单(其实并不),怎么我就是想不出来”,太正常了,这都是几代人的指智慧结晶,所以你只要见过理解记下来就行,至于在什么时刻去用,这就要练习练出那种感觉
这里有个容易犯得错误,打印的时候i<count,不能i<n,因为符合条件的值可能小于n,那我第二个数组都没有n个数,哪给你找去?(电脑:哎!我给你来一碗铁牛数据面!)然后就开始乱弄了。
i<n(错误的)
i<count(正确的)
这里的count就是计数器,用来记录几次变化,代表着输入了几个符合条件的值
练习2
删除一个字符串里面的所有空格
直接上答案
#include <stdio.h>
#include <string.h>#define N 100 int main() {char text[N]; char noSpaceText[N]; int i, j = 0; // 读取一行文本fgets(text,N, stdin);for (i = 0; text[i] != '\0'; i++) {if (text[i] != ' ') {noSpaceText[j++] = text[i]; }}noSpaceText[j] = '\0'; // 在字符串末尾添加空字符,标记字符串结束printf("%s\n", noSpaceText);return 0;
}
我们在bug专篇里面讲过,别忘了字符串的结尾要'\0',要不又是计算机乱填东西
不处理结尾下场
我还想问计算机怎么回事呢,结果计算机先问上我了(�)
总结
我们学习了(纯人机式总结)
1、怎么输入输出数组
2、有条件的累加
3、计数器用来记录变化次数
4、一堆梗
以上均是本人理解,如有不对欢迎各位大佬在评论区指出~
经典期末周破防