【C語言進階】題目練習

目錄

1.箭形圖案

思路:?

代碼:

2. 公務員面試

分析:

代碼 :

3. 判斷結構體大小(1)

答案:

分析:

4.判斷結構體大小(2)

答案:

分析:

5.宏定義+計算位段大小的選擇題

分析:?

答案:

6.位段與指針

分析:

答案:

7. 結構體大小判別

分析:?

答案:

8.聯合體的大小

分析:

答案:

9.大小端字節序

分析:

答案:

10.枚舉選擇題

答案:

11. 編程題:找出只出現一次的數字

分析1:

代碼1:

思路2:

代碼2:

12.atoi的實現

13.文件讀寫的選擇題(1)

14.看代碼說功能

15.?文件讀寫的選擇題(2)

16.預處理的選擇題

17.預處理的分析題

18.feof函數的選擇題

19.宏替換的選擇題(1)

20.宏替換的選擇題(2)

21.寫一個宏將一個整數的二進制位的奇數和偶數進行交換

思路:


1.箭形圖案

KiKi學習了循環,BoBo老師給他出了一系列打印圖案的練習,該任務是打印用“*”組成的箭形圖案。

輸入描述:

本題多組輸入,每行一個整數(2~20)。

輸出描述:

針對每行輸入,輸出用“*”組成的箭形。

輸入

2

輸出

    ***
******

思路:?

? ? ? ? 可以把圖形分為上下兩部分,如果輸入n上面就是n行,下面就是n+1行;

上半部分:n行

空格:第一行有四個空格,第二行有兩個空格,我們可以把2個空格當做一組,第一行打印兩組,第二行打印一組;每一行需要遞減,所以內部循環減去外面的行數。

*:和行數有關,第一行是一個,第二行是兩個。

下半部分:n+1行

空格:兩個空格為一組,第一行是0組空格,第二行是1組空格,第三行是2組空格,就是行數-1。

*:第一行是3個*,第二行是2個*,第3行是1個*,每次從n+1開始,需要再減去行數。

代碼:

