حسین خسروی

وبلاگ دانشگاهی حسین خسروی، عضو هیات علمی دانشگاه صنعتی شاهرود

حسین خسروی

وبلاگ دانشگاهی حسین خسروی، عضو هیات علمی دانشگاه صنعتی شاهرود

حسین خسروی

باتوجه به محدودیتهای صفحه شخصی موجود در سایت دانشگاه، این بلاگ را راه اندازی کردم.
اطلاعیه های مربوط به دروسی که تدریس می کنم و تمرینها در این وبلاگ قرار خواهد گرفت.
برای آگاهی از مطالب مربوط به هر درس، در قاب زیر (طبقه بندی موضوعی) روی نام درس کلیک کنید.

پیوندهای روزانه

۱۹ مطلب با موضوع «برنامه نویسی C» ثبت شده است

  • ۰
  • ۰

1-4 ماشین حساب با استفاده از switch-case

ماشین حساب ساده

می خواهیم شبیه تمرین سری اول، یک ماشین حساب بسازیم به این ترتیب که کاربر یک عملگر ( + - * / %) و دو عدد اعشاری وارد می کند و شما باید با switch-case نتیجه عملیات را نشان دهید. اگر عملگر اشتباه وارد شد، پیام مناسب داده و دوباره داده ها را دریافت کنید. برای شروع، می توانید از تکه کد زیر استفاده کنید:

    char operator;
    printf("Enter an operator (+, -, *, /, %): ");
    scanf("%c", &operator);

-------------------------------------------------------------------------------

2-4 کار با عملگرهای بیتی

bitwise operators - عملگرهای بیتی

برنامه ای بنویسید که یک عدد صحیح 16 بیتی (short) دریافت کرده و عملیات زیر را روی آن انجام دهد:

الف) آن را با اعداد (0x00FF و 0xFF00) AND کند. (عملگر AND بیتی & است)

ب) آن را با اعداد (0x00FF و 0xFF00) OR کند. (عملگر OR بیتی | است)

ج) آن را به اندازه هشت بیت به سمت راست شیفت دهد. (عملگر شیفت به راست << است. البته این عملگر را از اینجا کپی نکنید چون برعکس تایپ شده تا در وبلاگ درست دیده شود!) مثلا برای شیفت عدد y به اندازه 8 بیت به یکی از دو صورت زیر عمل می کنیم:

y = y >> 8;

y >>= 8;

د) آن را به اندازه هشت بیت به سمت چپ شیفت دهد. (عملگر شیفت به چپ >> است.)

ه) در انتها نیبل پایین و نیبل بالای عدد ورودی را به کمک چهار بخش قبلی حساب کرده و نمایش دهید. منظور از نیبل پایین و بالا یعنی 8 بیت کم ارزش و باارزش؛ مثلا برای عدد 0x64E5 نیبل پایین برابر است با E5 و نیبل بالا برابر است با 64


تمام نتایج را ترجیحا در قالب جدول نشان دهید.

موعد تحویل: 6 آذر

  • حسین خسروی
  • ۰
  • ۰

1. کار با توابع

1. برنامه‌ای شامل سه تابع به شرح زیر بنویسید:
‌أ.    تابع اول با نام ReverseNumber که یک عدد صحیح با تعداد ارقام نامعلوم دریافت کرده و معکوس آن را برگرداند مثلا به ازای 123456 باید عدد 654321 را برگرداند. (دقت کنید که عدد دریافت کند نه رشته. ضمنا تابع باشد نه اینکه داخل main یک برنامه بنویسید)

‌ب.    تابع دوم با نام ToUpper که یک رشته (char *) دریافت کرده و رشته متناظر آن با حروف بزرگ را برگرداند. مثلا اگر عبارت Peace Upon You O Aba-Abdellah  را بدهیم باید عبارت PEACE UPON YOU O ABA-ABDELLAH را تحویل دهد.

‌ج.    تابع سوم با نام Sort که یک آرایه‌ی اعشاری و طول آن را دریافت کرده و آن را از بزرگ به کوچک مرتب کند. دقت کنید که این تابع خروجی ندارد و در واقع خود آرایه ورودی را تغییر می دهد. امضای تابع می تواند به یکی از دو صورت زیر باشد:

void Sort(double* data, int length);
void Sort(double data[], int length);


(نکته: این سه تابع را باید قبل از main تعریف کنید یا اینکه امضای آنها را قبل از main و بدنه آنها را بعد از main تعریف کنید)
در قسمت main برنامه ای بنویسید که ابتدا یک عدد گرفته و به کمک تابع اول، معکوس آن را برگرداند، سپس یک رشته دریافت کرده و به کمک تابع دوم آن را به حروف بزرگ تبدیل کرده و نمایش دهد و در انتها یک آرایه‌ی 5 تایی گرفته و آن را مرتب کرده و نمایش دهد.

