考研机试c语言总结

  • while 如果要判断一个相等的条件,就用 ==

  • char *s = “xxxx”char s[] = "xxx" 是有区别的,后者,在函数进行参数传递时,可以用 s[i] ;而前者不能用,会出现报错使用未分配的空间。

  • #include<string.h> 中的 strlen 函数,所求的长度不包含 '\0' ;而 sizeof 所求的长度则包含 '\0';所以sizeof 所求的长度比 strlen 所求的长度多1。

  • 打印字符串时,采用的时 %s 可直接把字符串打印出来(以 \0 作为结尾)。

  • 字符串的输入:

    //当要输入一个不知道长度的字符串或者数字时,采用此方法。
    char str[100];
    scanf ("%s",str); //采用%s直接输入字符串,并且str直接表示地址。
    
    int l = strlen (str); //算出字符串的长度。
    int sum = 0;
    for (int i = 0;i < l; i++){  //计算各个位数的和
        sum = sum + str[i] - '0'; //把字符型格式转换为整数型。 “  - '0' ”
    }+ '0'” 是转换为字符
    
    
  • 字符串进行传递:

    int strStr(char* haystack, char* needle) {
        //如第二条所说,可以使用haystack[i]和needle[i]
    }
    
    int main (){
        char haystack[] = "sleetcode";  //字符串用“”  字符用‘’
        char needle[] = "co";
        printf ("%d",strStr(haystack,needle))
        return 0}
    
  • 输入带有空格的数字串

    while (1){
            scanf ("%d",&A[num]);
            num ++;
            char c = getchar(); //获取键盘的输入
            if (c == '\n'){
                break;
            }//if
        }//while
    
  • 输入带有空格的字符串

    char str[1000];
    scanf ("%[^n]",str); //"%[]"表示的含义
    //或者可以用
    gets(str);
    scanf ("%[^]]",str); //表示当输入到]时停止输入,如果没有加^则表示只输入【】内有的,如果碰到没有的就结束输入。
    //gets下运用strlen
    int len = strlen(str);
    for (int i = 0;i <= len;i++){
    	//这样才能遍历数组,一定要注意有=!!!
    }
    
  • 交换两个变量的值(结构体也是同样的操作)

    void swap (int *a,int *b){
        int temp;
        temp = *a;
        *a = *b;
        *b = temp;
    }
    int main (){
        int a,b;
        swap (&a,&b);
        return 0;
    }
    
  • c语言结构体可以直接交换

    typedef struct student {
        long id;
        int dgrade; //德分
        int cgrade; //才分
        int all; //总分
    } student;
    
    void swap(student s[], int i, int j) {
        student a;
        a = s[i];
        s[i] = s[j];
        s[j] = a;
    }
    
  • 注意格式#define N 10000 ; 保留两位小数 printf("%.2f",N)

  • c语言用->或者 . 的区别:在C语言中,"->“用于访问指向结构体的指针变量的成员,而”."用于访问结构体变量的成员。

    具体来说,当你有一个指向结构体的指针时,可以使用"->"来访问该结构体的成员。例如:

    cstruct Person {
        char name[20];
        int age;
    };
    
    struct Person p1;
    struct Person *ptr = &p1;
    
    ptr->age = 30;
    

    在上面的例子中,我们定义了一个结构体Person和一个指向Person结构体的指针ptr,然后使用"->"来给age成员赋值。

    而当你直接使用结构体变量而不是指针时,应该使用"."来访问结构体的成员。例如:

    cstruct Person p2;
    
    p2.age = 25;
    

    总的来说,当需要通过指针访问结构体成员时,应该使用"->“;当直接操作结构体变量时,应该使用”."。

  • c语言函数传递地址的方法

    //定义栈
    typedef struct {
        int a[max];
        int tag;
        int size;
    } Stack;
    
    //初始化栈
    void Init_Stack(Stack *S) { //根据上条,指针要用->
        S->tag = -1;
        S->size = 0;
    }
    
    int main() {
        Stack S;
        Init_Stack (&S); //注意调用方式
    }
    
    
    
    //在c++的情况下进行函数的参数传递,如果需要返回,则加上&;
    #include <bits/stdc++.h>
    #define max 100 
    using namespace std;
    //定义栈
    typedef struct {
        int a[max];
        int tag;
        int size;
    } Stack;
    //初始化栈
    void Init_Stack(Stack &S) { //根据上条,指针要用->
        S.tag = -1;
        S.size = 0;
    }
    int main() {
        Stack S;
        Init_Stack (S); //注意调用方式
        cout << S.size << " " << S.tag << endl;
    }
    
  • c语言保留小数和前面自动补零的操作

    printf ("%.2f",a);//结果保留两位小数,且可以四舍五入
    printf ("%02d",a);//结果两位,如果不够两位整数则自动在数字前补0
    printf ("%08.4f",a);//表示打印出小数点后一共4位,且共8位(包括小数点),不够8位则用0填充
    
  • c语言的按照格式输入

    scanf ("%d/%d/%d",&a,&b,&c); //是按照xxx/xxx/xxx的格式进行输入
    
  • c语言字符的ASCII码 A~Z:65~90;a~z:97~122.

    //不用硬记,直接可以输出
    printf ("%d",'a'); //输出97
    
    char a = 'a';
    char s = a - 32; // 小写转换为大写字母减去32
    int s = a - 32;//表示整数 97-32 = 65;
    char s = 65; //表示ascii为23的字符
    printf ("%c",s); //这样会输出A
    printf ("%d",s); //这样会输出65
    
    s = 6 + '0';//表示字符“6” 注意:这里采用的是字符型,所以两位数如“65” 会发生错误,因为s只能存贮一个字符
    printf ("%c",s); //这样会输出6
    printf ("%d",s); //这样会输出54
    
    
  • 已知一个字母的ASCII码,来转换为字母

    int ascii;
    char s = (char)ascii;  //强制类型转换
    printf ("%c",s);
    
  • c语言有关字符串的比较和赋值

    #include <string.h>
    //str1 = str2   则返回0,str1 > str2  则返回大于0的值,str1 < str2  则返回小于0的值
    int strncmp(const char* str1, const char* str2, size_t num);
    //strcmp 和 strncmp的区别在于,前者可以指定比较位数,而后者不能指明位数,但是可以采用改变送入的指针而进行比较后几位
    int strcmp(const char* str1, const char* str2)
    //以下为例子
    int main (){
        char s[6] = {"asdfgd"};
        char str[6] = {"asdasd"};
        int a1 = strcmp(s,str);//比较s和str是否相等
        int a2 = strcmp(&s[3],&str[3]);//比较s和str的后3位是否相等
        int a3 = strncmp(s,str,3)//比较s和str的前3位是否相等
            
        strncpy(s,str,3);//复制前3位  把str复制到s中
        strcpy(s,str); //全部复制
        return 0;
    }
    
    #include <string.h>
    //前面的为复制到的目的数组,后面为被复制的数组
    char *strncpy(char *dest, const char *src, size_t n) //赋值前n位
    char *strcpy(char *dest, const char *src) //全部赋值
        
    
  • c语言在进行小数输入时,应该尽量使用double,不用float,因为double更加的精准。

    double d;
    scanf ("%lf",&d);
    printf ("%f",d);
    
  • 当输入一串字符,切当输入“换行”时结束,可以词用如下方式:

    char c,str[100];
    for (int i = 0;(c = getchar ()) != '\n');){
    	scanf ("%s",str);
    }
    //下面为进阶版本,输入要求:三行数据,每一行任意长度,并且只取输入[x]中的x为有效值,并且每个x大小不一样,为字符串
    char str[3][10][5] = {'\0'}; //表示字符为空,可以用 *(str[i][j]) != '\0',来判断是否为空
        int num[3] = {0}; //用来纪律每行为多少元素
        char c;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; (c = getchar()) != '\n';) {
                if (c == '[') { //当输入有'['时,开始输入
                    scanf("%[^]]", str[i][j++]); //'^]'表示输入到直到碰到]结束
                    num[i]++;  //用来记录每一行多少个元素
                }
            }
        }
    
  • atof() 把字符串数组,转换为双精度浮点数(double)。在stdlib.h 函数库里

  • pat 1058 选择题 的输入问题,可以复习查看,复杂情况的输入。

  • 字符串的比较:

    #include <string.h>
    //逐个字符进行比较
    int strcmp(char *str1,char *str2);//如果一样就返回0;str1>str2就返回1;否则返回-1
    
    #include <malloc.h>
    //注意添加头文件
    
    LList *L = (LList*)malloc(sizeof (LList));
    
  • c语言生成随机数

    #include <stdlib.h>
    #include <time.h>
    
    int main (){
        int a;
        srand((unsigned)time(NULL)); //作为种子
        a = rand(); //生成随机数
        return 0;
    }
    
  • c语言二维数组初始化赋值时:

    int a[100][100] = {0}; //只有0时,可以这样初始化,表示所有的元素都是0
    	a[100][100] = {99}; //只表示a[0][0] 为99,其他元素全部为0;
    //赋值只能采用双重循环
    
  • c语言的小细节

    scanf ("%d",&n);
    gets(s); //这样的话,会直接结束,因为scanf 是不读取回车的,然而gets是碰到回车就结束的。
    		//解决方案就是在scanf 后面加上一个getchar()用来抵消掉空格
    
    //long long 的使用 int 的范围在-1e9到1e9,long long的范围-1e18到1e18
    long long x;
    scanf ("%lld",&x);
    printf ("%lld",x);
    
    
  • c++的语法,很多时间可以相互使用文件后缀为 xxx.cpp

    include <bits/stdc++.h>
    using namespace std;
    
    //cin 和 cout的使用
    string a,b;
    cin >> a >> b;
    a = a+b;
    cout << "a + b 之后的值" << a;
    
    //输入二位字符数组时,不要用%c一个一个的输入,因为回车也算是一个字符,会发生错误
    //正确输入:
    for (int i = 0;i < n;i++){
        scanf ("%s",str[i])
    }
    
    //采用sort函数进行排序
    int a[10];
    sort (a,a+10);//默认是从小到大排序,第一个参数为第一个数的起始地址,第二个参数为最后一个数的地址+1
    
    //__gcd 的用法  gcd是求最大公约数,最小公倍数为lcm = a*b / (最大公约数)
    用gcd的时候记得加上两个 _ 
    
  • c++的map函数

    //map用来映射
    map <string,int> dict;  //目录为string类型(字符串),而输出为int类型整形,而此映射的名字为M;
    dict["Tom"] = 1;
    dict["Jack"] = 2;
    if (dict.count("Tom") != M.end()){
    	count >> "Tom": >> dict.count;
    }
    

    例题:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