#include<stdio.h>int main() 
{int n = 0;while(scanf("%d",&n)){
// 上半部分for (int i = 0; i < n; i++){for (int j = 0; j < n - i; j++){printf("  "); // 先打印空格,兩個為一組}for (int k = 0; k <= i; k++) // 第一行一個*,第二行兩個*,跟行號有關{printf("*");}printf("\n");}// 下半部分for (int i = 0; i < n + 1; i++){// 空格for (int j = 0; j < i; j++){printf("  ");}for (int k = 0; k < n + 1 - i; k++){printf("*");}printf("\n");}}return 0;
}

2. 公務員面試

描述

公務員面試現場打分。有7位考官,從鍵盤輸入若干組成績,每組7個分數(百分制),去掉一個最高分和一個最低分,輸出每組的平均成績。

(注:本題有多組輸入)

輸入描述:

一行,輸入7個整數(0~100),代表7個成績,用空格分隔。

輸出描述:

一行,輸出去掉最高分和最低分的平均成績,小數點后保留2位,每行輸出后換行。

示例1

輸入:

99 45 78 67 72 88 60

輸出:

73.00

分析:

? ? ? ? 本身的邏輯不難,難的是如何oj,我們之前是每次讀取一個數字,我們這道題可以一次讀取一個數字,也能讀取一個數字。

? ? ? ? 若讀取一個數字,我們需要一個變量n來記錄讀取數字的個數,每次讀取n需要++;

? ? ? ? 定義最大最小值并設立處置,每次讀取一個數字就需要判斷是否是最大或者最小值,以此保證最小最大值保持更新,一旦n ==7,說明數字夠了,就開始計算平均值,需要將這些變量進行重新初始化以待下一次實例的調用。

代碼 :

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>int main() {int score = 0;int max = 0;int min = 100; int n = 0;int ret = 0;while (scanf("%d", &score) == 1) {n++;if(score > max){max = score;}if (score < min ) {min = score;}ret += score;if (n == 7) {printf("%.2lf\n",(ret - min - max)/5.0);n = 0;ret = 0;max = 0;min = 100;}}return 0;
}

3. 判斷結構體大小(1)

判斷以下兩個結構體的大小:

#include<stdio.h>struct A 
{int a;short b;int c;char d;
};struct B 
{int a;short b;char c;int d;
};int main() 
{struct A a = { 0 };struct B b = { 0 };printf("%d\n",sizeof(a)); // 16printf("%d\n",sizeof(b)); // 12return 0;
}

答案:

16,12

分析:

A:a占4個字節偏移量0-3;b占2個字節,對齊數是2,偏移量是4-5;c占4個字節,偏移量是4,6不是4的倍數,所以偏移量是8-11;最后一個d是占1個字節,所以偏移量是12;總共占用13個字節,13不是最大對齊數(4)的倍數,那么最近的倍數是16;

B:?a占4個字節偏移量0-3;b占2個字節,對齊數是2,偏移量是4-5;c占1個字節,偏移量是6;d占4個字節,最小對齊數是4,7不是4的倍數,所以偏移量是8,占用8-11;總共占用12個字節,12是最大對齊數的倍數,所以答案是12;

4.判斷結構體大小(2)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#pragma pack(4) // 4字節對齊
struct S1
{short a; // 0-2char d; // 3long b; // 4-7 long c;// 8-11 
};struct S2
{long b;// 0-3short c;// 4-5char d;// 6long a;// 8-11 
};
struct S3
{short c;// 0-1long b;// 4-7char d;// 8long a;// 12-15
};
int main() 
{printf("%d\n", sizeof(struct S1));printf("%d\n", sizeof(struct S2));printf("%d\n", sizeof(struct S3));}

答案:

12 12 16

分析:

見注釋,這里需要注意的是32位系統重long占4個字節。

5.宏定義+計算位段大小的選擇題

分析:?

①首先需要判斷位段占用的bit位數,首先第一個成員變量開辟一個字節的空間,8bit,第一個成員+第二個成員用了6bit,剩余2bit,此時第三個成員變量需要1個字節,需要單獨開辟,第四個成員變量雖然只需要1bit,但仍然要開辟1字節,總共3字節。

②注意宏定義:3* 2 + 3 = 9

答案:

D

6.位段與指針

分析:

? ? ? ? 首先定義一個char類型的數組,有四個元素;定義一個位段指針指向這個數組;將數組全部初始化為0,;

? ? ? ? 位段的第一個成員是占用1個字節,剩下三個成員占用一個字節,所以這個位段整體占用兩個字節。

? ? ? ? 需要給成員賦值,第一個成員賦值為2,8bit足以存下;

第二個成員只有1bit需要存3,所以只能取低1位bit位;

第三個成員只有2bit需要存4,所以只能取低2位bit位;

第四個成員只有3bit需要存5,剛好可以存下。

此時內存分布如下圖所示:

此時按照16進制打印兩位來輸出每一個字節那么就是:

答案:

0000? 0010 -》 02

0010 1001 -》? 29

0000 0000 -》? 00

0000 0000 -》? 00?

7. 結構體大小判別

分析:?

總大小是10B,最大對齊數是4,所以必須是4的倍數12B。

答案:

12字節?

8.聯合體的大小

union Un
{short s[7];int n;
};

分析:

? ? ? ? 聯合體的奧義是成員公用內存,所以s占用14個字節,n占用4個字節,此時14個字節夠用了,最后需要考慮最大對齊數是4,所以最終應該是4的倍數,16字節。

答案:

16

9.大小端字節序

注:32位cpu平臺

分析:

?首先聯合體是2B,這里分別訪問數組的第一個元素和第二個元素,這里其實就是給兩個字節填充數據;這里需要打印k變量,由于是兩個字節,這里就存在字節序大小端的問題,在vs編譯器中是采用小端存儲,即低字節存在低地址高字節存在高地址(倒著存)那么輸出就是0x3839(還原數據,先打印高地址再打印低地址)

?

答案:

3839?

10.枚舉選擇題

答案:

枚舉從0開始,依次遞增1,中途可以修改,再依次遞增1;

B?

11. 編程題:找出只出現一次的數字

一個數組中有兩個數字出現一次其余數字出現了兩次,找到這兩個只出現了一次的數字。

力扣原題

分析1:

暴力求解,每個元素都要對n個元素進行比較,如果標記到兩個元素相等cnt++,如果cnt是1,那么說明只和自己相等,那就是單獨的數字了。

代碼1:

#include<stdio.h>void find_dog(int arr[], int sz)
{for (int i = 0; i < sz; i++){int cnt = 0;for (int j = 0; j < sz; j++){if (arr[i] == arr[j]){cnt++;}}// cnt = 1的時候需要記錄下來if (cnt == 1) {printf("%d是單獨的數字!\n",arr[i]);}}
}int main()
{int arr[10] = { 1,2,3,4,5,1,2,3,4,6 };int sz = sizeof(arr) / sizeof(arr[0]);find_dog(arr, sz);return 0;
}

思路2:

? ? ? ? 可以利用異或的特性,兩個數字異或如果相同結果就是0,相異結果就是1,所以將這所有的數字全部異或,最后的結果一定不為0,我們假定最后異或出來的結果的最后一位是1,那么相當于最后一位是相異的,那么我們可以按照最后一位是0或者1將所有數字分成兩組,這兩組分別進行異或,就能得到最終相異的數字。

①所有數字異或得到不為0的結果。

②從結果中找到二進制的某一位是1。

③旨在按照此位進行分組,組內進行異或,最后的結果就是其中一個單獨的數字。

核心思想:按照根據異或的原理將兩個單獨的數字分別分為兩組,組內進行異或(其余數字都是成對,異或就是0),最終每組只剩下那個單獨的數字。

代碼2:

/*** Note: The returned array must be malloced, assume caller calls free().*/
int* singleNumber(int* nums, int numsSize, int* returnSize) 
{int sum = 0;int* ret = malloc(2 * sizeof(int));int pos = 0;int dog1 = 0;int dog2 = 0;for(int i = 0;i < numsSize;i++){// 1.全部異或得到一個數字sum ^= nums[i];}// 2. 根據這個數字的第n位為1進行分組// 3.計算第n位為1for(int i = 0;i < 32;i ++){if(((sum >> i)&1) == 1){pos = i;break;} }//4. 按照第pos位進行分組,組內進行異或for(int i = 0;i < numsSize;i++){if((nums[i] >> pos)&1 == 1){dog1 ^= nums[i];}else{dog2 ^= nums[i];}}ret[0] = dog1;ret[1] = dog2;*returnSize = 2;return ret;
}

12.atoi的實現

? ? ? ? 即字符串轉換成整數,例如“123456” -》 123456、“-123456” -》 -123456,遇到非數字的時候停止轉化,“-123abc456” -》 -123;

? ? ? ? 需要考慮以下幾點:

①空指針。assert判斷。

②空字符串。字符串只有\0,如果返回0,那就會和“0”產生歧義。

③空格。使用isspace判斷是否是空格,是空格那么str++跳過空格。

④+-號。定義一個正負號的變量,如果遇到+變量置為1,遇到-變量置為-1,最后返回只需要結果*flag即可。

⑤非數字字符。若字符串為123ABC,應該輸出123

正常處理:需要將每一位的數字轉換成整型,存入變量,接下來變量只需要*10 + 新這一位的數字即可。

⑥越界問題:當字符串內的數字非常大,此時就可能發生越界,此時我們需要判斷是正數越界還是負數越界

做到這里,我們可以將簡易版的代碼寫出:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
#include<ctype.h>
#include <limits.h>
// 判斷這個字符串是否合法
enum STATUS
{VALID,INVALID
}status = INVALID;int my_atoi(const char* str)
{// 正負標記int flag = 1;long long ret = 0;assert(str);// 空字符串,返回非法0if (*str == '\0'){return 0;}// 判斷空白字符,跳過while (isspace(*str)){str++;}// 遇到+-號if (*str == '+'){flag = 1;str++;}else if (*str == '-'){flag = -1;str++;}// 正常處理數字字符串while (*str != '\0'){if (isdigit(*str)) {ret = ret * 10 + flag * (*str - '0');// *str是字符,需要-字符'0'轉換成對應的數字// 判斷是否越界if (ret > INT_MAX || ret < INT_MIN) {status = INVALID;return 0;}}else{// 不是數字字符status = INVALID;return str;}str++;}// 沒有提前返回說明是正常處理完畢if(*str == '\0'){status = VALID;}return ret;
}int main()
{char arr[100] = "123456";int ret = my_atoi(arr);if (status == INVALID){printf("數字不合法!:%d\n", ret);}else if (status == VALID){printf("數字為:%d\n", ret);}return 0;
}

測試:

含非數字字符:

?

負數:?

溢出:

?

13.文件讀寫的選擇題(1)

B:getchar適用于標準輸入流。

14.看代碼說功能

統計文件的字符個數?

15.?文件讀寫的選擇題(2)

?

D:sprintf是把格式化的數據寫入字符串中。

16.預處理的選擇題

?C:鏈接階段會查找符號表,看這個函數是否存在。

17.預處理的分析題

判斷變量的類型

#define INT_PTR int*
typedef int* int_ptrINT_PTR a,b;
int_ptr c,d;

替換完畢后是:int *a,b,那么a是int*類型,b是int類型;

下面不一樣,把int*當做一個整體的類型,c,d都是int*類型。

18.feof函數的選擇題

A:錯誤,解析詳見B選項。

19.宏替換的選擇題(1)

答案:70

直接替換計算:?2*(4 + Y(5+1)),Y(5+1)是31。

20.宏替換的選擇題(2)

答案:B?

21.寫一個宏將一個整數的二進制位的奇數和偶數進行交換

思路:

? ? ? ? 假如紅色位置是偶數位,綠色位置是奇數位;將奇數位的數字全部拿出來,向右移動一位;同理將偶數位的數字都拿出來,向左移動一位,最后相加即可。?

? ? ? ? 怎么拿?以偶數位舉例,與一個偶數位都是1,奇數位都是0的32位數字即可。

?

#define SWAP_BIT(n) (((n&0x55555555)<<1) + ((n&0xaaaaaaaa)>>1))int main() 
{int n = 10;printf("%d\n", SWAP_BIT(n));return 0;
}

?這里用10進行測試,1010 -> 0101(5)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916753.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916753.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916753.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Blender入門筆記——建模篇(二)

前言 在數字建模的世界中&#xff0c;快捷鍵和高效的操作是提高工作效率的關鍵。本手冊為您提供了常用的建模快捷鍵及操作技巧&#xff0c;幫助您在各種建模軟件中更加得心應手。無論是進行點、線、面操作&#xff0c;還是調整視圖、切換模式&#xff0c;這些快捷方式都將成為…

sqlite3學習---基礎知識、增刪改查和排序和限制、打開執行關閉函數

目錄 一、數據庫基礎知識 1.分類 2.名詞 3.嵌入式數據庫 4.特點 5.sqlite3的安裝 5.1在線安裝 5.2編譯 5.3驗證是否安裝成功 5.4sqlite3的使用 6.創建一個數據庫 7.系統維護命令 二、數據庫的創建和刪除 1.創建一個表 1.1用法 1.2代碼示例 2.刪除一個表 2.1用…

Class24AlexNet

Class24AlexNet AlexNet AlexNet于2012年ImageNet 圖像識別挑戰賽&#xff08;ILSVRC-2012&#xff09;中以 top-5 錯誤率15.3%獲得冠軍&#xff0c;遠遠領先第二名。它首次在大型圖像數據集上證明了深層卷積神經網絡的強大能力。 AlexNet 的總體結構 AlexNet 總共有 8 層具有學…

枚舉中間位置高級篇

參考資料來源靈神在力扣所發的題單&#xff0c;僅供分享學習筆記和記錄&#xff0c;無商業用途。 核心思路&#xff1a;參考枚舉中間位置基礎篇-CSDN博客 力扣題單練習(靈神題單中摘取題目) 447. 回旋鏢的數量 核心思路&#xff1a; 因給出的點都不相同&#xff0c;所以不會…

主數據管理系統能代替數據中臺嗎?

目錄 一、主數據管理系統≠數據中臺 1. 主數據管理系統&#xff1a;管的是 “不變的核心數據” 2. 數據中臺&#xff1a;管的是 “流動中的價值” 二、為什么企業更該先建 MDM&#xff1f; 1. 數據中臺解決不了數據本身問題 2. MDM 可以解決常見的基礎問題 3. 數字化轉型…

Nmap 終極教程:安裝、常用命令及法律法規指南

Nmap 終極教程&#xff1a;安裝、常用命令及法律法規指南 Nmap&#xff08;Network Mapper&#xff09;是一款強大的 網絡掃描和安全審計工具&#xff0c;廣泛用于滲透測試、網絡探測和系統管理。本教程涵蓋 安裝方法、常用命令詳解、輸出解析 以及 法律法規注意事項&#xff…

開源嵌入式數組引擎TileDB的簡單使用

TileDB 是C編寫的存儲和訪問通用多維數組引擎&#xff0c;它的官方Github網站https://github.1git.de/TileDB-Inc/TileDB 1.下載源代碼和二進制庫 源代碼https://github.1git.de/TileDB-Inc/TileDB/archive/refs/tags/2.28.1.tar.gz 選擇符合你的機器CPU架構和操作系統的庫 二進…

AI對服務器行業的沖擊與啟示:從挑戰走向重構

更多云服務器知識&#xff0c;盡在hostol.comAI&#xff08;人工智能&#xff09;技術的迅猛發展&#xff0c;已深刻影響了多個行業&#xff0c;服務器行業亦不例外。在過去&#xff0c;服務器的主要任務是簡單地提供存儲、計算和傳輸數據的服務。然而&#xff0c;隨著AI的崛起…

基于三臺主機搭建 Web 服務環境:Nginx、NFS 與 DNS 配置全流程

基于三臺主機搭建 Web 服務環境&#xff1a;Nginx、NFS 與 DNS 配置全流程 一、引言 在當今數字化的時代&#xff0c;搭建一個穩定、高效的 Web 服務環境是許多開發者和運維人員的常見需求。本文將詳細介紹如何利用三臺主機搭建一個包含 Nginx、NFS 和 DNS 服務的 Web 環境&…

MySQL——MVCC

1.為什么需要MVCC在并發場景下&#xff0c;讀寫操作會面臨嚴重的沖突問題&#xff1a;1.讀操作如果遇到寫操作&#xff0c;要么“讀到未提交的臟數據”&#xff0c;要么“被寫操作阻塞&#xff08;等待鎖釋放&#xff09;”&#xff1b;2.寫操作如果遇到讀操作&#xff0c;要么…

數據結構第2問:什么是算法?

算法 算法是一組用于解決具體問題的、明確的、有序的步驟或規則&#xff0c;能夠在有限的時間內通過這些步驟得到問題的答案。 算法的5個重要特性&#xff1a; 有窮性&#xff1a;算法必須在有限的步驟內結束&#xff0c;不能無限循環&#xff0c;保證最終能夠得到結果。確定性…

12-大語言模型—Transformer 打地基,下游任務蓋出百樣房,指標來驗收|下游任務白話指南

目錄 1、核心邏輯&#xff1a;Transformer 的 “語言處理閉環” 2、轉導與感知 → 模型咋 “理解語言”&#xff1f; 2.1、 人類 vs 機器的 “語言理解邏輯” 2.2、 自注意力機制&#xff1a;模型 “理解語言” 的數學核心 2.2.1、通俗拆解 2.2.1.1、是什么&#xff1f; …

深入探索爬蟲與自動化腳本:釋放效率的利器

在當今信息爆炸的時代&#xff0c;高效獲取和處理數據已成為核心競爭力。爬蟲與自動化腳本正是解決這一痛點的關鍵技術——它們如同數字世界的勤勞助手&#xff0c;幫我們自動完成繁瑣重復的任務。下面我們來系統了解這兩項技術的核心要點、應用場景和最佳實踐。一、爬蟲與自動…

React函數組件的“生活管家“——useEffect Hook詳解

&#x1f3af; React函數組件的"生活管家"——useEffect Hook詳解 1. &#x1f31f; 開篇&#xff1a;從生活中的"副作用"說起 嘿&#xff0c;各位掘友們&#xff01;今天咱們來聊聊React函數組件里的一個“大管家”——useEffect Hook。你可能會問&#x…

python基礎:request請求Cookie保持登錄狀態、重定向與歷史請求、SSL證書校驗、超時和重試失敗、自動生成request請求代碼和案例實踐

Cookie保持登錄狀態cookie session鑒權機制 cookie是由web服務器保存在用戶瀏覽器&#xff08;客戶端&#xff09;上的小文本文件&#xff0c;他可以包含有關用戶的信息。無論何時用戶訪問到服務器&#xff0c;都會帶上該服務器的cookie信息&#xff0c;一般cookie都是有有效期…

Vulkan入門教程 | 第二部分:創建實例

前言&#xff1a;本教程為筆者依據教程https://docs.vulkan.net.cn/spec/latest/index.html#_about進行Vulkan學習并結合自己的理解整理的筆記&#xff0c;供大家學習和參考。 &#xff08;注意&#xff1a;代碼僅為片段&#xff0c;非完整程序&#xff09; 學習前提&#xff1…

PHP云原生架構:容器化、Kubernetes與Serverless實踐

引言 隨著云計算的普及,PHP應用也在向云原生架構演進。本文將深入探討PHP在云原生環境中的最佳實踐,包括容器化部署、Kubernetes編排、Serverless架構以及云原生監控與日志方案,幫助開發者構建現代化、可擴展的PHP應用。 容器化PHP應用 基礎Dockerfile優化 # 多階段構建…

【華為機試】5. 最長回文子串

文章目錄5. 最長回文子串描述示例 1示例 2示例 3示例 4提示解題思路方法一&#xff1a;中心擴展法&#xff08;推薦&#xff09;方法二&#xff1a;動態規劃方法三&#xff1a;Manacher算法方法四&#xff1a;暴力解法代碼實現復雜度分析測試用例完整題解代碼5. 最長回文子串 …

【圖像處理基石】如何對遙感圖像進行實例分割?

遙感圖像實例分割是指在遙感影像中&#xff0c;不僅要識別出不同類別的目標&#xff08;如建筑物、車輛、道路等&#xff09;&#xff0c;還要區分同一類別中的不同個體&#xff08;如建筑物1、建筑物2&#xff09;&#xff0c;并為每個實例生成精確的像素級掩碼。 一、遙感圖…

電子電氣架構 --- 軟件bug的管理模式

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 簡單,單純,喜歡獨處,獨來獨往,不易合同頻過著接地氣的生活,除了生存溫飽問題之外,沒有什么過多的欲望,表面看起來很高冷,內心熱情,如果你身…