2. پیاده سازی تابع میانگین متحرک (Moving Average)

تابعی با نام smooth بنویسید که یک آرایه و طول آن را به عنوان ورودی بگیرد و عناصر آرایه را با تغییر دهد به این ترتیب که به جای عنصر k ام، میانگین سه عنصر (k-1, k, k+1) را جایگزین کند. این تابع هم خروجی ندارد و در واقع داده های خود آرایه ورودی را عوض می کند:

void Sort(double* data, int length);
void Sort(double data[], int length);
به عنوان مثال اگر آرایه ورودی به صورت زیر باشد:
{10, 15, 11, 9, 8}
خروجی زیر حاصل می شود (عنصر اول و آخر تغییر نمی کند):

{10, (10+15+11)/3, (15+11+9)/3, (11+9+8)/3, 8}


تابع میانگین متحرک Moving Average Function

تابع میانگین متحرک Moving Average Function


حالا برنامه ای بنویسید که آرایه عددی A را از فایل (data.txt) بخواند و تابع smooth راروی آنها اجرا کند و در نهایت در فایل دیگری (output.txt) آرایه های تغییر یافته را ذخیره کند.
اگر با متلب یا اکسل می توانید کار کنید، این دو آرایه را قبل و بعد از اعمال smoothing ترسیم کنید (در متلب با دستور plot).

موعد تحویل 1 آذر ماه

  • حسین خسروی
  • ۰
  • ۰

لیست پروژه هایی که چند هفته قبل در کلاس مطرح شد، را از فایل زیر دانلود کنید:

پروژه های برنامه نویسی

  • حسین خسروی
  • ۰
  • ۰

تمرین سری هفتم درس مبانی برنامه‌نویسی

1.    برنامه ‌ای بنویسید که یک رشته را در یک فایل جستجو کرده و با رشته‌ی دیگری تعویض کند. نتیجه در فایل دیگری ذخیره شود. برنامه باید 4 کلید داشته باشد:
•    in- برای دریافت نام فایل ورودی،
•    out- برای دریافت نام فایل خروجی،
•    src- برای کلمه مورد جستجو
•    dst- برای کلمه جایگزین
برای مثال جهت اصلاح کلمه univercity از فایل input.txt با کلمه university در فایل output.txt باید به صورت زیر عمل کنیم:

>> Replace –in  input.txt –out output.txt -src univercity –dst university
>> Operation completed successfully; 21 matches found.

در مثال فوق 21 بار عبارت univercity یافت شده است.
اگر فایل ورودی وجود نداشت یا فایل خروجی را نتوانستید ایجاد کنید باید پیغام مناسب ذکر شود.

راهنمایی

برای کار با فایل متنی از توابع fopen, fprintf, fscanf, fgets کمک بگیرید. برای جستجوی رشته هم از strstr استفاده کنید.

روش تهیه و ارسال تمرینها

  • یک فایل word ایجاد کنید و کد نوشته شده به همراه یک نمونه اجرای برنامه را در آن قرار دهید (از خروجی برنامه با فشردن هم‌زمان دکمه‌های Alt و Print Screen عکس بگیرید و داخل فایل word کپی کنید).
  • به پوشه پروژه ای که ایجاد کرده اید رفته و فایلهای با پسوند c, cpp, h, cbp, vcxproj را در پوشه ای با نام خودتان (مثلا HosseinKhosravi) کپی کنید (پوشه‌های Debug و Release و ipch را نباید اضافه کنید).
  • فایل word را هم در همان پوشه کپی کنید و سپس پوشه را zip کنید.
  • اگر مراحل فوق درست انجام شده باشد فایل zip شده باید حجمی کمتر از 200 کیلوبایت داشته باشد. این فایل را به آدرس استاد حل تمرین بفرستید
  • عنوان ایمیل (subject) حتما شامل عبارت C_HW_03 باشد.

موعد تحویل: 7 دی ماه

  • حسین خسروی
  • ۰
  • ۰

1.    با استفاده از ساختار، برنامه ‌ای بنویسید که ابتدا یک دستور read یا write از کاربر دریافت کند و کارهای زیر را انجام دهد:
•    اگر دستور write دریافت شد: اطلاعات تعدادی دانشجو شامل: شماره دانشجو، نام و نام خانوادگی، سال تولد و معدل دیپلم را گرفته و در انتهای یک فایل متنی با نام Students.txt ذخیره کند. هرگاه شماره دانشجویی عدد منفی وارد شد، فایل را ببندد و از برنامه خارج شود. دقت کنید که اطلاعات قبلی موجود در فایل نباید پاک شود (به جای wt از at استفاده کنید)
•    اگر دستور read دریافت شد: فایل متنی Students.txt را خوانده و اطلاعات آن را در یک آرایه یا اشاره گر از نوع ساختاری که تولید کرده اید، بارگذاری کند و به صورت جدول به کاربر نشان دهد.
•    استثنائات را مدیریت کنید: مثلا اگر فایل تهی بود، یا معدل خارج از محدوده 0 و 20 بود یا سال تولد بیش از 1380 بود، خطا گزارش کند.