#include <bits/stdc++.h>
using namespace std;

typedef struct student {
	string id;
	string name;
	string sex;
	int year;
}student;

int main (){
	int n;
	cin >> n;
	map <string,student> M;
	for (int i =0 ;i<n;i++){
		student s;
		cin >> s.id >> s.name>>s.sex>>s.year;
		M[s.id] = s;
	}
	int m;
	cin >> m;
	for (int i = 0;i < m;i++){
		string ha;
		cin >> ha;
		if ((M.find(ha))!= M.end()){
			cout << M[ha].id << " " << M[ha].name << " " << M[ha].sex << " "<< 		                 M[ha].year; 
		}
	}
	return 0;
} 
  • 在c++中求字符的长度应该为

    string str;
    cin >> str;
    int leng = str.length(); //用来求string的长度,char的长度还是用strlen求。
    
    //使用map的计数功能时,如果计数要变动时,直接使用M[x] 即可,不需要使用count,这样会引起错误,无限循环。
    map <char,int> M;
    M[str[i]] ++;
    
    while (M[str[i]] > 0){
    	cout << str[i];
        M[str[i]] --;
    }
    
  • ​ 判断两个字符串是否相等有如下集中情况

    string a;
    char b[10];
    //要判断a和b是否相等
    if (strcmp (b,a.c_str()) == 0){ //要用.c_str(),转换为str类型
    	....
    }
    
    string a,b;
    //判断string类型的直接进行比就可以了
    if(a == b){
    	....
    }
    
  • c++ 报错:[Error] reference to 'count' is ambiguous 时,修改变量的名称,因为可能函数模块已经有这个变量的名称了。

  • 递归实现,带有回溯的经典例题:

    用递归实现,显示用1分、2分和5分的硬币凑成1元,一共有多少种方法。

    #include <bits/stdc++.h>
    using namespace std;
    
    int str[3] = {5,2,1};
    int cont = 0;
    
    void func (int sum,int n,int k){
    	if (sum > n){
    		return;
    	}
    	else if (sum == n){
    		cont ++;
    		return;
    	}
    	else {
    		for (int i = k;i < 3;i++){
    			sum = sum + str[i];
    			func (sum,100,i);
    			sum = sum - str[i];
    		}
    	}
    }
    
    int main (){
    	cont = 0;
    	func (0,100,0);
    	cout << cont << endl;
    }
    
  • sums问题:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

    注意:答案中不可以包含重复的三元组。

    示例:

    给定数组 nums = [-1, 0, 1, 2, -1, -4]
    满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]

    解题思路:先对数组进行排序,然后采用三个指针,low,mid,high。每次当low和mid定的时候,这次输出的三元组就一定唯一,所以每次low和mid更新时,都要检查,是否和前一个元素相同。如果相同,则输出的三元组一定重复。所以,low和mid进入循环时,应该检查不能和前面一个low-1和mid-1相同,当然第一个0和mid 的初始化(mid = low + 1)不用检查和前面的元素。

    cont = 0;
    func (0,100,0);
    cout << cont << endl;
    }

    
    
  • sums问题:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

    注意:答案中不可以包含重复的三元组。

    示例:

    给定数组 nums = [-1, 0, 1, 2, -1, -4]
    满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]

    解题思路:先对数组进行排序,然后采用三个指针,low,mid,high。每次当low和mid定的时候,这次输出的三元组就一定唯一,所以每次low和mid更新时,都要检查,是否和前一个元素相同。如果相同,则输出的三元组一定重复。所以,low和mid进入循环时,应该检查不能和前面一个low-1和mid-1相同,当然第一个0和mid 的初始化(mid = low + 1)不用检查和前面的元素。

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值