موعد تحویل: 30 آذر

  • حسین خسروی
  • ۰
  • ۰

این ویدیو توضیحات مثال قبلی است که متاسفانه کیفیت صدای آن در برخی لحظات خوب نیست. برخی فریمها هم ناقص ضبط شده اند.

  • حسین خسروی
  • ۰
  • ۰

این مثال دو بخش دارد، یکی ایجاد پایگاه داده از اطلاعات کتابها و نوشتن آنها در فایل باینری book_data.db و بخش دوم شامل خواندن اطلاعات از همین فایل و نمایش آنها. ویدیوی ضبط شده مربوط به این مثال در پست بعدی منتشر می شود.


#include "stdafx.h"
#include <iostream>

struct BookInfo
{
	char name[30];
	char author[30];
	int  nPage;
	float price;
	int year;
};

void CreateDatabase()
{
	printf("To start, enter number of books you want to store in the database\n");
	int n = 0;
	scanf_s("%d", &n);
	printf("Please enter Book information for %d books as follows\n", n);
	printf("Name, Author, Pages, Price, Year of Publication\n");

	BookInfo *books = new BookInfo[n];
	for (int i = 0; i < n; i++)
	{
		std::cin.ignore();
		printf("\n#%d Name: ", i + 1);
		gets_s(books[i].name, 30);
		printf("\n#%d Author: ", i + 1);
		gets_s(books[i].author, 30);
		printf("\n#%d Pages: ", i + 1);
		scanf_s("%d", &books[i].nPage);
		printf("\n#%d Price: ", i + 1);
		scanf_s("%f", &books[i].price);
		printf("\n#%d Year: ", i + 1);
		scanf_s("%d", &books[i].year);
	}
	FILE* fp = 0;
	fopen_s(&fp, "book_data.db", "wb");
	if (!fp)
	{
		printf("File can't be oppened.\n");
		return;
	}

	fwrite(books, sizeof(BookInfo), n, fp);
	fclose(fp);

	printf("Data saved successfully\n");
}

void ReadDatabase()
{
	int n = 2;

	BookInfo *books = new BookInfo[n];

	FILE* fp = 0;
	fopen_s(&fp, "book_data.db", "rb");
	if (!fp)
	{
		printf("File can't be oppened.\n");
		return;
	}

	fread(books, sizeof(BookInfo), n, fp);
	for (int i = 0; i < n; i++)
	{
		printf("\n#%d Name: %s", i + 1, books[i].name);

		printf("\n#%d Author: %s", i + 1, books[i].author);

		printf("\n#%d Pages: %d", i + 1, books[i].nPage);

		printf("\n#%d Price: %.1f", i + 1, books[i].price);

		printf("\n#%d Year: %d", i + 1, books[i].year);

		printf("\n--------------------------------------------");
	}

	fclose(fp);
	delete[] books;
}

int main()
{
	printf("Welcome to Book Database Application:\n");
	bool create_data = false; //change to false for read mode

	if (create_data)
		CreateDatabase();
	else
		ReadDatabase();

	getchar();
    return 0;
}
  • حسین خسروی
  • ۰
  • ۰

در این مثال نحوه ایجاد فایل باینری و توابع نوشتن و خواندن (fread, fwrite) توضیح داده شده و یک فایل حاوی صد عدد اعشاری به دو صورت باینری و متنی ساخته شده و مقایسه می شوند:


  • حسین خسروی
  • ۰
  • ۰

در این مثال نحوه ایجاد فایل متنی، نوشتن در و خواندن از آن را خواهید دید. دو نوع فایل اسکی و یونیکد بررسی می شود:


  • حسین خسروی
  • ۰
  • ۰

مثالهایی از تابع که در کلاس بیان شد را از این آدرس دانلود کنید.

موارد مطرح شده: بررسی چند مثال ساده از توابع شامل محاسبه بیشینه، کمینه و میانگین یک آرایه. همچنین پیاده سازی تابع فاکتوریل و دنباله فیبوناچی با استفاده از توابع بازگشتی و غیربازگشتی. نحوه ایجاد کتابخانه با استفاده از فایلهای header و cpp

ویدیوی ضبط شده در کلاس به دلیل تنظیم نامناسب میکروفون، کیفیت صدای مناسبی ندارد اما به کارتان می آید:


  • حسین خسروی